Java의 List, Set, Queue, Deque, Map 인터페이스 및 구현 클래스 비교
Java의 Collection Framework는 데이터를 효율적으로 저장하고 관리할 수 있는 다양한 자료구조를 제공한다.
그중에서 List, Set, Queue, Deque, Map 인터페이스는 각기 다른 특성을 가지며,
이를 구현하는 여러 클래스가 존재한다.
📌 1. 인터페이스별 메서드 정리
1️⃣ List 인터페이스 (순서 유지, 중복 허용)
| 메서드 |
설명 |
void add(int index, E element) |
특정 위치에 요소 삽입 |
boolean add(E element) |
리스트 끝에 요소 추가 |
E get(int index) |
특정 위치의 요소 반환 |
E remove(int index) |
특정 위치의 요소 삭제 |
boolean remove(Object o) |
특정 요소 삭제 |
int indexOf(Object o) |
특정 요소의 첫 번째 인덱스 반환 |
int lastIndexOf(Object o) |
특정 요소의 마지막 인덱스 반환 |
List<E> subList(int fromIndex, int toIndex) |
특정 범위의 부분 리스트 반환 |
구현 클래스 비교
| 클래스 |
특징 |
ArrayList<E> |
배열 기반, 인덱스 접근 빠름, 삽입/삭제 느림 |
LinkedList<E> |
이중 연결 리스트, 삽입/삭제 빠름, 인덱스 접근 느림 |
Vector<E> |
ArrayList와 유사하지만 동기화(Synchronized) 지원 |
Stack<E> |
Vector를 상속받아 LIFO(후입선출) 기능 제공 |
2️⃣ Set 인터페이스 (중복 허용 X, 순서 보장 X)
| 메서드 |
설명 |
boolean add(E e) |
요소 추가 (중복이면 추가되지 않음) |
boolean remove(Object o) |
특정 요소 제거 |
boolean contains(Object o) |
특정 요소 포함 여부 확인 |
int size() |
요소 개수 반환 |
void clear() |
모든 요소 제거 |
구현 클래스 비교
| 클래스 |
특징 |
HashSet<E> |
해시 테이블 기반, 요소 순서 유지 X, 검색 빠름 |
LinkedHashSet<E> |
HashSet과 같지만 요소 삽입 순서 유지 |
TreeSet<E> |
이진 탐색 트리 기반, 요소가 자동 정렬됨 |
3️⃣ Queue 인터페이스 (FIFO, 선입선출 구조)
| 메서드 |
설명 |
boolean add(E e) |
요소 추가 (실패 시 예외 발생) |
boolean offer(E e) |
요소 추가 (실패 시 false 반환) |
E remove() |
첫 번째 요소 제거 (큐가 비었으면 예외 발생) |
E poll() |
첫 번째 요소 제거 (큐가 비었으면 null 반환) |
E element() |
첫 번째 요소 반환 (큐가 비었으면 예외 발생) |
E peek() |
첫 번째 요소 반환 (큐가 비었으면 null 반환) |
구현 클래스 비교
| 클래스 |
특징 |
LinkedList<E> |
Queue 인터페이스 구현, 양방향 리스트 구조 |
PriorityQueue<E> |
내부적으로 힙(Heap) 사용, 우선순위에 따라 정렬 |
ArrayDeque<E> |
양방향 큐 (Deque) 지원, Stack 대체 가능 |
4️⃣ Deque 인터페이스 (양방향 큐)
| 메서드 |
설명 |
void addFirst(E e) |
앞쪽에 요소 추가 |
void addLast(E e) |
뒤쪽에 요소 추가 |
E removeFirst() |
앞쪽 요소 제거 |
E removeLast() |
뒤쪽 요소 제거 |
E getFirst() |
첫 번째 요소 반환 |
E getLast() |
마지막 요소 반환 |
boolean offerFirst(E e) |
앞쪽에 요소 추가 (실패 시 false 반환) |
boolean offerLast(E e) |
뒤쪽에 요소 추가 (실패 시 false 반환) |
구현 클래스 비교
| 클래스 |
특징 |
ArrayDeque<E> |
배열 기반, 크기 자동 조절 |
LinkedList<E> |
이중 연결 리스트 기반 |
5️⃣ Map 인터페이스 (키-값 쌍 저장, 중복 키 X)
| 메서드 |
설명 |
V put(K key, V value) |
키-값 쌍 추가 (같은 키가 존재하면 기존 값 덮어쓰기) |
V get(Object key) |
특정 키에 대한 값 반환 |
V remove(Object key) |
특정 키의 값 삭제 |
boolean containsKey(Object key) |
특정 키 포함 여부 확인 |
boolean containsValue(Object value) |
특정 값 포함 여부 확인 |
Set<K> keySet() |
모든 키 반환 |
Collection<V> values() |
모든 값 반환 |
Set<Map.Entry<K,V>> entrySet() |
모든 키-값 쌍 반환 |
구현 클래스 비교
| 클래스 |
특징 |
HashMap<K,V> |
해시 테이블 기반, 키 순서 보장 X, 빠른 검색 |
LinkedHashMap<K,V> |
삽입 순서 유지 |
TreeMap<K,V> |
키 기준으로 자동 정렬 |
📌 2. 구현 클래스 비교 요약
| 인터페이스 |
주요 구현 클래스 |
특징 |
List |
ArrayList |
배열 기반, 빠른 조회, 삽입/삭제 느림 |
|
LinkedList |
연결 리스트 기반, 삽입/삭제 빠름, 조회 느림 |
|
Vector |
ArrayList와 유사하지만 동기화 지원 |
|
Stack |
Vector를 확장하여 LIFO(후입선출) 제공 |
Set |
HashSet |
중복 X, 순서 보장 X |
|
LinkedHashSet |
삽입 순서 유지 |
|
TreeSet |
자동 정렬 (오름차순) |
Queue |
LinkedList |
FIFO (선입선출) |
|
PriorityQueue |
우선순위 기반 정렬 |
|
ArrayDeque |
양방향 큐 (Deque) |
Deque |
ArrayDeque |
배열 기반, 크기 자동 조절 |
|
LinkedList |
연결 리스트 기반 |
Map |
HashMap |
중복 키 X, 순서 보장 X |
|
LinkedHashMap |
삽입 순서 유지 |
|
TreeMap |
키 기준 자동 정렬 |
📌 3. 예제 코드
✔ List 사용 예제
📌 4. 마무리
✔ List: 순서 유지, 중복 허용
✔ Set: 순서 없음, 중복 불가
✔ Queue: FIFO 구조, PriorityQueue는 우선순위 정렬
✔ Deque: 양방향 큐
✔ Map: 키-값 저장, 키 중복 불가
✔ 각 자료구조의 특성을 이해하고 상황에 맞게 선택하자! 🚀
Java 컬렉션 유틸리티 클래스 (Collections, Arrays, etc.)
Java에서는 컬렉션을 쉽게 다룰 수 있도록 유틸리티 클래스를 제공한다.
대표적으로 Collections와 Arrays 클래스가 있으며, 이들은 정렬, 검색, 동기화, 불변 컬렉션 생성 등의 기능을 제공한다.
📌 1. Collections 클래스의 주요 메서드 정리
| 메서드 |
설명 |
sort(List<T> list) |
오름차순 정렬 |
sort(List<T> list, Comparator<? super T> c) |
지정한 정렬 기준으로 정렬 |
binarySearch(List<T> list, T key) |
이진 탐색 (정렬된 리스트에서만 사용 가능) |
reverse(List<?> list) |
리스트 요소 순서를 반대로 변경 |
shuffle(List<?> list) |
리스트 요소를 무작위로 섞음 |
min(Collection<? extends T> coll) |
컬렉션에서 최소값 반환 |
max(Collection<? extends T> coll) |
컬렉션에서 최대값 반환 |
fill(List<? super T> list, T obj) |
리스트의 모든 요소를 특정 값으로 채움 |
copy(List<? super T> dest, List<? extends T> src) |
리스트 복사 |
replaceAll(List<T> list, T oldVal, T newVal) |
특정 값을 새로운 값으로 대체 |
frequency(Collection<?> c, Object o) |
특정 요소가 컬렉션에 몇 번 등장하는지 반환 |
disjoint(Collection<?> c1, Collection<?> c2) |
두 컬렉션이 공통 요소를 가지지 않으면 true 반환 |
synchronizedList(List<T> list) |
동기화된 리스트 반환 |
synchronizedSet(Set<T> set) |
동기화된 셋 반환 |
synchronizedMap(Map<K,V> map) |
동기화된 맵 반환 |
synchronizedSortedMap(SortedMap<K,V> map) |
동기화된 정렬된 맵 반환 |
unmodifiableList(List<? extends T> list) |
불변 리스트 반환 |
unmodifiableSet(Set<? extends T> set) |
불변 셋 반환 |
unmodifiableMap(Map<? extends K,? extends V> map) |
불변 맵 반환 |
📌 2. Arrays 클래스의 주요 메서드 정리
| 메서드 |
설명 |
sort(T[] array) |
배열 정렬 (오름차순) |
sort(T[] array, Comparator<? super T> c) |
사용자 정의 비교 기준으로 정렬 |
binarySearch(T[] array, T key) |
배열에서 이진 탐색 수행 |
fill(T[] array, T val) |
배열의 모든 요소를 특정 값으로 채움 |
copyOf(T[] original, int newLength) |
배열을 새로운 크기로 복사 |
copyOfRange(T[] original, int from, int to) |
배열의 특정 범위를 복사 |
equals(T[] a, T[] b) |
두 배열이 같은지 비교 |
deepEquals(Object[] a, Object[] b) |
다차원 배열 비교 |
asList(T... a) |
배열을 리스트로 변환 |
toString(T[] a) |
배열을 문자열로 변환 |
📌 3. 주요 메서드 설명 및 예제
✔ sort() - 정렬
- 기본적으로 오름차순 정렬한다.
Comparator를 사용하면 정렬 기준을 변경할 수 있다.
✔ binarySearch() - 이진 탐색
- 정렬된 리스트에서만 사용 가능하다.
- 찾는 값이 없으면 음수 반환.
✔ shuffle() - 무작위 섞기
✔ min() / max() - 최소값과 최대값 찾기
✔ fill() - 모든 요소를 특정 값으로 채우기
✔ replaceAll() - 특정 값 치환
✔ frequency() - 특정 값 개수 세기
✔ synchronizedList() - 동기화 리스트
✔ unmodifiableList() - 불변 리스트
📌 4. 정리
| 기능 |
Collections 메서드 |
Arrays 메서드 |
| 정렬 |
sort() |
sort() |
| 검색 |
binarySearch() |
binarySearch() |
| 최소/최대값 |
min(), max() |
X |
| 무작위 섞기 |
shuffle() |
X |
| 요소 채우기 |
fill() |
fill() |
| 요소 치환 |
replaceAll() |
X |
| 특정 값 개수 |
frequency() |
X |
| 동기화 컬렉션 |
synchronizedList() |
X |
| 불변 컬렉션 |
unmodifiableList() |
X |
✔ Collections는 컬렉션(List, Set, Map) 관련 기능 제공
✔ Arrays는 배열 관련 기능 제공
이제 Java 컬렉션을 더욱 편리하게 다룰 수 있다! 🚀