[Java] hashCode 란?

calis_ws·2024년 2월 1일
0
post-custom-banner

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
  • String class 는 equals() 메소드를 재정의해서 주소값 비교가 아닌 문자열 '값'만을 비교한다.
    (참고로 반대로 '주소값'을 비교하는 건 '==' 연산자를 많이 쓴다.)

equals()hashCode()를 함께 재정의해야 하는 이유

  1. equals() 메서드가 두 객체를 동등하다고 판단한다면, 두 객체의 hashCode() 값은 반드시 같아야 한다. 따라서 equals() 가 true를 반환하는 두 객체는 항상 같은 해시 코드를 가져야 한다.

  2. hashCode() 값이 같다고 해서 두 객체가 반드시 동등하다고 판단하는 것은 아니다. 하지만 해시 코드가 다른 두 객체는 반드시 서로 다르다고 판단해야 한다. 이는 해시 기반 컬렉션(HashMap, HashSet)에서 객체를 효율적으로 검색하기 위해 필요한 규칙이다.

  3. hashCode() 메서드를 재정의하여 객체의 내용을 기반으로 한 해시 코드를 생성하면, 동일한 내용의 객체는 동일한 해시 코드를 갖게 된다. 이로 인해 해시 기반 컬렉션에서 효율적인 검색 및 삽입이 가능해진다.


정리

  • equals() 로 같은 객체는 같은 hashCode() 결과가 나와야 한다.

  • hashCode() 로 같은 객체가 항상 equals() 메서드로 같은 객체는 아니다.

  • 이 두 메서드를 함께 재정의하지 않으면 해시 기반 컬렉션을 올바르게 사용할 수 없고, 예상치 못한 동작이 발생할 수 있다. (해시 충돌, 동등성 비교 오류 등)

출처

https://velog.io/@mooh2jj/equals와-hashCode는-언제-사용하는가

profile
반갑습니다람지
post-custom-banner

0개의 댓글