<aside> 💡

equals를 재정의한 클래스는 hashCode도 재정의 해야함!!!!

그렇지 않으면 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제가 발생

</aside>

hashCode 일반 규약

논리적으로 같은 객체는 같은 해시코드를 반환해야함

동치인 모든 객체에서 똑같은 hashCode 를 반환하게 한다면?

@Override
public int hashCode() {
	return 42;
}

좋은 해시 함수라면 서로 다른 인스턴스에 다른 해시코드를 반환

  1. int 변수인 result를 선언한 후 값을 c로 초기화
  2. 해당 객체의 나머지 핵심 필드인 f 각각에 대해 다음 작업을 수행
    1. 해당 필드의 해시코드 c 를 계산
      • 기본 타입 필드라면, Type.hashCode(f)를 수행한다. 여기서 Type은 해당 기본타입의 박싱 클래스
      • 참조 타입 필드면서, 이 클래스의 equals 메소드가 이 필드의 equals를 재귀적으로 호출하여 비교한다면, 이 필드의 hashCode를 재귀적으로 호출
      • 필드가 배열이라면, 핵심 원소 각각을 별도 필드처럼 다룬다.모든 원소가 핵심 원소라면 Arrays.hashCode를 사용
    2. 단계 2.b에서 계산한 해시코드 c로 result를 갱신한다.
      • result = 31 * result + c;
  3. result를 반환

주의할 점