Java hashCode() 는 메모리 주소 값 기반일까?

Gunjoo Ahn·2023년 8월 22일
1
post-custom-banner

hashCode()는 주소 값 기반일까?

꽤나 많은 자료들이 Java 객체의 메모리 주소를 기반으로 hashCode()가 동작한다고 설명하고 있는 것을 확인하였다. 예전에 처음 hashCode()를 접했을 때, hashCode()가 JVM 위에서 Java 객체의 고유한 값을 의미하며 주소 값 기반이라 학습했던 것으로 기억한다. 고유한 값이라면 메모리 주소 값일 수도 있겠거니 하고 넘어갔었다.

hashCode()를 재정의해서 사용하기 위하여 default hashCode() 로직을 알아두고 싶었다. Default hashCode()로직을 서치하면서 가벼운 의문점이 생겼는데

GC를 하면서 메모리 주소 값 계속 바뀌지 않나? 메모리 주소 값이랑 시간이랑 같이 해싱하나?

등의 의문점을 가지면서 서치를 했었다.

그래서 정말 주소 값 기반인지 서치를 해보니 의견이 분분한 것으로 보였다. 그 중에서 정리가 잘 된 포스트의 링크를 가져왔다.

hashCode는 정말 메모리주소와 관련이 있을까? - Sera Lee

주소 값, 참조 값

그런데 왜 사람들이 당연하게 주소 값이란 말을 쓰고 있는 것일까? 생각해보니 당장 읽고 있는 책인 자바 ORM 표준 JPA 프로그래밍 이라는 책에서도 == 주소 값 비교라 되어 있지 않았나?

다시 책을 보니

동일성 비교: 인스턴스의 참조 값을 비교, == 을 사용

아차 싶었다. 이거 주소 값이랑 참조 값이 의미하는게 다르구나!

그래서 바로 서치해보니 Java 13 스펙에서도 특정 객체에 고유한 값을 주어 참조할 수 있는 참조 값만을 명시하나, 이 것이 실제 메모리 주소 값을 이용하는지는 명시되어있지 않는 것을 확인하였다.

[Java] 참조(Reference)와 주소의 관계 - 나모찾기

요약하자면,

Default hashCode()는 OpenJDK 만 봤었을 때 memory 주소와 전혀 관계가 없다!
hashCode의 구현부는 JDK에 달려있다.

JVM 구현체 별로 다르겠지만 추상화된 것을 사용하는 우리는 JVM내에서 고유한 값을 가진 객체 ID를 반환한다는 점만 알고 있으면 된다.

학부시절 컴퓨터구조 수업을 해주셨던 교수님께서 추상화를 정말 강조하셨는데, 추상화되어 구현체마다 다 다른 것들을 볼 때마다 추상화의 중요성을 느낀다.

profile
Backend Developer
post-custom-banner

0개의 댓글