hashCode()
는 주소 값 기반일까?꽤나 많은 자료들이 Java 객체의 메모리 주소를 기반으로 hashCode()
가 동작한다고 설명하고 있는 것을 확인하였다. 예전에 처음 hashCode()
를 접했을 때, hashCode()
가 JVM 위에서 Java 객체의 고유한 값을 의미하며 주소 값 기반이라 학습했던 것으로 기억한다. 고유한 값이라면 메모리 주소 값일 수도 있겠거니 하고 넘어갔었다.
hashCode()
를 재정의해서 사용하기 위하여 default hashCode()
로직을 알아두고 싶었다. Default hashCode()
로직을 서치하면서 가벼운 의문점이 생겼는데
GC
를 하면서 메모리 주소 값 계속 바뀌지 않나? 메모리 주소 값이랑 시간이랑 같이 해싱하나?
등의 의문점을 가지면서 서치를 했었다.
그래서 정말 주소 값 기반인지 서치를 해보니 의견이 분분한 것으로 보였다. 그 중에서 정리가 잘 된 포스트의 링크를 가져왔다.
그런데 왜 사람들이 당연하게 주소 값이란 말을 쓰고 있는 것일까? 생각해보니 당장 읽고 있는 책인 자바 ORM 표준 JPA 프로그래밍
이라는 책에서도 ==
주소 값 비교라 되어 있지 않았나?
다시 책을 보니
동일성 비교: 인스턴스의
참조 값
을 비교,==
을 사용
그래서 바로 서치해보니 Java 13 스펙에서도 특정 객체에 고유한 값을 주어 참조할 수 있는 참조 값
만을 명시하나, 이 것이 실제 메모리 주소 값을 이용하는지는 명시되어있지 않는 것을 확인하였다.
Default
hashCode()
는 OpenJDK 만 봤었을 때 memory 주소와 전혀 관계가 없다!
hashCode의 구현부는 JDK에 달려있다.
JVM 구현체 별로 다르겠지만 추상화된 것을 사용하는 우리는 JVM내에서 고유한 값을 가진 객체 ID를 반환한다는 점만 알고 있으면 된다.
학부시절 컴퓨터구조 수업을 해주셨던 교수님께서 추상화를 정말 강조하셨는데, 추상화되어 구현체마다 다 다른 것들을 볼 때마다 추상화의 중요성을 느낀다.