본문 바로가기
Java

[Java] hashcode() (feat. equals())

by 왕타오 2023. 11. 22.

hashCode

hashcode 메소드는 객체의 주소값을 변환하여 생성한 객체의 고유한 정수값이다.

따라서 두 객체가 동일 객체인지 비교할 때 사용할 수 있다.

 

서로 다른 Book 객체는 주소값이 다르기에 hashCode가 다르다.

 

 

서로 다른 String 객체도 문자열이 같으면 hashCode가 같다.

 

 

그렇다면 hashCode()equals()는 어떤 관계를 가지고 있을까??

동일한 객체동일한 메모리 주소를 가진것 처럼 보겠다(동일성)라는 것을 의미하므로, 동일한 객체동일한 해시코드를 가져야 한다.

equals와 hashCode의 관계를 정의하면 다음과 같다.

  • 두 객체가 equals()에 의해 동일하다면, 두 객체의 hashCode() 값도 일치해야 한다.
  • 두 객체가 equals()에 의해 동일하지 않다면, 두 객체의 hashCode() 값은 일치하지 않아도 된다.

그런데 프로그래밍을 하다보면 동일한 객체가 메모리 상에 여러 개 존재해야하는 경우가 있다.

해당 객체는 서로 다른 메모리에 띄워져있으므로 동일한(identity) 객체는 아니다.

하지만 프로그래밍 상에서 같은 객체로 인식되어야 하는데,
이 때 우리는 주소가 아닌 값으로 객체를 비교하도록 equals 메소드를 override 해줘야 한다.

 

위에서 동일한 객체는 동일한 메모리 주소를 갖는 다는것을 의미한다고 했다. 

그렇기 때문에 우리가 equals() 메소드를 오버라이드 했다면, hashCode() 메소드도 함께 override 되어야 한다.

 

만약 hashCode() 메소드도 함께 override 하지 않으면 어떻게 될까? 

프로그래밍 상에서 동일한 객체라고 지정한 객체들이 HashMap, HashSet과 같은 자료구조에 저장이 될때 다른 객체로 인식이 된다.

 

아래 이미지는 equals 메소드와 hashCode 메소드를 오버라이딩한 예제 이다.

equals()와 hashCode()의 Override

 

Book이라는 클래스에 equals 메소드와 hashCode 메소드를 오버라이딩 했기 때문에 

아래 이미지와 같이 주소 값이 아닌 값으로 비교한 결과가 나오게된다.

 

 

정리

equalshashCode는 모든 Java 객체의 부모 객체인 Object 클래스에 정의되어 있다.

Java의 모든 객체는 Object 클래스에 정의된 equals와 hashCode 함수를 상속받고 있다.

hashcode 는 객체의 주소값을 변환하여 생성한 객체의 고유한 정수값이다.

동일한 객체 동일한 메모리 주소를 갖는다는 것을 의미하므로, 동일한 객체 동일한 해시코드를 가져야 한다.

hashCode, equals 는 항상 함께 override 되어야 한다.