Java Set 인터페이스 마스터: 개념, 메서드, 실전 예제
Java Set 인터페이스 완전 정복
Java의 Set 인터페이스가 중복을 제거하는 방식, 핵심 메서드, HashSet, TreeSet 등 실전 활용법을 알아봅니다.
Java 컬렉션 프레임워크의 Set 인터페이스는 수학적 집합을 모델링합니다: 중복 요소를 절대 보유하지 않는 컬렉션입니다. Collection 인터페이스를 확장하여 모든 표준 연산을 상속받으면서 몇 가지 Set 전용 유틸리티를 추가합니다.
Set을 구현하는 클래스들
Set은 인터페이스이므로 구체 구현체를 인스턴스화하여 사용합니다:
HashSet – 비정렬, 고성능, 해싱 사용
LinkedHashSet – 삽입 순서 보존
EnumSet – 열거형 타입 전용 특화 집합, 매우 빠름
TreeSet – 자연 순서 또는 비교자 기반 정렬 순서
이 클래스들은 java.util 패키지에 있으며 모두 Set 계약을 만족합니다.
Set의 서브인터페이스
Set 인터페이스는 더 확장됩니다:
SortedSet – 정렬된 집합 탐색 메서드 추가
NavigableSet – SortedSet을 고수준 탐색 메서드로 확장
코드에서 Set 사용하기
Set 사용을 위해 java.util.Set 임포트하고 구현체 선택:
import java.util.Set;
import java.util.HashSet;
Set<String> animals = new HashSet<>();
animals는 HashSet으로 뒷받침되는 문자열 Set입니다. 구현체 선택은 순서, 성능, 사용 사례 요구사항에 따라 달라집니다.
Set 핵심 메서드
Set 인터페이스는 모든 Collection 메서드를 상속받고 다음 자주 쓰이는 메서드를 추가합니다:
- add(element) – 요소가 없으면 삽입
- addAll(collection) – 다른 컬렉션에서 대량 추가
- iterator() – 순차 이터레이터 제공
- remove(element) – 특정 요소 제거
- removeAll(collection) – 지정된 컬렉션에 나타나는 모든 요소 제거
- retainAll(collection) – 지정된 컬렉션에도 있는 요소만 유지
- clear() – 집합 비우기
- size() – 요소 수 반환
- toArray() – 집합을 배열로 변환
- contains(element) – 멤버십 확인
- containsAll(collection) – 주어진 컬렉션의 모든 요소가 있는지 확인
- hashCode() – 집합의 해시 코드 생성
완전한 참조는 공식 Java Set 문서를 참조하세요.
집합 연산
Java 집합은 직관적인 메서드로 고전적 수학 연산을 지원합니다:
- 합집합(Union) –
x.addAll(y)로 두 집합 결합
- 교집합(Intersection) –
x.retainAll(y)로 공통 요소만 유지
- 부분집합(Subset) –
y.containsAll(x)로 x가 y의 부분집합인지 확인
실전 구현 예제
1. HashSet 사용
import java.util.Set;
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
Set<Integer> set1 = new HashSet<>();
set1.add(2);
set1.add(3);
System.out.println("Set1: " + set1);
Set<Integer> set2 = new HashSet<>();
set2.add(1);
set2.add(2);
System.out.println("Set2: " + set2);
set2.addAll(set1); // 합집합
System.out.println("Union is: " + set2);
}
}
출력
Set1: [2, 3] Set2: [1, 2] Union is: [1, 2, 3]
더 알아보기: Java HashSet
2. TreeSet 사용
import java.util.Set;
import java.util.TreeSet;
import java.util.Iterator;
public class TreeSetDemo {
public static void main(String[] args) {
Set<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(3);
numbers.add(1);
System.out.println("Set using TreeSet: " + numbers);
System.out.print("Accessing elements using iterator(): ");
Iterator<Integer> it = numbers.iterator();
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
}
}
출력
Set using TreeSet: [1, 2, 3] Accessing elements using iterator(): 1, 2, 3,
자세한 내용: Java TreeSet
이 예제들은 실제 애플리케이션에서 Set 인터페이스의 힘을 활용하는 방법을 보여줍니다. 다음으로 EnumSet, LinkedHashSet 등 다른 구현체를 별도 튜토리얼에서 탐구할 예정입니다.