hashCode()
Java의 hashCode() 메서드는 Object 클래스에 정의된 메서드로, 객체의 해시 코드를 반환하는 역할을 합니다.
해시 코드는 정수 값으로 표현되며, 객체의 내용에 기반하여 생성됩니다.
hashCode()의 용도
일반적으로 해시 테이블과 같은 자료 구조에서 객체를 검색하거나 저장하기 위해 사용됩니다.
해시 테이블은 효율적인 검색을 위해 객체를 키-값 쌍으로 저장하는 자료 구조입니다.
객체의 해시 코드를 계산하여 이를 인덱스로 사용하면, 객체를 빠르게 찾을 수 있습니다.
hashCode()의 규칙
Java에서 hashCode() 메서드의 기본 구현은 객체의 메모리 주소를 이용하여 해시 코드를 생성합니다.
이는 각 객체에 대해 고유한 해시 코드를 생성하므로, 서로 다른 객체의 해시 코드는 대부분 다릅니다.
하지만, 동일한 객체의 경우에는 항상 같은 해시 코드를 반환해야 합니다.
그러나 해시 코드가 같다고 해서 두 객체가 반드시 같은 것은 아닙니다.
이런 경우를 해시 충돌(Collision)이라고 하며, 이를 해결하기 위해 추가적인 동치성 검사를 수행해야 할 수 있습니다.
따라서, Java에서 hashCode() 메서드를 오버라이딩할 때는 다음 규칙을 따라야 합니다:
1. 두 객체가 equals() 메서드로 동일하다고 판단되면, 두 객체의 hashCode() 메서드는 같은 값을 반환해야 합니다.
2. 두 객체의 hashCode() 메서드가 같다고 해서 두 객체가 동일하지 않을 수 있으므로, equals() 메서드로 추가적인 동치성 검사를 수행해야 합니다.
이러한 규칙을 준수하여 hashCode() 메서드를 구현하면, 객체를 효과적으로 검색하거나 저장하는데 도움이 되는 해시 기반 자료 구조를 사용할 수 있습니다.
*예시
public class Person {
private String name;
private int age;
// 생성자와 getter, setter 생략
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
Person other = (Person) obj;
return age == other.age && (name == null ? other.name == null : name.equals(other.name));
}
}
hashCode() 메서드는 name과 age를 이용하여 해시 코드를 생성하고, equals() 메서드는 name과 age가 동일한지 비교합니다.
이렇게 작성된 hashCode() 메서드는 name과 age를 이용하여 해시 코드를 생성합니다.
name이 null인 경우에는 0을 해시 코드에 반영하고, 그렇지 않은 경우에는 name.hashCode()를 사용합니다.
age는 그대로 해시 코드에 반영되며, prime이라는 상수를 이용하여 해시 코드를 계산합니다.
equals() 메서드에서는 name과 age를 비교하여 동일한지 여부를 판단합니다. name이 null인 경우에는 다른 Person 객체의 name도 null인 경우에만 동일하다고 판단합니다.
이렇게 hashCode()와 equals() 메서드를 오버라이딩하면, Person 객체를 사용하여 해시 테이블과 같은 자료 구조에서 검색하거나 저장할 수 있습니다.
'Java' 카테고리의 다른 글
[프로그래머스] 문자열 내림차순으로 배치하기 (0) | 2023.06.20 |
---|---|
[프로그래머스] 수박수박수박수박수박수? (0) | 2023.06.20 |
[프로그래머스] 핸드폰 번호 가리기 (0) | 2023.06.20 |
[프로그래머스] 두 정수의 합 (0) | 2023.06.20 |
StringBuffer / StringBuilder (0) | 2023.05.18 |
댓글