Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

csct3434

equals() vs hashCode() 본문

개발 일지

equals() vs hashCode()

csct3434 2024. 2. 29. 23:15

equals()

  • 두 객체의 동등성을 비교하기 위해 오버라이딩하는 메서드
    • 동등성 : 두 객체가 동등한 정보를 가지고 있는 지(equals)
    • 동일성 : 두 객체가 동일한 객체인지 (==)
  • Object 클래스의 equals()는 기본적으로 동일성을 비교하기 때문에, 객체의 동등성을 비교하려면 equals() 메서드를 재정의해야 함

 

hashCode()

  • Object 클래스의 hashCode() 메서드는 네이티브 메서드로, 객체의 주소 값을 이용하여 생성한 해시 코드를 반환
  • 주의할 점은, 객체의 주소 값을 이용하는 것이지 주소 값 자체가 해시 코드 값이 아니라는 점이다.

equals() 메서드 오버라이딩 시 주의사항

  • Object 클래스의 hashCode() 메서드 주석을 보면, 빨간 글씨로 equals() 메서드를 언급하고 있다
  • 위의 내용을 간단히 요약하면 아래와 같다

  • 두 객체가 equals()에서 true라면, 두 객체의 hashCode() 값은 같아야 한다
  • 두 객체가 equals()에서 false라면, hashCode()값은 같아도 되고 달라도 된다.
    • 하지만, 해시 테이블에서의 성능을 높이려면 서로 다른 hashCode() 값을 가지는 것이 좋다

equals()와 hashCode()를 함께 오버라이딩 해야 하는 이유

  • 자바에서 해시 기반의 컬렉션 프레임워크는 인덱스로 hashCode()를 사용하고 버킷 내부에서 equals() 사용하여 동등성을 평가합니다
  • hashCode()가 재정의 되어있지 않다면, 개발자가 생각하기에는 동등한 두 객체가(즉, equals() 상으로는 true인 객체가) 서로 다른 버킷에 저장될 것입니다
  • 따라서, 개발자의 의도에 따라 해시 기반의 컬렉션 프레임워크를 사용하려면 equals()와 hashCode() 메서드는 동일한 기준으로 함께 재정의 되어야 합니다

출처

☕ 자바 equals / hashCode 오버라이딩 - 완벽 이해하기