자바 collection 프레임워크
배열은 크기가 고정되어 있고 객체를 삭제했을 대 해당 인덱스가 비고 새로운 객체를 저장할 때 어디가 비는지 확인해야하는 과정들을 거쳐야 하는 경우가 있다.
자바는 이러한 문제점을 해결하기 위해서 우리가 알고있는 자료구조를 바탕으로
객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스들을 포함시켜 놓았다. 이들을 총칭해서 컬렉션 프레임워크라고 한다.
List 컬렉션
- ArrayList
- 배열은 생성할 때 크기가 고정되고 사용 중에 크기를 변경할 수 없지만, ArrayList 는 저장용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어난다.
- 기본 생성자로 객체를 생성하면 내부에 10개의 객체를 저장할 수 있는 초기 용량을 가지게 된다.
- 만약 순차적으로 삽입과 삭제가 일어나는 경우라면 ArrayList 를 사용하는게 좋지만 중간에 삽입하는 경우가 많다면 LinkedList 를 사용해야 한다.
- LinkedList 에 비해 검색이 빠르다
- Vector
- 동기화된 메소드로 구성되어 있기 때문에 Thread Safe 하다
- LinkedList
- 인접 참조를 링크해서 체인처럼 관리한다.
- 중간에 추가/삭제가 ArrayList 보다 빠르다.
- 검색이 ArrayList 보다 느리다.
Set 컬렉션
- HashSet
- 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않는다.
- HashSet 이 동일한 객체인지를 판단하는 기준은 Object 가 가지고 있는 hashCode() 메소드를 사용한다. 만약hashCode()가 같다면 equals() 리턴값을 마지막으로 비교한다.
- hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지고 있다.
- 만약 어떤 필드에 값이 같아도 중복저장하고 싶지 않다면 해당 객체에서 equals() 와 hashCode() 메소드를 오버라이딩 하면 된다.
Map 컬렉션
키와 값으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. 여기서 키와 값은 모두 객체이다. 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다. 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.
- HashMap
- 여기서 말하는 Hash 도 HashSet 과 마찬가지로 Key 의 값이 동일한지 아닌지를 관리한다.
- 키와 값의 타입은 원시 기본타입을 사용할 수 없고 클래스 및 인터페이스 타입만 가능하다.
- HashTable
- HashMap 과 동일한 내부 구조를 가지고 있다. HashTable도 키로 사용할 객체의 hashCode() 와 equals() 를 이용한다.
- HashTable 은 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수는 없다.
- Properties
- HashTable 의 하위클래스
- 키와 값을 String 타입으로 제한한 컬렉션이다
- 애플리케이션의 옵션 정보, 데이터베이스 연결 정보 다국어 정보가 저장된 프로퍼티 파일을 읽을 때 주로 사용한다.
- 프로퍼티 파일은 키와 값이 = 기호로 연결되어 있는 텍스트 파일로 ISO 8859-1 문자셋으로 저장된다. 이 문자셋으로 직접 표현할 수 없는 한글은 유니코드로 변환되어 저장된다.
TreeSet 과 TreeMap
두개의 컬렉션은 이진 트리 ( binary tree ) 를 이용해서 계층적 구조 ( Tree 구조 ) 를 가지면서 객체를 저장한다.
- 이진 트리
- 이진 트리는 여러 개의 노드가 트리 형태로 연결된 구조로, 루트 노드라고 불리는 하나의 노드에서 부터 시작해서 각 노드에 최대 2개의 노드를 연결할 수 있는 구조를 가지고 있다.
- Comparable 과 Comparator
- TreeSet 과 TreeMap 의 키는 저장과 동시에 자동 오름차순으로 정렬되는데, 숫자 타입일 경우에는 값으로 정렬하고, 문자열 타입일 경우 유니코드로 정렬한다.
- TreeSet 과 TreeMap 은 정렬을 위해 java.lang.Comparable 을 구현한 객체를 요구하는데, Integer Double String 모두 Comparable 인터페이스를 구현하고 있다.
- 즉 사용자 정의 클래스도 Comparable 을 구현한다면 자동 정렬이 가능하다.
- TreeSet 의 객체와 TreeMap 의 키가 Comparable 을 구현하고 있지 않을 경우에는 저장하는 순간 ClassCastException 이 발생한다.
- 생성자의 매개값으로 인터페이스 정렬자 ( Comparator ) 를 제공하면 정렬이 가능하다.
- TreeSet
- 이진 트리를 기반으로한 Set 컬렉션이다. 하나의 노드는 노드값인 value와 왼쪽과 오른쪽 자식 노드를 참조하기 위한 두 개의 변수로 구성된다.
- 인터페이스 선언시 Set<E> 를 사용해도 되지만 TreeSet<E> 를 사용하면 해당 인터페이스의 메소드를 이용할 수 있다.
- TreeMap
- TreeSet 과의 차이점은 키와 값이 저장된 Map.Entry 를 저장한다는 점이다. TreeMap 에 객체를 저장하면 자동으로 정렬되는데, 기본적으로 부모 키값과 비교해서 키 값이 낮은 것은 왼쪽 자식 노드에, 키 값이 높은 것은 오른쪽 자식 노드에 Map.Entry 객체를 저장한다.
Stack 과 Queue
- 자바의 LIFO 와 FIFO 자료구조를 제공하기 위한 컬렉션
'개발 > java' 카테고리의 다른 글
JPA 락 (0) | 2020.04.25 |
---|---|
JPA 기초 프록시란 무엇인가 (0) | 2020.04.12 |
heap 메모리와 Garbage Collector (1) | 2020.03.21 |
spring 에서 pageable custom 구현 (0) | 2019.12.19 |
java 복잡한 Comparator 예제 (0) | 2019.12.19 |
댓글