개발/JAVA

Java 컬렉션: HashSet과 HashTable 사용법

예니03 2025. 1. 7. 11:15
반응형

Java의 HashSetHashTable은 데이터를 효율적으로 관리하고 빠르게 검색할 수 있는 컬렉션 클래스입니다. 이번 글에서는 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]

핵심 포인트

  1. 중복 제거: hs.add("Java")를 두 번 호출해도 하나만 저장됩니다.
  2. 포함 여부 확인: contains() 메서드를 사용해 특정 값이 존재하는지 확인합니다.
  3. 삭제: 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은 사용자 정의 객체를 저장할 때 hashCodeequals 메서드를 오버라이드해야 동등성을 비교할 수 있습니다.

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 키, 값 허용 안함

 

정리

  1. HashSet: 중복 없는 데이터 저장 및 집합 연산에 적합.
  2. HashTable: 키-값 형태로 데이터를 관리하며, 검색 및 수정이 빠름.
  3. 사용자 정의 객체: hashCode와 equals를 오버라이드해 동등성을 설정해야 함.

Java의 HashSetHashTable은 다양한 상황에서 유용하게 사용할 수 있는 강력한 도구입니다. 위 예제를 따라 하며 개념을 익혀보세요! 😊

반응형