Notice
Recent Posts
Recent Comments
Link
변수의 기록
(java) 값이 중복되는 객체를 제거 hash set , HashMap 사용 본문
사용자 정의 객체와 HashSet, HashMap에서의 중복 처리
자바에서 HashSet이나 HashMap 같은 해시 기반 컬렉션은 객체의 중복 여부를 판단하기 위해 내부적으로 hashCode()와 equals() 메서드를 사용한다. 이 글에서는 개발자가 직접 정의한 클래스를 해시 테이블에 넣을 때, 중복을 어떻게 처리하고, 주의할 점은 무엇인지 정리한다.
1. 중복 판단 기준
HashSet이나 HashMap은 객체를 저장하거나 검색할 때 다음 절차를 따른다:
- hashCode()로 해시값을 계산 → 어느 버킷(인덱스)에 저장할지 결정
- 해당 버킷 안에서 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은 내부적으로 이 메서드들을 자동 호출하므로, 개발자는 이 규칙을 지키는 것만으로도 올바른 중복 처리가 가능하다
'자바 > 자바' 카테고리의 다른 글
java(자바)- 제네릭(Generic)의 구조적 이해 – 타입, 힙/스택, 참조형까지 완전 정리 (1) | 2025.06.15 |
---|---|
(JAVA) 불변 객체 (0) | 2025.04.25 |
(Java) Set의 구조와 활용 - ADT 관점으로 이해 (0) | 2025.04.23 |
(Java) Map 구조 정리 - ADT 관점에서의 이해 (****별 다섯개****) (0) | 2025.04.23 |
(java) 기본 배열(Array), 동적 배열(Dynamic Array), 연관 배열(Associative Array)의 개념과 내부 동작 원리를 설명 (0) | 2025.04.22 |