자바의 컬렉션 프레임워크

자바의 컬렉션 프레임워크(Collection Framework)는 프로그래밍에서 데이터를 관리하고 처리하는 데 꼭 필요한 기능을 제공하는 표준 인터페이스와 클래스들로 구성되어 있습니다. 이 글에서는 자바 컬렉션 프레임워크의 개념, 구조 및 구현 예제를 보다 상세하게 소개하겠습니다.
1. 자바 컬렉션 프레임워크의 개념 및 구조
자바 컬렉션 프레임워크는 인터페이스와 해당 인터페이스를 구현하는 클래스로 구성되어 있습니다. 주요 인터페이스는 다음과 같습니다.
- Collection
객체들의 모음인 컬렉션을 나타내는 최상위 인터페이스입니다. 이 인터페이스 아래에는 List, Set, Queue 등이 있습니다.
- List: 순서가 유지되는 요소의 모음입니다. ArrayList, LinkedList 등이 구현합니다.
- Set: 중복을 허용하지 않는 요소의 모음입니다. HashSet, TreeSet 등이 구현합니다.
- Queue: 요소가 추가되거나 삭제될 때 특정 규칙에 따라 처리되는 자료구조입니다. PriorityQueue 등이 구현합니다.
- Map
키와 값의 쌍으로 이루어진 데이터의 모음인 맵을 나타내는 인터페이스입니다. HashMap, TreeMap 등이 구현합니다.
이러한 인터페이스들에 따라 구현되는 주요 클래스들에 대해 더 자세히 살펴보겠습니다.
2. 자바 컬렉션 프레임워크 구현 및 사용
- ArrayList
ArrayList는 List 인터페이스를 구현한 가변 크기의 배열입니다. 인덱스를 기반으로한 빠른 조회가 가능하나, 삽입 및 삭제의 빈도가 높으면 비효율적입니다.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Tom");
list.add("Jerry");
list.add("Spike");
System.out.println(list.get(1)); // 출력: Jerry
list.remove(1);
System.out.println(list.size()); // 출력: 2
}
}
- LinkedList
LinkedList는 List 인터페이스를 구현한 이중 연결리스트입니다. 데이터 삽입 및 삭제가 빈번한 경우에 성능이 좋지만 인덱스 기반 조회에서는 비효율적입니다.
import java.util.LinkedList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new LinkedList<>();
list.add("Tom");
list.add("Jerry");
list.add("Spike");
System.out.println(list.get(1)); // 출력: Jerry
list.remove(1);
System.out.println(list.size()); // 출력: 2
}
}
- HashSet
HashSet은 Set 인터페이스를 구현한 자료구조로, 중복을 허용하지 않는 데이터들의 집합입니다. 내부적으로 HashMap을 사용하여 데이터를 저장합니다.
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Tom");
set.add("Jerry");
set.add("Tom");
System.out.println(set.size()); // 출력: 2
}
}
- TreeSet
TreeSet은 Set 인터페이스를 구현한 정렬된 데이터 집합입니다. 트리 구조로 데이터를 저장하고 순서를 유지하며, 중복을 허용하지 않습니다.
import java.util.Set;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
Set<String> set = new TreeSet<>();
set.add("Tom");
set.add("Jerry");
set.add("Spike");
for (String s : set) {
System.out.println(s);
}
// 출력: Jerry
// 출력: Spike
// 출력: Tom
}
}
- PriorityQueue
PriorityQueue는 Queue 인터페이스를 구현한 클래스로, 우선순위 큐를 제공합니다. 내부적으로 힙 자료구조를 사용하여 우선순위에 따라 정렬됩니다.
import java.util.PriorityQueue;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
Queue<Integer> queue = new PriorityQueue<>();
queue.offer(3);
queue.offer(1);
queue.offer(2);
while (!queue.isEmpty()) {
System.out.println(queue.poll()); // 출력: 1, 2, 3
}
}
}
- HashMap
HashMap은 Map 인터페이스를 구현한 클래스로, 키와 값의 쌍을 저장하는 데이터 구조입니다. 순서를 유지하지 않으며 null 값도 허용합니다.
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Tom", 90);
map.put("Jerry", 80);
map.put("Spike", 70);
System.out.println(map.get("Jerry")); // 출력: 80
}
}
- TreeMap
TreeMap은 Map 인터페이스를 구현한 클래스로, 키와 값의 쌍을 저장하는 정렬된 데이터 구조입니다. 내부적으로 레드-블랙 트리를 사용합니다.
import java.util.Map;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new TreeMap<>();
map.put("Tom", 90);
map.put("Jerry", 80);
map.put("Spike", 70);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 출력: Jerry: 80
// 출력: Spike: 70
// 출력: Tom: 90
}
}
자바의 컬렉션 프레임워크를 알고 활용하면 좀 더 효율적인 프로그래밍이 가능합니다. 상황과 요구사항에 맞게 적합한 컬렉션 자료구조를 사용하여 프로그램의 성능을 최적화할 수 있으며, 자료구조를 통합적으로 다루는 인터페이스를 사용해서 유연한 프로그램 설계가 가능합니다.