Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 HashSet의 중요성: 해싱 기반 데이터 관리의 이해

자바의 HashSet은 해싱(Hashing) 기법을 기반으로 데이터를 저장하고 관리하는 대표적인 컬렉션입니다. 해싱은 요소의 해시 코드를 이용해 저장 위치를 결정하기 때문에 데이터의 추가, 삭제, 검색을 매우 빠른 속도로 처리할 수 있다는 강력한 장점이 있습니다.

아래 예제를 통해 HashSet이 해싱을 활용해 데이터를 처리하는 과정을 살펴보겠습니다.

예제 코드

import java.util.*;
public class Demo{
    private final String f_str, l_str;
    public Demo(String f_str, String l_str){
        this.f_str = f_str;
        this.l_str = l_str;
    }
    public boolean equals(Object o){
        if (o instanceof Demo)
            return true;
        Demo n = (Demo)o;
        return n.f_str.equals(f_str) && n.l_str.equals(l_str);
    }
    public static void main(String[] args){
        Set<Demo> my_set = new HashSet<Demo>();
        my_set.add(new Demo("Joe", "Goldberg"));
        System.out.println("Added a new element to the set");
        System.out.println("Does the set contain a new instance of the object? ");
        System.out.println(my_set.contains(new Demo("Jo", "Gold")));
    }
}

실행 결과

Added a new element to the set
Does the set contain a new instance of the object?
false

코드 설명

'Demo' 클래스는 final로 선언된 문자열 필드와 이를 초기화하는 생성자를 포함하고 있습니다. equals 메서드는 전달받은 객체가 특정 클래스의 인스턴스인지 확인하며, 인스턴스가 아니라면 객체를 해당 클래스로 캐스팅한 뒤 equals 함수를 통해 필드 값을 비교합니다.

main 메서드에서는 새로운 Set을 생성하고 객체 인스턴스를 하나 추가한 후, instanceof 연산자 기반의 동등성 검사를 통해 해당 객체가 집합에 존재하는지 확인합니다.

핵심 포인트

실행 결과가 false로 나오는 이유는 equals 메서드만 재정의하고 hashCode 메서드를 함께 재정의하지 않았기 때문입니다. HashSet은 내부적으로 해시 테이블을 사용하며, 요소를 검색할 때 먼저 hashCode()로 저장 위치(버킷)를 결정한 후 equals()로 최종 비교를 수행합니다.

따라서 equals를 재정의할 때는 반드시 hashCode도 함께 재정의해야 논리적으로 동일한 객체가 집합에서 올바르게 검색됩니다. 이는 HashSet을 활용할 때 가장 흔히 저지르는 실수 중 하나이며, 해싱 기반 컬렉션의 동작 원리를 이해하는 데 반드시 알아야 할 중요한 개념입니다.