Backend
[매일메일] equals와 hashCode는 왜 함께 재정의해야 할까요?
· 4분 읽기
equals와 hashCode는 왜 함께 재정의해야 할까요?
1. 직접 조사(구글링, 공식문서, 기술 포스팅 등으로 학습)
1) 객체 비교: 동일성과 동등성
- 자바에서 객체 비교는 두 가지 방식이 있다:
- ==는 동일성(Identity)을 비교한다. 즉, 같은 객체 인스턴스인지 확인하는 연산자다.
- equals()는 동등성(Equality)을 비교한다. 즉, 내용이 같은지 판단하는 메서드다.예를 들어 new User("kim") 두 개를 만들면, ==는 false지만 equals()는 true일 수 있다.
2) equals()의 의미
- 객체가 의미상으로 같은지를 판단하는 메서드다.
- 기본 구현은 ==처럼 작동하지만, 의미 있는 비교를 위해 오버라이드한다.
- 주로 두 객체가 논리적으로 같은 상태를 가졌는지 판단하는 데 사용된다.
3) hashCode()의 의미
- 객체를 해시 테이블의 **버킷(bucket)**에 배치하기 위한 정수값을 반환한다.
- 해시 기반 컬렉션(HashMap, HashSet)은 이 값을 사용해 객체를 빠르게 찾는다.
- 같은 의미의 객체는 같은 해시코드를 가져야 한다.
4) equals()와 hashCode()의 관계
- equals()가 true이면 두 객체의 hashCode()도 반드시 같아야 한다.
- 하지만 hashCode()가 같다고 해서 equals()가 true인 것은 아니다.
- 이 규칙은 해시 기반 컬렉션이 제대로 작동하기 위해 반드시 지켜져야 한다.
5) 컬렉션에서의 역할
해시 기반 컬렉션(HashMap, HashSet)은
- hashCode()를 사용해 저장 위치(버킷)를 찾는다.
- 해당 버킷 내부에서 equals()로 실제 동일한 객체인지 판단한다.
정렬 기반 컬렉션(TreeMap, TreeSet)은
- compareTo()나 Comparator로 동등성과 정렬을 모두 판단한다.
→ 이 경우 equals()와의 일관성도 중요하다.
6) 주요 용어 정리
- 동일성(Identity)
- ==를 통해 같은 인스턴스인지 확인하는 개념
- 동등성(Equality)
- equals()로 의미상 같은지 판단하는 개념
- 해시 충돌(Hash Collision)
- 서로 다른 객체가 같은 hashCode()를 가짐
- 버킷(Bucket)
- 해시값이 같은 객체들이 모여 있는 저장 공간
- 불변 객체(Immutable Object)
- equals/hashCode 기준이 되는 필드가 변경되지 않는 객체
2. 정답 확인(매일메일 해설)
3. 최종 정리
equals()와 hashCode() — 개념 정리
- equals() : 객체의 **의미상 동등함(값의 같음)**을 판단
- hashCode() : **객체의 저장 위치(버킷)**를 계산하는 정수값
- 해시 기반 컬렉션(HashMap, HashSet)은→ equals()로 실제 같은 객체인지 확인한다.
- → hashCode()로 후보 위치를 찾고
- 두 메서드는 함께 작동해야 컬렉션이 올바르게 동작 함.
- 논리적으로 같은 객체는 반드시 같은 해시코드를 가져야 한다.
🔗 참고 URL
댓글
GitHub 계정으로 댓글을 남길 수 있어요.