[JAVA]Equals()와 Hashcode()를 재정의(override) 해야하는 이유

정호석·2022년 4월 5일
1

Equals()란?

equals()는 두 인스턴스의 주소값을 비교하여 같은 인스턴스인지를 확인하고 같으면 true, 다르면 false의 boolean값을 리턴하는 메서드이다.

Hashcode()란?

객체의 hashcode란 객체를 식별하는 하나의 정수값을 말한다. Object의 hashCode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체 마다 다른 값을 가지고 있다. 객체의 값을 동등성 비교시 hashCode()를 오버라이딩할 필요성이 있다

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

public class Food {
    String menu;
    int price;
    public Food(String menu, int price){
        this.menu = menu;
        this.price = price;
    }
    public static void main(String[] args){
        Food pizza1 = new Food("cheese", 17_000);
        Food pizza2 = new Food("cheese", 17_000);
        System.out.println(pizza1.equals(pizza2));
    }
}

위의 코드를 보면 menu의 이름과 값이 같은데도 불구하고 결과는 false가 나오게된다.
그 이유는 참조값이 다르기 때문이다.
그렇기 때문에 이런상황에서 우리는 equals메소드를 재정의 해주어야 한다.

equals() 재정의(override)

public class Food {
    String menu;
    int price;
    public Food(String menu, int price){
        this.menu = menu;
        this.price = price;
    }
    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof Food)) {
            return false;
        }
        Food c = (Food) o;
        return CharSequence.compare(menu, c.menu) == 0
                && Integer.compare(price, c.price) == 0;
    }
    public static void main(String[] args){
        Food pizza1 = new Food("cheese", 17_000);
        Food pizza2 = new Food("cheese", 17_000);
        System.out.println(pizza1.equals(pizza2));
    }
}

이렇게 재정의를 해주면 결과는 true가 됩니다.

Hashcode() 출력

public static void main(String[] args){
     Food pizza1 = new Food("cheese", 17_000);
     Food pizza2 = new Food("cheese", 17_000);
     System.out.println(pizza1.equals(pizza2));
     System.out.println("pizza1 hash: " + pizza1.hashCode());
     System.out.println("pizza2 hash: " + pizza2.hashCode());
 }

Object 클래스의 hashCode() 메소드는 해당 메모리 주소값을 반환한다고 설명하였다. 그렇기 때문에 위의 pizza1과 pizza2는 다른 해시값을 반환할 것이고, HashSet에는 2개의 객체가 서로 다른 위치에 저장될 것이다.

우리는 이러한 문제를 해결하기 위해 hashCode 메소드도 Food 클래스에 오버라이드하여 수정해주어야 한다.

profile
welcome

0개의 댓글