▶ 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 다
'의문점 공부하기 > 📌 Java' 카테고리의 다른 글
📌 자바에서 문자열을 조작하는 클래스는 무엇이 있을까? 각 클래스의 차이점은? (0) | 2023.06.07 |
---|---|
📌 자바에서 Math.round(-1.5)는 무엇을 의미할까? (0) | 2023.06.05 |
📌 Java에서 final의 기능은 무엇인가? (0) | 2023.06.02 |
📌 ==와 equals의 차이점은 무엇일까? (2) | 2023.05.31 |
📌 JDK와 JRE의 차이점은 뭘까? (0) | 2023.05.30 |