언어·프레임워크/Java

[Java ] `System.identityHashCode()`와 `hashCode()` 메서드의 차이점

DandyNow 2025. 6. 14. 23:17
728x90
반응형

System.identityHashCode()hashCode() 메서드의 차이점

자바에서 객체의 해시 코드를 얻는 두 가지 방법으로 System.identityHashCode()hashCode() 메서드가 존재한다. 이 두 메서드는 기능과 목적에서 명확한 차이를 가진다.

1. hashCode() 메서드

hashCode() 메서드는 Object 클래스에 정의되어 있으며, 모든 자바 객체가 상속받는 메서드이다.

  • 목적: 이 메서드의 주된 목적은 컬렉션(예: HashMap, HashSet)에서 객체를 효율적으로 저장하고 검색하는 데 사용되는 해시 코드를 제공하는 것이다.
  • 오버라이딩 가능: 개발자는 필요에 따라 이 메서드를 오버라이드하여 객체의 동등성 비교 로직(equals() 메서드와 일관되게)에 맞춰 커스텀 해시 코드를 반환하도록 구현할 수 있다. 예를 들어, 두 개의 String 객체가 같은 문자열 내용을 가질 경우 hashCode() 값도 같도록 오버라이드되어 있다.
  • 계약: hashCode() 메서드를 오버라이드할 때는 다음과 같은 일반적인 계약을 따라야 한다.
    • equals() 메서드가 두 객체를 같다고 판단하면, 두 객체의 hashCode() 값은 같아야 한다.
    • equals() 메서드가 두 객체를 다르다고 판단하더라도, 두 객체의 hashCode() 값이 다를 필요는 없다. 그러나 성능 향상을 위해 다른 객체는 다른 해시 코드를 반환하는 것이 바람직하다.
    • 애플리케이션 실행 중 객체의 상태가 변경되지 않는 한, 여러 번 호출해도 항상 같은 정수 값을 반환해야 한다.

2. System.identityHashCode() 메서드

System.identityHashCode() 메서드는 Object 클래스가 아닌 System 클래스에 존재하는 정적(static) 메서드이다.

  • 목적: 이 메서드는 객체의 실제 메모리 주소(또는 이에 준하는 고유 값)를 기반으로 하는 해시 코드를 반환한다. 이는 hashCode() 메서드가 오버라이드되었는지 여부와 관계없이 항상 객체 고유의 "식별" 해시 코드를 제공한다.
  • 오버라이딩 불가: 이 메서드는 오버라이드할 수 없다. 따라서 항상 자바 가상 머신(JVM)이 내부적으로 사용하는 객체의 고유 식별 값을 기반으로 한 해시 코드를 반환한다.
  • 사용 사례: 주로 hashCode() 메서드가 오버라이드된 경우에도 객체의 진정한 고유성을 확인하거나, 디버깅 목적으로 객체의 물리적 식별자를 알고 싶을 때 사용된다. 예를 들어, equals()는 다르지만 hashCode()는 같은 두 객체를 구분하고 싶을 때 유용하다.

3. 주요 차이점 요약

  • 오버라이딩 여부: hashCode()는 오버라이딩 가능하지만, System.identityHashCode()는 오버라이딩이 불가능하다.
  • 반환 값의 의미: hashCode()는 객체의 논리적인 동등성(개발자가 정의)을 기반으로 한 해시 코드를 반환하는 반면, System.identityHashCode()는 객체의 물리적인 식별자(메모리 주소 등)를 기반으로 한 고유 해시 코드를 반환한다.
  • 사용 목적: hashCode()는 주로 컬렉션 프레임워크에서 객체를 효율적으로 관리하기 위해 사용되고, System.identityHashCode()는 객체의 고유 식별자를 얻거나 디버깅 시 객체를 구별하는 데 사용된다.

결론적으로, hashCode()는 객체의 내용 기반 해시 코드를 제공하며 오버라이딩을 통해 커스터마이징될 수 있다. 반면, System.identityHashCode()는 객체의 주소 기반 해시 코드를 제공하며 항상 고유한 식별자로 사용된다.

728x90
반응형