반응형
Java의 HashSet과 HashTable은 데이터를 효율적으로 관리하고 빠르게 검색할 수 있는 컬렉션 클래스입니다. 이번 글에서는 HashSet과 HashTable의 기본 개념, 주요 기능, 그리고 실습 예제를 통해 사용법을 배워보겠습니다. 초보자도 쉽게 이해할 수 있도록 차근차근 설명할게요! 😊
1. HashSet: 중복 없는 데이터 저장소
HashSet은 집합(Set) 자료구조의 구현체로, 다음과 같은 특징이 있습니다:
- 중복 허용 안함: 동일한 값은 한 번만 저장됩니다.
- 순서 없음: 저장된 데이터의 순서가 보장되지 않습니다.
- 빠른 검색: 해시 기반으로 데이터를 관리하여 검색 속도가 빠릅니다.
1-1. HashSet 기본 사용법
private static void usingHashSet() {
// 선언
HashSet<String> hs = new HashSet<>();
// 요소 추가
hs.add("Java");
hs.add("C");
hs.add("C++");
hs.add("Python");
hs.add("Java"); // 중복된 값은 저장되지 않음
System.out.println("HashSet: " + hs); // 출력: [Java, C, C++, Python]
System.out.println("Size: " + hs.size()); // 저장된 데이터 개수
// 특정 값 포함 여부
System.out.println("C++ 포함? " + hs.contains("C++")); // true
System.out.println("Linux 포함? " + hs.contains("Linux")); // false
// 값 삭제
hs.remove("C++");
System.out.println("HashSet after remove: " + hs); // [Java, C, Python]
}
실행 결과
HashSet: [Java, C, C++, Python]
Size: 4
C++ 포함? true
Linux 포함? false
HashSet after remove: [Java, C, Python]
핵심 포인트
- 중복 제거: hs.add("Java")를 두 번 호출해도 하나만 저장됩니다.
- 포함 여부 확인: contains() 메서드를 사용해 특정 값이 존재하는지 확인합니다.
- 삭제: remove() 메서드로 값을 삭제할 수 있습니다.
1-2. HashSet으로 집합 연산하기
HashSet은 집합(Set) 연산(합집합, 교집합, 차집합)을 지원합니다.
private static void setOperation() {
HashSet<Integer> numbers = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
HashSet<Integer> odds = new HashSet<>(Arrays.asList(1, 3, 5, 7, 9)); // 홀수 집합
HashSet<Integer> evens = new HashSet<>(Arrays.asList(2, 4, 6, 8, 10)); // 짝수 집합
// 교집합
HashSet<Integer> intersection = new HashSet<>(odds);
intersection.retainAll(evens); // 교집합 연산
System.out.println("교집합: " + intersection); // []
// 합집합
HashSet<Integer> union = new HashSet<>(odds);
union.addAll(evens); // 합집합 연산
System.out.println("합집합: " + union); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// 차집합
HashSet<Integer> difference = new HashSet<>(numbers);
difference.removeAll(odds); // 차집합 연산
System.out.println("차집합: " + difference); // [2, 4, 6, 8, 10]
}
2. HashTable: 키-값(Key-Value) 기반의 데이터 관리
HashTable은 데이터를 키-값(Key-Value) 형태로 저장합니다.
HashTable 특징
- Key는 중복 허용 안함: 중복된 Key는 덮어씁니다.
- Value는 중복 허용: 동일한 Value는 여러 Key와 연결될 수 있습니다.
- 순서 없음: 데이터의 저장 순서를 보장하지 않습니다.
2-1. HashTable 기본 사용법
private static void usingHashTable() {
Hashtable<String, String> map = new Hashtable<>();
// 데이터 추가
map.put("101", "Java");
map.put("202", "C++");
map.put("303", "Python");
// 데이터 출력
System.out.println("HashTable: " + map); // {101=Java, 202=C++, 303=Python}
// 데이터 검색
System.out.println("Key 202의 값: " + map.get("202")); // C++
// 데이터 변경
map.put("202", "C#"); // 기존 값을 덮어씀
System.out.println("변경된 HashTable: " + map); // {101=Java, 202=C#, 303=Python}
// 특정 키 포함 여부 확인
System.out.println("Key 303 존재? " + map.containsKey("303")); // true
System.out.println("Key 404 존재? " + map.containsKey("404")); // false
// 특정 값 포함 여부 확인
System.out.println("Value 'Java' 존재? " + map.containsValue("Java")); // true
}
실행 결과
HashTable: {101=Java, 202=C++, 303=Python}
Key 202의 값: C++
변경된 HashTable: {101=Java, 202=C#, 303=Python}
Key 303 존재? true
Key 404 존재? false
Value 'Java' 존재? true
2-2. 사용자 정의 클래스와 HashTable
HashTable은 사용자 정의 객체를 저장할 때 hashCode와 equals 메서드를 오버라이드해야 동등성을 비교할 수 있습니다.
class ClassRoom {
String subject;
String roomName;
public ClassRoom(String subject, String roomName) {
this.subject = subject;
this.roomName = roomName;
}
@Override
public int hashCode() {
return subject.hashCode(); // 과목명으로 해시 생성
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ClassRoom) {
ClassRoom other = (ClassRoom) obj;
return this.subject.equals(other.subject); // 과목명이 같으면 동등
}
return false;
}
}
private static void customClassHashTable() {
Hashtable<String, ClassRoom> map = new Hashtable<>();
map.put("101", new ClassRoom("Java", "R101"));
map.put("202", new ClassRoom("Python", "R202"));
// 데이터 확인
System.out.println(map.get("101")); // ClassRoom [subject=Java, roomName=R101]
}
3. HashSet vs. HashTable
특징 | HashSet | HashTable |
저장 형태 | 값(Value)만 저장 | 키(Key)-값(Value) 쌍으로 저장 |
중복 허용 여부 | 값 중복 허용 안함 | 키 중복 허용 안함 |
순서 | 저장 순서 없음 | 저장 순서 없음 |
Null 허용 여부 | Null 값 저장 가능 | Null 키, 값 허용 안함 |
정리
- HashSet: 중복 없는 데이터 저장 및 집합 연산에 적합.
- HashTable: 키-값 형태로 데이터를 관리하며, 검색 및 수정이 빠름.
- 사용자 정의 객체: hashCode와 equals를 오버라이드해 동등성을 설정해야 함.
Java의 HashSet과 HashTable은 다양한 상황에서 유용하게 사용할 수 있는 강력한 도구입니다. 위 예제를 따라 하며 개념을 익혀보세요! 😊
반응형
'개발 > JAVA' 카테고리의 다른 글
Java 자료구조: 스택(Stack)과 큐(Queue) 배우기! (16) | 2025.01.09 |
---|---|
Java 컬렉션: List 인터페이스와 ArrayList 활용법 (8) | 2025.01.08 |
Java의 기본 클래스 Object: 객체의 기본 (2) | 2025.01.06 |
Java 기초편 - 배열 정렬과 복사 (2) | 2025.01.04 |
Java 기초편 - 열거형(Enum) : 간단한 예제로 배우는 Enum 사용법 (2) | 2025.01.03 |