HashMap 이란? HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다. Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있습니다. Map은 키와 값으로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조입니다. 여기서 키와 값은 모두 객체입니다. 값은 중복 저장될 수 있지만 키는 중복 저장될 수 없습니다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치됩니다. HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보입니다. 위 그림과 같이 HashMap은 내부에 '키'와 '값'을 저장하는 자료 구조를 가지고 있습니다. HashMap은 해시 함수..
TreeSet이란? JDK 1.2부터 제공되고 있는 TreeSet은 HashSet과 마찬가지로 Set 인터페이스를 구현한 클래스로써 객체를 중복해서 저장할 수 없고 저장 순서가 유지되지 않는다는 Set의 성질을 그대로 가지고 있습니다. 하지만 HashSet과는 달리 TreeSet은 이진 탐색 트리(BinarySearchTree) 구조로 이루어져 있습니다. 이진 탐색 트리는 추가와 삭제에는 시간이 조금 더 걸리지만 정렬, 검색에 높은 성능을 보이는 자료구조입니다. 그렇기에 HashSet보다 데이터의 추가와 삭제는 시간이 더 걸리지만 검색과 정렬에는 유리합니다. TreeSet은 데이터를 저장할 시 이진탐색트리(BinarySearchTree)의 형태로 데이터를 저장하기에 기본적으로 nature ordering..
HashSet이란? HashSet은 Set 인터페이스의 구현 클래스입니다. 그렇기에 Set의 성질을 그대로 상속받습니다. Set은 객체를 중복해서 저장할 수 없고 하나의 null 값만 저장할 수 있습니다. 또한 저장 순서가 유지되지 않습니다. 만약 요소의 저장 순서를 유지해야 한다면 JDK 1.4부터 제공하는 LinkedHashSet 클래스를 사용하면 됩니다. Set 인터페이스를 구현한 클래스로는 HashSet과 TreeSet이 있는데 HashSet의 경우 정렬을 해주지 않고 TreeSet의 경우 자동정렬을 해준다는 차이점이 있습니다. Set의 가장 큰 장점은 중복을 자동으로 제거해준다는 점입니다. 만약 한 편의점에서 오늘 방문한 손님의 총숫자를 계산하고 싶을 경우도 있을 것입니다. 이럴 경우 오늘 하루..
Vector란? Vector는 ArrayList와 동일한 내부구조를 가지고 있습니다. ArrayList와 마찬가지로 Vector내부에 값이 추가되면 자동으로 크기가 조절되며 그다음 객체들은 한 자리씩 뒤로 이동됩니다. 하지만 모든 것이 다 똑같은 것은 아니고 Vector와 Arraylist의 한가지 다른 점이 있는데 Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드들이 실행할 수 있습니다. 그래서 멀티 스레드 환경에서 안전하게 객체를 추가하고 삭제할 수 있습니다. Vector의 단점 (ArrayList와의 비교) 벡터는 항상 동기화되는 장점이자 단점을 가지고 있습니다. 스레드가 1개일때도 동기화를 하기..
LinkedList란? 연결 리스트(LinkedList)는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식의 자료구조입니다. 데이터를 담고 있는 노드들이 연결되어 있고, 노드의 포인터가 이전 노드와 다음 노드와의 연결을 담당합니다. Node는 LinkedList에 객체를 추가하거나 삭제하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않습니다. 중간에 데이터를 추가나 삭제하더라도 전체의 인덱스가 한 칸씩 뒤로 밀리거나 당겨지는 일이 없기에 ArrayList에 비해서 데이터의 추가나 삭제가 용이하나, 인덱스가 없기에 특정 요소에 접근하기 위해서는 순차 탐색이 필요로 하여 탐색 속도가 떨어진다는 단점이 있습니다. 그러므로 탐색 또는 정렬을 자주 하는 경우엔 배열을 사용하고 데이터의 추가/삭제..
컬렉션 프레임워크란? 배열을 사용하다 보면 여러가지 비효율적인 문제가 생깁니다. 가장 큰 문제점은 크기가 고정적이라는 것입니다. 배열의 크기는 생성할 때 결정되며 그 크기를 넘어가게 되면 더이상 데이터를 저장할 수 없습니다. 또 데이터를 삭제하면 해당 인덱스의 데이터는 비어있어 메모리가 낭비되는 등 여러 문제점들이 발생합니다. 그렇기에 자바는 배열의 이러한 문제점을 해결하기 위해, 널리 알려져 있는 자료구조를 바탕으로 객체나 데이터들을 효율적으로 관리(추가, 삭제, 검색, 저장)할 수 있는 자료구조들을 만들어 놓았습니다. 이러한 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 합니다. 대표적으로는 List, Set, Map, Stack, Queue 등이 있습니다. List 컬렉션 컬렉션 프레임워크를 ..
자바에서 배열이나 리스트를 정렬하려고 한다면 java.util.Arrays 클래스의 sort() 메서드를 사용하시면 따로 정렬 로직을 짜지 않아도 한번의 메소드 호출로 간편하게 배열이나 리스트를 정렬할 수 있습니다. Arrays클래스는 배열의 복사, 항목 정렬, 검색과 같은 배열을 조작 기능을 가지고 있습니다. 배열의 오름차순 정렬 Arrays.sort()메서드의 매개값으로 기본 타입 배열이나 String배열을 지정해주면 자동으로 오름차순 정렬이 됩니다. 기본타입 배열 오름차순 정렬 import java.util.Arrays; public class Sort{ public static void main(String[] args) { int arr[] = {4,23,33,15,17,19}; Arrays.s..
자바에서 객체를 복사하는 유형으로 깊은 복사와 얕은 복사가 있습니다. 깊은 복사의 경우 객체의 실제값을 새로운 객체로 복사하는 것이고 얕은 복사는 단순히 객체의 주소 값만을 복사하는 것입니다. 이 두가지 방식은 각각의 장단점이 있습니다. 먼저 얕은 복사의 경우 여러 객체가 같은 주소를 참조하기 때문에 하나의 값을 변경해버리면 다른 대상의 값 또한 바뀌어 버리는 문제 등이 발생합니다. 하지만 깊은 복사의 경우 실제로 대상이 두개가 생기므로 이러한 문제에서는 자유로울 수 있겠습니다. 반대로 메모리 측면에서 본다면 한 객체로 할 수 있는 일은 하나로 끝내는것이 좋습니다. 쓸데없이 두개 세개가 되면 그야말로 메모리 측면에서 본다면 비효율적이게 됩니다. 이렇듯 얕은 복사로 객체가 복사된다면 실제로는 하나의 주소 ..
래퍼 클래스란(Wrapper Class)? 자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어집니다. 대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고 참조 타입은 class, interface 등이 있는데 프로그래밍을 하다 보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있습니다. 이럴 때에 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라고 합니다. 자바는 모든 기본타입(primitive type)은 값을 갖는 객체를 생성할 수 있습니다. 이런 객체를 포장 객체라고도 하는데 그 이유는 기본 타입의 값을 내부에..
자바에서는 문자열을 다루는 클래스로 String, StringBuffer, StringBuilder이라는 3가지 클래스가 있습니다. 위 3가지 클래스는 모두 문자열을 저장하고 관리하는 클래스이며 각 클래스 간에는 조금의 차이가 있습니다. String과 StringBuffer, StringBuilder의 차이점 String 객체는 한번 생성되면 할당된 공간이 변하지 않지만 StringBuffer나 StringBuilder의 경우 객체의 공간이 부족해지는 경우 버퍼의 크기를 유연하게 늘려줍니다. 이러한 특징을 일컬어 String은 불변(immutable)하고 StringBuffer와 StringBuilder는 가변(mutable)하다라고 합니다. StringBuffer와 StringBuilder의 차이점 S..
자바에서 배열의 길이를 구하고 싶을떄는 length()이라는 메소드를 사용합니다. length() 메소드는 Static으로 이루어져 있어 Import나 클래스 선언 없이 바로 사용이 가능합니다. 문자열 길이 구하기 public class len { public static void main(String[] args) { String s = "abcdefg"; int s_len = s.length();//길이 구하기 System.out.println("문자열길이 : " + s_len); } } length() 메소드는 문자열의 길이를 리턴해줍니다. 문자열 길이 제한하기 import javax.swing.JOptionPane; public class len { public static void main(St..
프로그래밍을 하다보면 특정 문자열에서 원하는 문자가 포함되어 있는지 확인해야하는 소스를 넣을때가 종종 있습니다. 문자열을 찾는 방법은 String클래스의 indexOf(), contains(), matches()메소드를 활용하여 찾을 수 있습니다. 다만 그 용도에 따라서 3가지의 메소드가 조금 다릅니다. indexOf( ) ,contains( ),matches( )의 메소드의 사용용도 메소드 사용처 indexOf() 대상 문자열에서 찾고자 하는 문자의 index값을 찾고싶을때 contains() 대상 문자열에서 찾고자 하는 문자열이 포함되어있는지 여부를 알고 싶을때 matches() 대상 문자열에서 정규표현식(숫자, 영문자, 한글)등이 포함되어있는지 여부를 알고 싶을때 indexOf( )을 활용하여 문자..
자바에서 특정값의 제곱근(루트)을 구하려면 java.lang.Math 클래스의 sqrt()메소드를 사용하면 됩니다. java.lang.Math 클래스는 수학 계산에 사용할 수 있는 메소드를 제공하고 있습니다. Math 클래스가 제공하는 메소드는 모두 정적이므로 Import나 Math클래스 선언 없이 바로 사용이 가능합니다. 제곱근(루트) 구하기 public class Sqrt { public static void main(String[] args) { double result = Math.sqrt(25); //25의 제곱근 System.out.println("25의 제곱근 : "+ result); } } Math.sqrt() 메소드는 입력값과 출력값은 모두 double형이며 Math.sqrt(대상숫자)를..