자바의 정석[기초편]으로 공부한 내용을 정리한 글입니다.
hashCode() 메서드란?
해시코드란?
- 해시코드(hash code)는 어떤 값을 고정된 길이의 숫자로 변환한 것입니다.
- 주로 해시 기반 자료구조(예: HashMap, HashSet)에서 사용됨
- 목적: 빠르게 값을 찾기 위해
Object.hashCode() 기본 기능
- Object 클래스에 정의된 기본 hashCode()는 객체의 메모리 주소를 기반으로 해시값을 생성합니다.
- 그래서 다른 객체는 서로 다른 해시코드를 가집니다.
예제 코드 설명
public class Ex9_3 {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.hashCode()); // 96354
System.out.println(str2.hashCode()); // 96354
System.out.println(System.identityHashCode(str1)); // 271349373
System.out.println(System.identityHashCode(str2)); // 1284693
}
}
출력 문장 | 결과 | 설명 |
str1.equals(str2) | true | 문자열 "abc"는 내용이 같으므로 equals()는 true |
str1.hashCode() | 96354 | String 클래스는 내용을 기준으로 해시코드를 오버라이딩해서 동일한 내용 → 같은 해시코드 |
str2.hashCode() | 96354 | 마찬가지로 내용이 같으므로 같은 해시코드 |
System.identityHashCode(str1) | 271349373 | 객체의 실제 주소 기반 해시코드 |
System.identityHashCode(str2) | 1284693 | str2는 str1과 내용은 같지만 다른 객체이므로 주소 기반 해시코드는 다름 |
핵심 개념 정리
equals() | 내용이 같은지 비교하는 메서드 (기본은 주소 비교지만, String은 오버라이딩되어 내용 비교함) |
hashCode() | 객체의 해시코드. String은 같은 문자열 내용이면 같은 해시코드를 반환 |
System.identityHashCode() | 진짜 객체의 주소 기반 해시코드. 무조건 객체마다 다름 |
왜 해시코드가 중요한가?
- HashMap 같은 자료구조는 객체의 hashCode()와 equals()를 이용해 데이터 저장과 검색을 합니다.
- 따라서 equals()와 hashCode()는 항상 같이 오버라이딩해야 합니다.
- equals()가 true면 hashCode()도 같아야 함!
요약
- Object.hashCode()는 주소 기반
- String.hashCode()는 내용 기반으로 오버라이딩되어 있음
- System.identityHashCode()는 진짜 주소 기반 해시코드
- str1과 str2는 내용은 같지만 다른 객체 → equals(): true, hashCode(): 같음, identityHashCode(): 다름
'Java' 카테고리의 다른 글
String클래스 (0) | 2025.06.22 |
---|---|
Object클래스 메서드 - toString() (0) | 2025.06.22 |
Object 클래스의 메서드 - equals() (0) | 2025.06.22 |
Object클래스 (0) | 2025.06.22 |
연결된 예외 (0) | 2025.06.21 |