hashCode()
객체 hashcode 란 객체를 식별하는 하나의 고유 정수값을 말한다.
쉽게 말해서 객체의 지문이다.
객체의 해시코드(hash code)를 반환하는 메소드
Object 클래스의 메소드로써, 모든 클래스는 Object 클래스를 상속하기 때문에 사실상 모든 객체에서 가지고 있는 메소드
hashCode()
는 객체의 주소를 int 로 변환해서 반환한다.
import java.util.Objects;
public class Main {
public static void main(String[] args) {
Person person1 = new Person("kimsana");
Person person2 = new Person(new String("kimsana"));
Person person3 = person2;
Person person4 = new Person("kimsana");
System.out.println(person1.hashCode()); // 798154996
System.out.println(person2.hashCode()); // 681842940
System.out.println(person3.hashCode()); // 681842940
System.out.println(person4.hashCode()); // 1392838282
System.out.println(person1.equals(person4)); // false
// 재정의 하면 전부 106222
// equals 도 재정의 해줘야함
}
}
// @EqualsAndHashCode 이거 쓰면 원콤
class Person {
String name;
public Person(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hashCode(name); // name 에서 해시 코드 생성
}
}
equals()
를 오버라이딩하면, hashCode()
도 오버라이딩해야 한다.equals()
의 결과가 true 인 두 객체의 해시코드는 같다.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
equals()
메소드를 재정의해서 주소값 비교가 아닌 문자열 '값'만을 비교한다.equals()
와 hashCode()
를 함께 재정의해야 하는 이유equals()
메서드가 두 객체를 동등하다고 판단한다면, 두 객체의 hashCode()
값은 반드시 같아야 한다. 따라서 equals()
가 true를 반환하는 두 객체는 항상 같은 해시 코드를 가져야 한다.
hashCode()
값이 같다고 해서 두 객체가 반드시 동등하다고 판단하는 것은 아니다. 하지만 해시 코드가 다른 두 객체는 반드시 서로 다르다고 판단해야 한다. 이는 해시 기반 컬렉션(HashMap, HashSet)에서 객체를 효율적으로 검색하기 위해 필요한 규칙이다.
hashCode()
메서드를 재정의하여 객체의 내용을 기반으로 한 해시 코드를 생성하면, 동일한 내용의 객체는 동일한 해시 코드를 갖게 된다. 이로 인해 해시 기반 컬렉션에서 효율적인 검색 및 삽입이 가능해진다.
equals()
로 같은 객체는 같은 hashCode()
결과가 나와야 한다.
hashCode()
로 같은 객체가 항상 equals()
메서드로 같은 객체는 아니다.
이 두 메서드를 함께 재정의하지 않으면 해시 기반 컬렉션을 올바르게 사용할 수 없고, 예상치 못한 동작이 발생할 수 있다. (해시 충돌, 동등성 비교 오류 등)