Collection Framework
Collection Framework란 이름을 뜯어보면
- Collection : 다수의 데이터
- Framework : 표준화된 프로그램 뼈대
즉, 다수의 데이터를 다루기 위한 표준화된 틀이다.
공식문서에서는?
오라클 공식문서에서는 Collection Framework를 이렇게 설명한다.
A collections framework is a unified architecture for representing and manipuliating collections.
컬렉션 프레임워크는 컬렉션(다수의 데이터)를 표현하고 조작하기 위한
통합 구조(아키텍처)이다.
쉽게 말해서, 자료구조를 정리해서 모아놓은 모음집이다.
장점
그렇다면 자료구조를 직접 구현해서 사용할 수도 있는데 자바의 Collection Framework를 사용하면 장점이 무엇일까?
이 역시 공식문서에 포함된 내용을 간략하게 작성해본다.
- 프로그래밍 작성 노력을 줄인다
- 최적화된 구조를 통해 향상된 성능을 기대할 수 있다
- 관련되지 않은 API 간의 상호운용성을 제공한다
- API 학습에 필요한 노력을 줄인다
- API를 설계하고 구현하는 노력을 줄인다
- SW의 재사용을 할 수 있다
상속 계층도

상속 계층도를 보면 Map 자료구조는 Collection Framework에는 포함되지만 Collection 인터페이스에는 포함되지 않는다.
그 이유는
- Collection 인터페이스는
Collection<E>와 같이 단일 요소를 다루지만 Map 인터페이스는 Map<K, V>와 같이 키와 값의 쌍으로 두 개의 요소를 다룬다.
- Collection 인터페이스는
add(), remove(), contains() 와 같은 메서드를 제공하는 반면,
Map 인터페이스는 put(), get() 과 같은 메서드를 제공하기에 API의 일관성이 깨져 사용자에게 혼란을 줄 수 있기 때문이다.
Iterable
컬렉션 인터페이스의 최상위 인터페이스이다.
이 인터페이스를 구현한 클래스는 내부의 요소들을 순회할 수 있는 기능을 제공해야 한다.
제공 메서드
Iterator<T> iterator()
- 유일한 추상메서드이고, Iterator 인터페이스를 반환시켜 순회할 수 있게 하는 메서드를 제공
default void forEach(Consumer<? super T> action)
- 이 메서드 때문에 Iterable 을 구현한 객체는 향상된 for 문을 사용이 가능함
default Spliterator<T> spliterator()
- 분할하는 기능을 가진 iterator
- 병렬 처리를 위한 메서드
Collection
List, Queue, Set 의 상위 인터페이스로 컬렉션 프레임워크의 실질적인 최상위 타입이다.
하위 자료구조들의 공통된 메서드가 될 수 있는 add(), contains(), remove()가 선언되어 있지만 요소를 가져오는 get() 메서드는 포함하지 않는다.
그 이유는 자료구조마다 특성이 다르기 때문에 요소를 가져오는 방식이 일관되지 않기 때문이다. (말 그대로 구조의 차이나 순서의 보장 같은 차이 때문에)
List
- 저장 순서가 유지되는 컬렉션을 사용하기 위한 자료구조
- 요소의 중복을 허용
List와 배열의 차이는 크기의 가변성에 있음
List : 자료형의 크기가 가변적
- 배열 : 자료형의 크기가 고정적
- 인덱스(position)으로 요소에 접근 가능, 원하는 위치에 요소 조작 가능
ArrayList
이름에서 알 수 있듯 배열의 특성을 가지는 List의 구현체이다.

- 실제 배열을 이용하여 만든
List
- 데이터의 개수에 따라 배열의 크기가 변경됨
- Index를 사용하기 때문에 조회가 빠름
- 배열의 단점과 같이 중간 부분에 삽입/삭제가 느림
LinkedList

