Java 컬렉션 프레임워크 (Collection Framework)
KUKJIN LEE • 3주 전 작성
Java 컬렉션 프레임워크는 데이터를 효율적으로 저장하고 관리하기 위한 데이터 구조 및 알고리즘을 제공하는 일련의 클래스와 인터페이스 집합입니다. 컬렉션 프레임워크를 사용하면 여러 개의 데이터를 한 번에 다룰 수 있으며, 다양한 방법으로 데이터를 추가, 삭제, 검색할 수 있습니다.
1. 주요 컬렉션 인터페이스
-
Collection: 가장 기본적인 컬렉션 인터페이스로, 모든 컬렉션 클래스의 부모 인터페이스입니다. 이 인터페이스는 데이터를 추가하고, 삭제하고, 조회하는 기본적인 메서드들을 정의합니다.
-
List: 순서가 있는 요소의 집합을 나타냅니다. 중복된 요소를 허용하며, 인덱스를 사용해 요소에 접근할 수 있습니다.
-
Set: 중복을 허용하지 않는 요소의 집합입니다. 순서가 유지되지 않을 수 있습니다.
-
Queue: 먼저 들어온 요소가 먼저 나가는(FIFO) 자료 구조를 나타냅니다.
-
Map: 키와 값의 쌍으로 데이터를 저장하는 구조입니다. 각 키는 고유해야 하며, 키를 통해 값을 빠르게 검색할 수 있습니다.
2. 주요 인터페이스와 구현 클래스
2.1 List 인터페이스
List
는 순서가 있는 컬렉션을 나타내며, 중복된 요소를 허용합니다. 인덱스를 기반으로 요소에 접근할 수 있습니다.
-
ArrayList: 배열 기반의 리스트로, 요소를 동적으로 관리합니다. 읽기 속도가 빠르며, 요소의 추가 및 삭제는 느립니다.
-
LinkedList: 연결 리스트 기반의 구현체로, 요소의 추가 및 삭제가 빠르지만 읽기 속도는 상대적으로 느립니다.
-
Vector:
ArrayList
와 유사하지만, 스레드 안전(thread-safe)을 보장합니다. -
Stack: LIFO(Last In, First Out) 방식의 자료 구조로, 스택의 동작을 수행합니다.
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
System.out.println(list.get(1)); // Banana 출력
list.remove("Banana");
System.out.println(list); // [Apple, Orange] 출력
}
}
2.2 Set 인터페이스
Set
은 중복된 요소를 허용하지 않는 컬렉션입니다. 요소의 순서는 유지되지 않을 수 있으며, 주로 고유한 데이터를 관리할 때 사용됩니다.
-
HashSet: 해시 테이블을 사용해 요소를 관리하며, 요소의 순서는 보장되지 않습니다.
-
LinkedHashSet:
HashSet
과 비슷하지만, 요소가 추가된 순서를 유지합니다. -
TreeSet: 이진 검색 트리를 사용해 요소를 정렬된 상태로 저장합니다.
import java.util.HashSet;
public class HashSetExample {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Orange");
set.add("Apple"); // 중복 요소 추가 시도
System.out.println(set); // [Apple, Orange, Banana] 출력 (중복 허용 안됨)
}
}
2.3 Queue 인터페이스
Queue
는 FIFO(First In, First Out) 방식을 따르는 자료 구조로, 줄서기와 같은 구조를 구현할 때 사용됩니다.
-
LinkedList:
List
뿐만 아니라Queue
로도 사용될 수 있습니다. -
PriorityQueue: 요소들이 우선순위에 따라 정렬되어 관리됩니다.
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.add("Apple");
queue.add("Banana");
queue.add("Orange");
System.out.println(queue.poll()); // Apple 출력 (FIFO 순서)
System.out.println(queue); // [Banana, Orange] 출력
}
}
2.4 Map 인터페이스
Map
은 키와 값의 쌍으로 데이터를 저장하는 자료 구조입니다. 각 키는 고유하며, 이를 통해 빠르게 값을 검색할 수 있습니다.
-
HashMap: 해시 테이블 기반의
Map
구현체로, 요소의 순서를 보장하지 않습니다. -
LinkedHashMap:
HashMap
과 유사하지만, 요소가 추가된 순서를 유지합니다. -
TreeMap: 키를 정렬된 순서로 저장하는
Map
구현체입니다.
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Orange", 3);
System.out.println(map.get("Banana")); // 2 출력
System.out.println(map); // {Apple=1, Orange=3, Banana=2} 출력
}
}
3. 컬렉션 클래스의 장단점 비교
-
ArrayList vs LinkedList
-
ArrayList
는 배열 기반이므로 인덱스를 통한 빠른 접근이 가능하지만, 요소를 추가하거나 삭제할 때 많은 비용이 발생할 수 있습니다. -
LinkedList
는 연결 리스트 기반이므로 요소 추가/삭제가 빠르지만, 인덱스를 통한 접근 속도가 느립니다.
-
-
HashSet vs TreeSet
-
HashSet
은 요소의 순서를 보장하지 않으며,hashCode()
와equals()
메서드에 의존하여 고유성을 판단합니다. -
TreeSet
은 요소들을 정렬된 상태로 유지하지만, 정렬하는 데 시간이 더 소요됩니다.
-
-
HashMap vs TreeMap
-
HashMap
은 키의 순서를 보장하지 않고, 빠른 검색이 가능합니다. -
TreeMap
은 키를 정렬된 순서로 저장하며, 데이터를 정렬된 상태로 유지해야 할 때 유용합니다.
-
컬렉션 사용 시 유의할 점
-
Null 값 허용 여부: 일부 컬렉션은
null
값을 허용하지 않을 수 있습니다. 예를 들어,HashSet
과HashMap
은null
값을 허용하지만,TreeSet
과TreeMap
은null
값을 허용하지 않습니다.