java
Set 에 관하여
heejunp
2025. 2. 11. 20:05
Java에서 Set 인터페이스는 중복을 허용하지 않는 컬렉션을 다룰 때 사용됩니다. Set의 주요 구현체로는 HashSet, LinkedHashSet, TreeSet 등이 있으며, 각각의 특성과 성능 차이가 존재합니다. 이 글에서는 Java의 Set 구현체들의 차이점을 비교하고 적절한 사용 사례를 분석해보겠습니다.
1. Set 인터페이스란?
Set은 Java의 java.util 패키지에 속해 있으며, 주요 특징은 다음과 같습니다:
- 중복 요소 허용하지 않음
- 순서가 보장되지 않을 수도 있음
- 요소의 고유성 유지 (equals() & hashCode() 사용)
Java에서 Set의 주요 구현체는 HashSet, LinkedHashSet, TreeSet 입니다.
2. 주요 Set 구현체 비교
2.1 HashSet
HashSet은 해시 테이블(Hash Table) 기반의 Set 구현체입니다.
특징:
- 순서를 보장하지 않음
- 중복된 요소 자동 제거
- 삽입 및 삭제 성능 우수 (O(1))
- Thread-safe 하지 않음
사용 예제:
import java.util.*;
public class HashSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Cherry");
set.add("Apple"); // 중복된 요소 추가 (무시됨)
System.out.println(set); // 출력: [Banana, Apple, Cherry] (순서는 랜덤)
}
}
사용 사례:
- 빠른 검색 및 삽입/삭제가 필요한 경우 (O(1))
- 중복 제거가 필요한 경우
2.2 LinkedHashSet
LinkedHashSet은 HashSet의 특징을 유지하면서 요소의 삽입 순서를 보장하는 Set 구현체입니다.
특징:
- 요소의 삽입 순서 유지
- 검색, 삽입, 삭제 성능 (O(1))
- 메모리 사용량이 HashSet보다 큼 (이중 연결 리스트 사용)
사용 예제:
import java.util.*;
public class LinkedHashSetExample {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("Dog");
set.add("Cat");
set.add("Horse");
System.out.println(set); // 출력: [Dog, Cat, Horse] (삽입 순서 유지)
}
}
사용 사례:
- 중복을 제거하면서도 요소의 삽입 순서를 유지해야 하는 경우
- 순차적인 데이터 처리가 필요한 경우
2.3 TreeSet
TreeSet은 이진 검색 트리(Balanced Tree, Red-Black Tree) 기반의 Set 구현체로, 요소를 정렬된 상태로 저장합니다.
특징:
- 자동 정렬 유지 (Comparable 또는 Comparator 필요)
- 검색 성능 우수 (O(log n))
- 삽입 및 삭제 성능 (O(log n))
- null 값을 허용하지 않음
사용 예제:
import java.util.*;
public class TreeSetExample {
public static void main(String[] args) {
Set<Integer> set = new TreeSet<>();
set.add(30);
set.add(10);
set.add(20);
System.out.println(set); // 출력: [10, 20, 30] (오름차순 정렬 유지)
}
}
사용 사례:
- 자동 정렬이 필요한 경우
- 범위 검색(첫 번째, 마지막 요소 찾기)이 필요한 경우
3. 마무리
- Set은 중복을 허용하지 않는 데이터 컬렉션을 제공하는 인터페이스입니다.
- HashSet, LinkedHashSet, TreeSet은 각각 속도, 메모리 사용량, 정렬 유지 등의 측면에서 차이가 있습니다.
- 적절한 Set 구현체를 선택하여 성능과 코드 가독성을 최적화할 수 있습니다.