의문점 공부하기/📌 Java

📌 두 객체가 동일한 hashCode를 가지면 Equals()가 참이어야 한다?!

아리빠 2023. 6. 1. 16:54

▶ hashCode 란?! 

객체를 식별 할 수 있는 하나의 고유 정수 값

 

앞서  '==' 과 'equals'의 차이를 비교했는데,

'==' 는  reference가 같은지 검사했다. 이는 동일성 : 주소 값을 비교 ( == ) ,

equals는 내용이 같은지 검사 했다. 이는 동등성 : 객체 내부의 값을 비교 (equals와 hashCode를 재정의 하여 비교)

 

equals로 같은 객체라면 반드시 hashCode도 같은 값이여야 한다

하지만 반대로 hashCode가 같은 값이더라도 equals로 같은 객체가 아닐 수 있다는 것을 유의해야 한다.

++같은 파라미터를 이용해야 한다 

+++equals()와 hashCode는 모든 Java 객체의 부모인 Object 클래스에 정의되어 있기 때문에, Java의 모든 객체는 Object 클래스의 equals와 hashCode()를 상속받는다.

 

 

equals와 hashCode를 함께 재정의하는 이유는?

 

만약 equals()와 hashcode() 중 하나만 재정의 한다면?

hashcode()를 재정의 하지 않으면 같은 값 객체라도 해시값이 다를 수 있다.

따라서 HashTable에서 해당 객체가 저장된 버킷을 찾을 수 없게된다.

 

반대로 equals()를 재정의하지 않으면 hashcode()가 만든 해시값을 이용해 객체가 저장된 버킷을 찾을 수는 있지만 해당 객체가 자신과 같은 객체인지 값을 비교할 수 없기 때문에 null을 리턴하게 된다. 따라서 역시 원하는 객체를 찾을 수 없다.

 

따라서 객체의 정확한 동등 비교를 위해서는 Object의 equals() 메소드와 hashCode()메소드를 같이 재정의해서 논리적 동등 객체일경우 동일한 해시코드가 리턴되도록 해야한다.

 

▶두 객체가 동일한 hashCode를 가지면 Equals()가 참이어야 한다?! 에 대한 대답은 NO 다