본문으로 건너뛰기
최서희Frontend Engineer
← 블로그

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 계정으로 댓글을 남길 수 있어요.