해시코드(hashCode)란?
해시코드란 객체를 식별하는 정수값입니다. Java에서 모든 객체는 `Object` 클래스의 `hashCode()` 메서드를 통해 자신만의 해시코드를 반환할 수 있습니다. 이 해시코드는 다음과 같은 특징을 가집니다:
1. 고유성(Uniqueness): 서로 다른 객체는 서로 다른 해시코드를 가져야 합니다.
2. 동일성(Equality): 동일한 객체는 항상 같은 해시코드를 반환해야 합니다.
3. 계산 효율성: 해시코드 계산은 빠르고 효율적이어야 합니다.
4. 균등 분포: 해시코드 값은 가능한 한 균등하게 분포되어야 합니다.
해시코드와 해시 테이블
해시코드의 진가는 해시 테이블(Hash Table) 자료구조에서 발휘됩니다. Java의 `HashMap`과 `HashSet`은 내부적으로 이 해시 테이블을 사용합니다.
해시 테이블은 키의 해시코드를 사용하여 데이터를 저장할 '버켓(bucket)'의 위치를 계산합니다. 예를 들어, `HashMap`에 데이터를 저장할 때:
1. 키 객체의 `hashCode()`를 호출하여 해시코드를 얻습니다.
2. 이 해시코드를 사용해 버켓의 인덱스를 계산합니다.
3. 해당 버켓에 키-값 쌍을 저장합니다.
데이터를 조회할 때도 같은 과정을 거칩니다. 이 방식 덕분에 `HashMap`은 평균적으로 O(1) 시간 복잡도로 데이터를 저장하고 조회할 수 있습니다.
해시코드와 객체 동등성
여기서 중요한 점은 해시코드와 객체의 동등성(equality) 사이의 관계입니다. Java에서는 다음 규칙을 준수해야 합니다:
1. 두 객체가 `equals()` 메서드에 의해 동등하다면, 두 객체의 `hashCode()`는 같은 값을 반환해야 합니다.
2. 두 객체의 `hashCode()`가 다르다면, 두 객체는 `equals()`에 의해 동등할 수 없습니다.
`searchKey`와 `map`에 저장된 키는 `equals()` 메서드에 의해 동등하지만, 해시코드가 다를 수 있습니다. 따라서 다른 버켓에 저장되어 찾을 수 없게 된 것입니다.
이 문제를 해결하려면 `hashCode()`도 재정의해야 합니다:
1. 데이터 무결성: `equals()`와 `hashCode()`가 일관되지 않으면, 해시 기반 컬렉션에서 데이터가 유실될 수 있습니다.
2. 성능 이슈: 만약 많은 객체가 같은 버켓에 몰리면(해시 충돌), 검색 시간이 O(n)으로 악화됩니다.
결론
해시코드는 Java의 해시 기반 컬렉션(`HashMap`, `HashSet` 등)의 성능과 정확성을 좌우하는 핵심 요소입니다. `equals()`와 `hashCode()` 메서드를 함께 올바르게 재정의하면:
1. 객체의 논리적 동등성을 보장할 수 있습니다.
2. 해시 기반 컬렉션의 성능을 최적화할 수 있습니다.
객체 설계 시 이 두 메서드의 관계를 잊지 마세요. 그래야 빠르고 신뢰할 수 있는 Java 애플리케이션을 만들 수 있습니다.
해시코드와 객체 동등성에 대한 이해는 Java 개발자의 필수 역량입니다. 이번 포스트가 여러분의 코딩 실력 향상에 도움이 되었기를 바랍니다. 질문이나 의견이 있다면 언제든 댓글로 남겨주세요!
'알고리즘 > java' 카테고리의 다른 글
<java> 백준 11834 - 이진탐색 (0) | 2024.06.10 |
---|---|
<java> 이분탐색 사용 (0) | 2024.06.08 |
<java> stack 대신 deque (0) | 2024.06.06 |
<java> ArrayDeque vs LinkedList (1) | 2024.06.06 |
<java> 세그먼트 트리 segment tree (0) | 2024.06.04 |