equals와 hashCode를 함께 구현해야 HashSet과 HashMap이 제대로 동작하는 이유 빠른 답 equals 를 재정의했다면 hashCode 도 같은 기준 필드로 재정의해야 합니다. HashSet 과 HashMap 은 먼저 hashCode 로 후보 위치를 좁힌 뒤 equals 로 최종 비교합니다. equals 가 true 인 두 객체는 항상 같은 hashCode 를 반환해야 합니다. 해시 계산에 쓰이는 필드는 컬렉션에 넣은 뒤 바뀌지 않는 값으로 잡는 편이 안전합니다. 목차 흐름으로 보기 값, 상태, 오류 유형 구분하기 동일성과 동등성 equals만 재정의했을 때 생기는 결과 equals와 hashCode를 함께 구현하기 해시 충돌과 흔한 오해 변경 가능한 필드를 기준으로 삼을 때의 위험 자동 점검과 구성 예시 디버깅할 때 볼 출력 흐름으로 보기 흐름 다이어그램 해시 기반 컬렉션은 객체를 넣거나 찾을 때 모든 원소를 처음부터 끝까지 equals 로 비교하지 않습니다. 먼저 hashCode 를 이용해 내부 저장 공간 중 확인할 위치를 좁힙니다. 그다음 같은 위치에 있는 후보들만 equals 로 비교합니다. 이 순서 때문에 equals 만 재정의한 객체는 일반 비교에서는 같아 보여도 HashSet , HashMap 안에서는 서로 다른 객체처럼 다뤄질 수 있습니다. equals 가 호출되기 전에 hashCode 가 다른 버킷을 가리켜 버리면, 같은 값인지 확인할 기회가 생기지 않기 때문입니다. 값, 상태, 오류 유형 구분하기 Java에서 객체 비교를 이야기할 때는 값, 상태, 오류 유형을 나누어 보면 덜 헷갈립니다. 값은 객체를 논리적으로 같다고 볼 때 사용하는 기준입니다. 예를 들어 구독자를 email 과 category 로 구분한다면, 두 필드가 같은 두 객체는 같은 구독자라고 볼 수 있습니다. 상태는 객체가 현재 들고 있는 필드 값입니다. email 이나 category 가 바뀔 수 있는 필드라면 객체의 동등성도 실행 ...