앞서 객체를 System.out.print()
의 매개변수로 넣어주면 Object클래스의 toString()
이 호출되어서 클래스이름@해시코드값
이 나오는 것을 배웠다.
이 때 해시코드 값은 각 인스턴스마다 고유하게 가지는 값으로 자바 가상 머신(JVM)이 힙 메모리에 저장한 '인스턴스의 주소값'이다. 그렇기 때문에
equals()메서드를 오버라이딩 했다면 hashCode()메서드 또한 재정의 해야한다.
논리적으로 두 인스턴스가 같다면 같은 해시코드를 반환해야하기 때문이다.
String클래스와 Integer클래스의 equals()는 이미 오버라이딩이 되어있다. 그러므로 hashCode()또한 이미 오버라이딩 되어있다.
String
클래스에서의 hashCode()는 equals()가 리턴한 값이 true이면 같은 hashCode값을 리턴하고, false이면 두 hashCode값이 다르게 리턴되도록 오버라이딩되어 있다.
Integer
클래스에서의 hashCode()는 해당 정수 값을 리턴하도록 오버라이딩 되어 있다.
전 게시물에서 Student클래스의 equals를 오버라이딩하는 코드를 작성하였다. 여기서 학번이 같으면 논리적으로 같은 학생으로 판단하도록 코드를 구현하였다.
일반적으로 hashCode()를 재정의 할 때는 equals()에서 논리적으로 같다는 것을 구현할 때 사용한 멤버변수를 활용하는 것이 좋다.
따라서 여기서는 학번
을 반환하는 것이 가장 합리적이다.
@Override
public int hashCode() {
return studentId;
}
System.identity.HashCode()
메서드를 사용하면 실제 메모리 주소값을 알 수 있다.
큰 도움 됐습니다! 감사합니다!