Node 객체를 만들고 이를 연결하여 만든 리스트
- 데이터의 중간 삽입/삭제가 빠름
- 순차적 접근 때문에 임의의 요소에 대한 검색은 ArrayList 보다 느림
- 자바의 연결리스트는 양방향 리스트 구조로 구현됨됨
Vector
ArrayList와 비슷하게 구현된 객체
- 컬렉션 프레임워크가 생기기 전 사용했음
- 구버전와의 호환성을 위해 존재, 현재는 사용되지 않음
- ArrayList와의 차이는 동기화가 되어있어 Thread-Safe
- 다만, 동기화가 필요한 리스트에는
Vector가 아닌 Collections.synchronizedList()를 사용
Stack
Vector 인터페이스를 구현한 객체
- 후입선출 구조를 가진 자료구조
- List의 특성을 가지는
Vector를 구현했기 때문에 API에 문제가 있어 사용하지 않음
- synchronized 처리로 인한 성능 저하
Vector가 상속하는 메서드로 인한 후입선출 구조 위반 - add(int index, E element)
- stack 자료구조는 일반적으로
ArrayDeque 객체를 이용
Queue

- 선입선출 특성을 가지는 자료구조
- 자바에서
Queue는 인터페이스이고 여러 구현체를 선택해 사용
PriorityQueue
- 이름 그대로 요소들이 우선순위를 가지는 큐
- 우선 순위가 높은 순으로 정렬되고 꺼내짐
- 작업 스케줄링같이 우선 순위에 따라 배치해야 할 때 사용
- 정렬을 위해서는 요소 간 비교가 필수이므로, 요소 객체는 무조건
Comparable 인터페이스를 구현하거나 Comparator의 메서드를 재정의해야 함

- 배열을 사용하여 요소를 저장하며, 힙 형태로 저장
Deque

- Double-Ended Queue로, 양쪽으로 넣고 빼기가 가능한 큐
- 기본적으로
Queue 인터페이스를 상속했기 때문에 큐로 사용할 수도 있고, 한 쪽 방향으로 넣고 빼고가 다 가능하기에 Stack 으로도 사용 가능
ArrayDeque
Deque의 구현 객체
- 용량 제한이 없고 필요 시 자체적으로 용량을 증가시킴
- 스택을 사용할 때는
Stack보다 빠르고, 큐로 사용할 때는 LinkedList보다 빠른 성능
Set
- 데이터의 중복을 허용하지 않는 집합 자료구조
- 순서 자체가 없어서 요소를 가져오는 메서드인
get()이나 get(index)가 없음
HashSet
- Hash을 사용한
Set의 구현 객체
- 해싱을 사용하기에 검색 속도가 매우 빠름



- HashSet은 내부적으로 HashMap을 생성해서 사용
Map 자료구조 특징인 Key 의 중복을 허용하지 않는다는 특징을 이용
- Map<K, V>의 V 부분에 더미 데이터를 넣음
LinkedHashSet
- 순서를 가지는 Set 자료
- 요소의 삽입 순서를 기억하고 저장
SortedSet
TreeSet
- Set 자료구조처럼 중복을 허용하지 않고 순서를 가지지 않는 것은 동일
- 대신 데이터를 정렬하여 저장하는 특징이 있음
- 이진 검색 트리 자료구조의 형태로 데이터를 저장
- HashSet이 내부적으로 HashMap을 쓰는 것처럼,
TreeSet은 내부적으로 TreeMap을 사용
Map
- 키(Key)와 값(Value)을 쌍으로 가지는 데이터의 집합
- 값은 중복을 허용하지만, 키는 허용하지 않음
- 저장 순서가 유지되지 않음
HashMap
- Key를 해싱하여 얻은 해싱값으로 버킷 위치를 계산해서 조회하거나 저장
- 키-값 쌍의 개수에 따라 크기가 동적으로 변경
LinkedHashMap
- Linked라는 이름처럼 데이터의 순서를 보장하는 Map
- Entry들 간 연결 리스트를 구성하여 순서를 보장(들어온 순서대로)
Hashtable
- 컬렉션 프레임워크가 생기기 전부터 있던 레거시 클래스
Vector 같이 하위 호환성을 위해 존재하는 클래스로, 잘 사용하지 않음
- 동기화를 기본 지원하지만 공식문서에서도 멀티쓰레드환경에서는
ConcurrentHashMap 사용을 추천
SortedMap
TreeMap
- 이진 검색 트리의 구조로 Entry를 저장
- Key 값을 기준으로 데이터를 정렬하는 특징