Java Collection Framework(JCF)는 Java에서 데이터를 저장하고 조회·조작하기 위해 제공되는 표준 인터페이스 및 구현체의 집합이다. 이번 글에서는 JCF의 전체 구조와 주요 인터페이스에 대해 알아보고자 한다.
Collection Framework의 종류
Collection Framework는 크게 Collection 인터페이스와 Map 인터페이스로 나뉜다. List, Queue, Set 인터페이스는 공통적으로 Collection 인터페이스를 상속하고 있지만 Map 인터페이스는 두개의 데이터를 묶어 한쌍으로 다루기 때문에 Collection 인터페이스와 따로 분리되어 있다.
Collection Framework 에 저장할 수 있는 것은 참조 타입(Reference Type)만 가능하다. 즉 내부적으로 모든 요소를 Object 참조로 관리하기 때문에 primitive type은 담을 수 없다. 따라서 Primitive type을 넣으려면 Wrapper 클래스를 사용해야 하며 null은 참조 타입의 일종이므로 Collection Framework에 저장할 수 있다.
Iterable 인터페이스
Iterable은 Collection Framework의 가장 최상위 인터페이스로 반복이 가능한 객체를 표현하는 인터페이스다.
메소드 | 설명 |
Iterator<T> iterator(); | - 반복 가능 객체의 첫 요소부터 순회할 수 있는 Iterator를 반환 |
default void forEach(Consumer<? super T> action) |
- java 8부터 도입된 default 함수 - 람다 표현식과 함께 사용할 수 있는 반복 처리 함수 - 내부적으로 iterator()를 불러와, 컬렉션의 모든 요소에 대해 주어진 람다식을 순서대로 실행 |
default Spliterator<T> spliterator() | - java 8부터 도입된 default 함수 - 스트림 API나 병렬 처리를 위해 “분할 가능한 반복자”(Spliterator)를 반환 |
Collection 인터페이스
Collection은 Iterable을 확장하며, 요소의 추가(add), 제거(remove), 포함 여부 확인(contains), 크기 조회(size) 등 컬렉션의 기본 조작 메소드를 정의한 인터페이스다.
메소드 | 설명 |
boolean add(E e) boolean addAll(Collection<? extends E> c) |
지정된 객체(o) 또는 Collection(c)의 객체들을 Collection에 추가 |
boolean contains(Object o) boolean containsAll(Collection<?> c) |
지정된 객체(o) 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인 |
boolean remove(Object o) boolean removeAll(Collection<?> c) |
지정된 객체 또는 지정된 Collection에 포함된 객체들을 삭제 |
boolean retainAll(Collection<?> c) | 지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제. 사실상 removeAll 의 대칭 버전. (교집합 동작) 이 작업으로 Collection에 변화가 있으면 true를 없으면 false를 반환 |
void clear() | Collection의 모든 객체를 삭제 |
boolean equals(Object o) | 동일한 Collection인지 비교 |
int hashCode() | Collection의 hash code를 반환 |
boolean isEmpty() | Collection이 비어있는지 확인 |
Iterator<E> iterator() | Collection을 순회할 수 있는 Iterator 객체를 반환 |
int size() | Collection에 저장된 객체의 개수를 반환 |
Object[] toArray() | Collection에 저장된 객체를 객체배열(Object[])로 반환 |
<T> T[] toArray(T[] a) | 지정된 배열(a)에 Collection의 객체를 저장해서 반환 |
java 8 부터는 함수형 프로그래밍을 위해 parallelStream, removeIf, stream, forEach와 같은 default 메소드가 추가됨
List 인터페이스
List는 요소를 추가한 순서를 그대로 유지하면서 동일한 값을 여러 번 저장할 수 있고 get(int index) 같은 인덱스 기반 접근을 지원한다. 또한 구현체 내부에서 크기를 자동으로 늘리거나 줄여주기 때문에 요소가 추가·삭제될 때마다 컬렉션의 크기가 유동적으로 변경된다.
메소드 | 설명 |
void add(int index, Object element) boolean addAll(int index, Collection<? extends E> c) |
지정된 위치(index)에 객체(element) 또는 컬렉션에 포함된 객체들을 추가한다. |
E remove(int index) | 지정된 위치(index)에 있는 객체를 삭제하고 삭제된 객체를 반환한다. |
E get(int index) | 지정된 위치(index)에 있는 객체를 반환한다. |
E set(int index, E element) | 지정된 위치(index)에 객체(element)를 저장한다. |
int indexOf(Object o) | 지정된 객체의 위치(index)를 반환한다. (순방향) |
int lastIndexOf(Object o) | 지정된 객체의 위치(index)를 반환한다. (역방향) |
List<E> subList(int fromIndex, int toIndex) | 지정된 범위(from ~ to)에 있는 객체를 List로 반환한다. |
ListIterator<E> listIterator() ListIterator<E> listIterator(int index) |
List 객체를 순회할 수 있는 ListIterator를 반환한다. |
default void sort(Comparator<? super E> c) | 지정된 비교자(comparator)로 List를 정렬한다. |
Queue 인터페이스
Queue는 선입선출(FIFO: First-In, First-Out) 방식으로 요소를 관리하는 컬렉션을 정의하는 인터페이스이다. 주로 작업 대기열, 이벤트 처리, 메시지 전달 등 순서대로 처리해야 할 데이터를 다룰 때 사용한다.
메소드 | 설명 |
boolean add(E e) | Queue의 끝에 지정된 객체를 추가(실패 시 IllegalStateException 발생) |
boolean offer(E e) | Queue의 끝에 지정된 객체를 추가 (실패 시 false 반환) |
E remove() | Queue의 head 요소를 제거하고 반환 (실패 시 NoSuchElementException 발생) |
E poll() | Queue의 head 요소를 제거하고 반환 (실패 시 null 반환) |
E element() | Queue의 head 요소를 조회만 함 (실패 시 NoSuchElementException 발생) |
E peek() | Queue의 head 요소를 조회만 함 (실패 시 null 반환) |
Deque 인터페이스
Deque(Double-Ended Queue)는 양쪽 끝(Head/Tail) 에서 삽입·삭제가 가능한 큐를 정의한다. 스택(LIFO)과 큐(FIFO) 양쪽 용도로 모두 사용할 수 있다.
메소드 | 설명 |
void addFirst(E e) | Deque 앞쪽에 지정된 객체 추가 (실패 시 IllegalStateException 발생) |
boolean offerFirst(E e) | Deque 앞쪽에 지정된 객체 추가 (실패 시 false 반환) |
void addLast(E e) | Deque 뒤쪽에 지정된 객체 추가 (실패 시 IllegalStateException 발생) |
boolean offerLast(E e) | Deque 뒤쪽에 지정된 객체 추가 (실패 시 false 반환) |
E removeFirst() | Deque의 맨 앞쪽 요소를 제거하고 반환 (실패 시 NoSuchElementException 발생) |
E pollFirst() | Deque의 맨 앞쪽 요소를 제거하고 반환 (실패 시 null 반환) |
E removeLast() | Deque의 맨 뒤쪽 요소를 제거하고 반환 (실패 시 NoSuchElementException 발생) |
E pollLast() | Deque의 맨 뒤쪽 요소를 제거하고 반환 (실패 시 null 반환) |
E getFirst() | Deque의 맨 앞쪽 요소 조회 (실패 시 NoSuchElementException 발생) |
E peekFirst() | Deque의 맨 앞쪽 요소 조회 (실패 시 null 반환) |
E getLast() | Deque의 맨 뒤쪽 요소 조회 (실패 시 NoSuchElementException 발생) |
E peekLast() | Deque의 맨 뒤쪽 요소 조회 (실패 시 null 반환) |
void push(E e) | Stack의 push : 내부적으로 addFirst(E e) 호출 |
E pop() | Stack의 pop : 내부적으로 removeFirst() 호출 |
Set 인터페이스
Set은 중복된 요소를 허용하지 않는 Collection을 정의하는 인터페이스다. 순서를 유지하지 않을 수 있으며, 동일한 객체를 두 번 저장하려 하면 add()는 false를 반환한다.
메소드 | 설명 |
boolean add(E e) | Set에 지정된 객체 추가. (이미 존재하면 변경 없이 false 반환, 새로 추가되면 true 반환) |
boolean contains(Object o) | Set에 객체 지정된 객체 가 포함되어 있으면 true 반환 |
boolean containsAll(Collection<?> c) | 컬렉션 c의 모든 요소가 Set에 포함되어 있으면 true 반환 |
Iterator<E> iterator() | Set을 순회할 수 있는 Iterator를 반환 |
boolean isEmpty() | Set이 비어있으면 true 반환 |
int size() | Set에 저장된 요소의 개수를 반환 |
void clear() | Set의 모든 요소를 삭제 |
boolean remove(Object o) | Set에 지정된 객체와 equals() 비교해 일치하는 요소를 제거. (제거되면 true, 없으면 false 반환) |
Map 인터페이스
Map은 키(Key)–값(Value) 쌍으로 데이터를 저장하는 자료구조를 정의하는 인터페이스이다. key는 중복 불가이지만 값은 중복을 허용한다.
메소드 | 설명 |
void clear() | Map의 모든 객체를 삭제 |
boolean containsKey(Object key) | 지정된 key가 Map에 있으면 true를 반환 |
boolean containsValue(Object value) | 지정된 value가 Map에 있으면 true를 반환 |
Set<Map.Entry<K, V>> entrySet() | Map에 저장된 key-value쌍을 Map.Entry타입의 객체로 저장한 Set을 반환 |
boolean equals(Object o) | 동일한 Map인지 비교 |
V get(Object key) | 지정된 key에 매핑된 값을 반환 (매핑 값이 없을 경우 null 반환) |
int hashCode() | 해시코드를 반환 |
boolean isEmpty() | Map이 비어있으면 true 반환 |
Set<K> keySet() | Map에 저장된 모든 key 객체를 저장한 Set을반환 |
V put(K key, V value) | Map에 key 객체와 value 객체를 매핑하여 저장 |
void putAll(Map<? extends K, ? extends V> m) | 지정된 Map의 모든 key-value 쌍을 추가 |
V remove(Object key) | 지정된 key 객체와 일치하는 key-value 를 삭제 |
int size() | Map에 저장된 key-value쌍의 개수를 반환 |
Collection<V> values() | Map에 저장된 모든 value객체를 반환 |
이외에도 getOrDefault, putIfAbsent, computeIfAbsent, merge와 같은 메소드들이 자주 사용됨
Map.Entry 인터페이스
Map의 key-value 쌍(엔트리)을 표현하는 중첩(nested) 인터페이스로 entrySet()의 반환 타입이다.
Map 인터페이스 안에 Entry 인터페이스 존재함
메소드 | 설명 |
boolean equals(Object o) | 동일한 Entry 인지 비교 |
K getKey() | Entry의 key 객체를 반환 |
V getValue() | Entry의 value 객체를 반환 |
int hashCode() | Entry의 해시코드 반환 |
V setValue(V value) | Entry에 새 값을 설정하고, 이전 값을 반환 |
출처 : https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Collections-Framework-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC https://www.youtube.com/watch?v=FrPCDEiindY |