[JAVA] hashCode()메서드 오버라이딩

GyeongEun Kim·2021년 6월 28일
3

hashCode()를 오버라이딩 해야하는 이유

앞서 객체를 System.out.print()의 매개변수로 넣어주면 Object클래스의 toString()이 호출되어서 클래스이름@해시코드값이 나오는 것을 배웠다.
이 때 해시코드 값은 각 인스턴스마다 고유하게 가지는 값으로 자바 가상 머신(JVM)이 힙 메모리에 저장한 '인스턴스의 주소값'이다. 그렇기 때문에

equals()메서드를 오버라이딩 했다면 hashCode()메서드 또한 재정의 해야한다.

논리적으로 두 인스턴스가 같다면 같은 해시코드를 반환해야하기 때문이다.

String과 Integer클래스의 hashCode()

String클래스와 Integer클래스의 equals()는 이미 오버라이딩이 되어있다. 그러므로 hashCode()또한 이미 오버라이딩 되어있다.

  • String클래스에서의 hashCode()는 equals()가 리턴한 값이 true이면 같은 hashCode값을 리턴하고, false이면 두 hashCode값이 다르게 리턴되도록 오버라이딩되어 있다.

  • Integer클래스에서의 hashCode()는 해당 정수 값을 리턴하도록 오버라이딩 되어 있다.

hashCode() 오버라이딩 하여 사용하기

전 게시물에서 Student클래스의 equals를 오버라이딩하는 코드를 작성하였다. 여기서 학번이 같으면 논리적으로 같은 학생으로 판단하도록 코드를 구현하였다.

일반적으로 hashCode()를 재정의 할 때는 equals()에서 논리적으로 같다는 것을 구현할 때 사용한 멤버변수를 활용하는 것이 좋다.

따라서 여기서는 학번을 반환하는 것이 가장 합리적이다.

@Override
public int hashCode() {
  return studentId;
}

hashCode를 오버라이딩 했을 때 실제 인스턴스의 주소값은?

System.identity.HashCode() 메서드를 사용하면 실제 메모리 주소값을 알 수 있다.

profile
내가 보려고 쓰는 글

1개의 댓글

큰 도움 됐습니다! 감사합니다!

답글 달기