equals 메서드란?

자바에는 ‘같다’ 라고 표현하는 기준이 두 가지가 있다.

실제 메모리 상의 주소값이 일치하여 물리적으로 동일한 경우와 비즈니스에 따라서 재정의한 방법 총 2가지이다.

물리적으로 동일한 것을 표현할 때에는 다른 언어와 마찬가지로 (==) 을 사용한다.

비교 대상 두 객체의 메모리 주소가 같은지 판단할 때 (==) 을 사용하며 ‘동일성(Identity)' 을 의미한다.

물리적으로 동일한 경우가 아닌 제공하는 서비스의 비즈니스에 따라서 동일함을 표현해야 하는 경우가 발생할 수 있다.

예를 들어, 로또 번호를 발급하는 서비스를 개발한다고 가정해보자.

로또의 6개의 번호는 일치하면 안되므로 중복 숫자를 선택했을 경우 새로운 숫자를 다시 선택해야 한다.

즉, 현재 서비스에서는 로또 인스턴스의 번호가 일치한 경우 논리적으로 같다고 표현할 수 있다.

이러한 경우에 Java 에서 제공하는 equals 메서드를 재정의해서 사용할 수 있다.

이를 동등(Equality)하다, 라고 표현한다.

두 인스턴스의 동등성을 판단할 때 다음과 같이 사용할 수 있다.

Lotto lotto = new Lotto(3);
Lotto other = new Lotto(3);

if (lotto.equals(other)) {
	System.out.println("로또의 숫자가 동일함"); // -> 해당 내용 출력
else {
	System.out.println("로또의 숫자가 다름");
}

equals 메서드를 재정의할 때에는 비즈니스 요구사항에 맞춰서 구현하면 된다.

public class Lotto {
    
    private final int number;
    
    public Lotto(int number) {
        this.number = number;
    }
    
    @Override
    public boolean equals(final Object other) {
        final Lotto lotto = (Lotto) other;
        return number == lotto.number;
    }
}