Java HashSet 클래스 완벽 가이드: 연산, 메서드, 집합론
Java HashSet 클래스
Java HashSet 클래스 – 생성, 핵심 메서드, 실전 집합 연산 – 을 간결한 예제로 탐구합니다.
HashSet 클래스는 Java 컬렉션 프레임워크의 일부로 Set 인터페이스를 구현하며 해시 테이블 기반 저장소를 제공합니다.
HashSet 생성하기
java.util.HashSet 임포트:
import java.util.HashSet;
특정 용량과 부하 계수로 HashSet 생성:
HashSet<Integer> numbers = new HashSet<>(8, 0.75); // capacity=8, loadFactor=0.75
매개변수:
- capacity – 초기 버킷 수(예제에서 8)
- loadFactor – 리사이징 트리거 임계값(0.75는 75% 찰 때 리사이즈)
기본값 사용도 일반적:
HashSet<Integer> numbers1 = new HashSet<>(); // capacity=16, loadFactor=0.75
HashSet 메서드
가장 자주 쓰이는 메서드:
add(T element) – 단일 요소 삽입
addAll(Collection<? extends T> c) – 대량 삽입
remove(Object o) – 특정 요소 삭제
removeAll(Collection<? extends Object> c) – 다중 요소 정리
contains(Object o) – 존재 여부 확인
size() – 요소 수
clear() – 모든 엔트리 제거
clone() – 얕은 복사본 생성
isEmpty() – 비어있는지 테스트
containsAll(Collection<? extends Object> c) – 부분집합 확인
요소 삽입
add와 addAll 사용 예제:
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> evenNumber = new HashSet<>();
evenNumber.add(2);
evenNumber.add(4);
evenNumber.add(6);
System.out.println("HashSet: " + evenNumber);
HashSet<Integer> numbers = new HashSet<>();
numbers.addAll(evenNumber);
numbers.add(5);
System.out.println("New HashSet: " + numbers);
}
}
출력
HashSet: [2, 4, 6] New HashSet: [2, 4, 5, 6]
요소 접근
Iterator로 순회:
import java.util.HashSet;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
HashSet<Integer> numbers = new HashSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("HashSet: " + numbers);
Iterator<Integer> iterate = numbers.iterator();
System.out.print("HashSet using Iterator: ");
while(iterate.hasNext()) {
System.out.print(iterate.next() + ", ");
}
}
}
출력
HashSet: [2, 5, 6] HashSet using Iterator: 2, 5, 6,
요소 제거
단일 제거와 집합 비우기:
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numbers = new HashSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("HashSet: " + numbers);
boolean removed = numbers.remove(5);
System.out.println("Is 5 removed? " + removed);
boolean cleared = numbers.removeAll(numbers);
System.out.println("Are all elements removed? " + cleared);
}
}
출력
HashSet: [2, 5, 6] Is 5 removed? true Are all elements removed? true
집합 연산
HashSet의 대량 메서드는 고전적 집합론 연산을 지원합니다.
합집합(Union)
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> evenNumbers = new HashSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
HashSet<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(3);
numbers.addAll(evenNumbers);
System.out.println("Union is: " + numbers);
}
}
출력
Union is: [1, 2, 3, 4]
교집합(Intersection)
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> primeNumbers = new HashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
HashSet<Integer> evenNumbers = new HashSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
evenNumbers.retainAll(primeNumbers);
System.out.println("Intersection is: " + evenNumbers);
}
}
출력
Intersection is: [2]
차집합(Difference)
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> primeNumbers = new HashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
primeNumbers.add(5);
HashSet<Integer> oddNumbers = new HashSet<>();
oddNumbers.add(1);
oddNumbers.add(3);
oddNumbers.add(5);
primeNumbers.removeAll(oddNumbers);
System.out.println("Difference: " + primeNumbers);
}
}
출력
Difference: [2]
부분집합 확인
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
HashSet<Integer> primeNumbers = new HashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
boolean isSubset = numbers.containsAll(primeNumbers);
System.out.println("Is primeNumbers a subset of numbers? " + isSubset);
}
}
출력
Is primeNumbers a subset of numbers? true
추가 메서드
| 메서드 | 설명 |
clone() | 집합의 얕은 복사본 생성 |
contains() | 요소 존재 여부 확인 |
isEmpty() | 집합이 비어있으면 true 반환 |
size() | 집합의 요소 수 |
clear() | 모든 요소 제거 |
전체 목록은 공식 Java 문서를 참조하세요.
왜 HashSet을 사용하는가?
임의 접근이 필요할 때 HashSet은 해시 테이블 백킹 덕분에 O(1) 성능을 제공합니다. 각 요소의 hashCode()가 고유성을 보장하여 중복을 방지합니다. 하지만 HashSet은 스레드 안전하지 않으며 동시 사용 시 외부 동기화가 필요합니다.
참고: HashSet은 비동기화이므로 여러 스레드가 동시에 수정하면 데이터 구조가 손상될 수 있습니다.