Dandy Now!
  • [Java ] `System.identityHashCode()`와 `hashCode()` 메서드의 차이점
    2025년 06월 14일 23시 17분 01초에 업로드 된 글입니다.
    작성자: DandyNow
    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
    반응형
    댓글