티스토리 뷰
사내 프로젝트를 진행하다가 테스트 코드를 작성하던 도중 두 객체의 값은 같았는데, 다르다는 에러가 계속해서 발생하게 되었다. 그래서 equals()를 재정의 하지 않아서 발생했던 문제라고 인식하게 되었고, equals()와 hashcode()를 재정의해서 문제를 해결했다. 여기서 끝이 아니라 equals()와 hashcode()를 왜 같이 재정의해야 하는지 간단히 정리하려고 한다.
equals()는 언제 정의해야 할까?
객체를 기준으로 예를 들자면, equals()는 두 개의 객체가 있고, 두 객체의 값의 동등성을 비교할 때 사용한다.
hashcode()는 언제 정의해야 할까?
equals()만 재정의 한다고 해서 객체의 값이 동등하다고 할 수는 없다. 객체의 값이 동등하다고 하더라도 해시 값은 다를 수 있기 때문이다. 이를 해결하기 위해 반드시 hashcode()를 재정의해야 한다. 해시 코드는 객체의 고유한 주소 값을 int 값으로 변환하고, 객체마다 다른 값을 가지고 있다. 그리고 두 객체의 동등성을 판별할 때, hashcode()의 리턴 값이 일치한 지 먼저 판단하고, 그다음에 equals()의 리턴 값이 true여야 논리적으로 같은 객체라고 판단한다.
주의할 점
위의 이미지 흐름에서 알 수 있겠지만, hashcode()의 리턴 값이 같았지만, equals()의 리턴 값은 다를 수 있으며, 이 때는 다른 객체라고 판단하는 점을 명심해야 한다. 즉, hashcode()의 리턴 값이 같다고 해서 equals()의 리턴 값이 반드시 true는 아니다.
정리
equals()를 통해 객체 값의 동등성을 비교하려고 한다면, 객체의 고유 주소 값도 일치해야 동등한 객체라고 판단한다. 따라서 hashcode()도 반드시 재정의 해야 한다.
참고
https://tecoble.techcourse.co.kr/post/2020-07-29-equals-and-hashCode/