Table of Contents
자바 컬렉션 프레임워크 - Set 인터페이스
1. Set 인터페이스란?
Set
인터페이스는 중복을 허용하지 않는 데이터 집합을 표현하는 자료구조입니다.
요소의 저장 순서를 보장하지 않으며, 고유한 데이터를 관리하는 데 유용합니다.
2. 주요 특징
- 중복 허용 X: 동일한 요소가 두 번 이상 저장될 수 없습니다.
- 순서 보장 X: 삽입한 순서대로 요소가 유지되지 않을 수 있습니다.
- 빠른 탐색 성능: 특정 요소 포함 여부 확인이 빠릅니다.
- 다양한 구현체 제공:
HashSet
,TreeSet
,LinkedHashSet
등이 존재합니다.
3. 주요 구현 클래스
자바의 Set
인터페이스는 다양한 구현 클래스를 제공하며, 각 클래스는 내부적으로 다른 방식으로 요소를 관리합니다.
3.1 HashSet
- 해시 테이블을 기반으로 동작하여 요소를 저장합니다.
- 순서를 보장하지 않음
- 빠른 탐색과 삽입/삭제 성능 제공 (O(1) 평균 성능)
- 용도: 빠른 검색이 필요하고 요소 순서가 중요하지 않은 경우
Set<String> hashSet = new HashSet<>();
hashSet.add("Java");
hashSet.add("Python");
hashSet.add("Java"); // 중복 값 추가되지 않음
System.out.println(hashSet); // [Python, Java] (순서는 다를 수 있음)
3.2 TreeSet
- 이진 탐색 트리(레드-블랙 트리) 구조로 정렬을 유지합니다.
- 오름차순 정렬 (기본적으로
Comparable
또는Comparator
적용 가능) - 검색, 추가, 삭제 속도가 O(log n)
- 용도: 정렬이 필요한 경우
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(30);
treeSet.add(10);
treeSet.add(20);
System.out.println(treeSet); // [10, 20, 30] (정렬된 상태 유지)
3.3 LinkedHashSet
HashSet
과 유사하지만 삽입 순서를 유지합니다.- 내부적으로 이중 연결 리스트를 사용하여 순서를 유지
- 용도: 순서를 보존하면서 중복을 방지하고 싶을 때
Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("C");
linkedHashSet.add("C++");
linkedHashSet.add("Java");
System.out.println(linkedHashSet); // [C, C++, Java] (삽입 순서 유지)
4. 주요 메서드
메서드 | 설명 |
---|---|
add(E e) |
요소 추가 |
remove(Object o) |
요소 삭제 |
contains(Object o) |
특정 요소 포함 여부 확인 |
size() |
집합의 크기 반환 |
isEmpty() |
집합이 비어있는지 확인 |
clear() |
모든 요소 삭제 |
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Kotlin");
set.remove("Java");
System.out.println(set.contains("Kotlin")); // true
5. Set vs List
비교 항목 | Set | List |
---|---|---|
중복 허용 | ❌ (허용 안 됨) | ✅ (허용됨) |
순서 유지 | ❌ (HashSet, TreeSet) / ✅ (LinkedHashSet) | ✅ (삽입 순서 유지) |
접근 방식 | 요소 탐색이 주 목적 | 인덱스 기반 접근 가능 |
성능 | 검색 및 삽입이 빠름 (HashSet: O(1)) | 특정 상황에서 성능 저하 (ArrayList: O(n)) |
6. 결론
자바의 Set
인터페이스는 중복을 허용하지 않는 데이터를 저장하고 관리하는 데 최적화된 자료구조입니다.
특정 작업에 맞는 구현체(HashSet
, TreeSet
, LinkedHashSet
)를 선택하면 보다 효율적인 성능을 얻을 수 있습니다.
다음 블로그에서는 Map
인터페이스에 대해 알아보겠습니다!