csct3434
equals() vs hashCode() 본문
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() 메서드는 동일한 기준으로 함께 재정의 되어야 합니다
출처
'개발 일지' 카테고리의 다른 글
첫 서비스 출시기 (feat. EC2 Auto Scaling, Aurora Serverless) (0) | 2024.03.22 |
---|---|
페이지네이션 성능 비교 : LIMIT-OFFSET vs NO-OFFSET (0) | 2024.03.12 |
MySQL 더미 데이터 적재 속도 비교 (1) | 2024.02.29 |
첫 오픈소스 기여 (feat.AssertJ) (0) | 2024.02.29 |
MySQL 엔티티 시간 불일치 오류 (0) | 2024.02.29 |