변수의 기록

(java) 값이 중복되는 객체를 제거 hash set , HashMap 사용 본문

자바/자바

(java) 값이 중복되는 객체를 제거 hash set , HashMap 사용

불광동 물주먹 2025. 4. 24. 00:53

사용자 정의 객체와 HashSet, HashMap에서의 중복 처리

자바에서 HashSet이나 HashMap 같은 해시 기반 컬렉션은 객체의 중복 여부를 판단하기 위해 내부적으로 hashCode()와 equals() 메서드를 사용한다. 이 글에서는 개발자가 직접 정의한 클래스를 해시 테이블에 넣을 때, 중복을 어떻게 처리하고, 주의할 점은 무엇인지 정리한다.

1. 중복 판단 기준

HashSet이나 HashMap은 객체를 저장하거나 검색할 때 다음 절차를 따른다:

  1. hashCode()로 해시값을 계산 → 어느 버킷(인덱스)에 저장할지 결정
  2. 해당 버킷 안에서 equals()로 같은 객체인지 판단

즉, 같은 해시값을 가지면서 equals()도 true여야 동일한 객체로 간주되어 중복 저장이 되지 않는다.

2. 개발자가 해야 할 일

사용자 정의 클래스를 사용할 경우, 반드시 hashCode()와 equals() 메서드를 오버라이딩해야 한다. 오버라이딩하지 않으면 Object 클래스의 기본 구현이 사용되며, 이는 단순히 메모리 주소(참조 값) 를 비교하므로 논리적 중복 판단이 되지 않는다.

 

3. 주의할 점

  • 객체를 컬렉션에 넣은 후, 내부 상태(x, y 등)가 바뀌면 안 된다.
    → 해시값이 달라져서 찾을 수 없게 된다.
    → HashSet.contains()가 false를 반환하게 된다.
  • 이를 방지하려면 중복 판단에 사용되는 필드에는 final을 붙여 변경을 막는 것이 좋다.
public final int x;
public final int y;

 

사진 출처 - 유튜브 쉬운코드

 

  • 또는 아예 객체를 불변 객체(immutable object) 로 설계하는 것도 좋은 방법이다.

4. 결론

  • 객체 중복코드 확인 필요시 hashCode()와 equals()는 반드시 함께 오버라이딩할 것
  • 중복 기준 필드는 변경되지 않도록 final 또는 불변 객체로 관리
  • HashSet, HashMap은 내부적으로 이 메서드들을 자동 호출하므로, 개발자는 이 규칙을 지키는 것만으로도 올바른 중복 처리가 가능하다