hashCode와 메모리 주소의 차이
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

Java] 📫 hashCode == 메모리 주소일까?

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

Java 개발자, JVM 내부 동작 원리 이해 필요자

핵심 요약

  • hashCode()는 메모리 주소가 아닌 주소를 기반으로 계산한 수치를 반환
  • System.identityHashCode()hashCode()는 동일한 값을 반환 (Object 클래스의 기본 구현 시)
  • hashCode()메모리 주소는 값이 다름 (2060468723 vs 30331364672)

섹션별 세부 요약

1. hashCode와 메모리 주소의 차이점

  • hashCode()는 JVM이 내부적으로 계산한 해시 값이며, 메모리 주소와 직접적으로 같지 않다.
  • System.identityHashCode()는 객체의 고유 식별자로, hashCode()와 동일한 값을 반환한다.
  • toString() 메서드에서 @ 뒤의 값은 hashCode()의 16진수 변환 값과 동일하다.

2. JVM 내부 동작 원리

  • hashCode()native 메서드로, JVM의 네이티브 코드에서 구현된다.
  • JVM_ENTRY(jint, JVM_IHashCode(...)) 함수를 통해 해시 코드가 계산되며, FastHashCode 메커니즘을 사용한다.
  • ObjectSynchronizer::FastHashCode 함수는 객체의 락 상태를 확인한 후 해시 값을 반환한다.

3. hashCode의 일반 규약

  • 동일한 객체에 대해 hashCode()는 동일한 값을 반환해야 한다.
  • equals()true인 두 객체는 hashCode()도 동일해야 한다.
  • equals()false인 두 객체는 hashCode()가 다를 필요는 없지만, 성능 최적화를 위해 다를 수 있다.

결론

  • hashCode()는 메모리 주소와 다름을 인지하고, 해시 테이블(예: HashMap)에서의 동작을 이해해야 한다.
  • System.identityHashCode()hashCode()가 동일한 값을 반환하는 이유는 Object 클래스의 기본 구현 방식에 기인한다.
  • JVM 버전에 따라 hashCode()의 내부 구현 방식이 변경될 수 있으므로, 구체적인 동작은 문서와 JVM 소스 코드를 참조해야 한다.