방명록
- [Java ] `System.identityHashCode()`와 `hashCode()` 메서드의 차이점2025년 06월 14일 23시 17분 01초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
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반응형'언어·프레임워크 > Java' 카테고리의 다른 글
[Java] Wrapper 클래스를 사용하는 이유와 실제 예제 (1) 2025.06.15 [Java] 자바의 컬렉션은 왜 '프레임워크'라고 불릴까? 라이브러리와의 결정적 차이! (1) 2025.06.15 [Java] 인터페이스 개념을 USB로 이해하기 (2) 2025.06.08 [Java] 정보 은닉과 캡슐화: 객체 지향 프로그래밍의 핵심 원칙 (3) 2025.06.08 [Java] 자바에서 Iterator를 사용하는 이유 (0) 2025.03.01 다음글이 없습니다.이전글이 없습니다.댓글 - 목적: 이 메서드의 주된 목적은 컬렉션(예: