equals() - 구현

SungMin·2026년 5월 23일

자바 심화 정리

목록 보기
7/34
package lang.object.equals;

import java.util.Objects;

public class UserV2 {
    private String id;

    public UserV2(String id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        UserV2 user = (UserV2) obj;
        return id.equals(user.id);
    }
}
  • equals() 는 Object 타입을 매개변수로 사용한다.
    따라서 객체의 특정 값을 사용하려면 다운캐스팅이 필요하다.
  • 문자열 비교는 ==이 아니라 equals()를 사용해야 한다.

위에 상기한 equals()는 매우 간단한 버전이고 실제로는 더욱 복잡한 코드로 작성을 해야한다.
정확한 equals()를 구현하는 것은 쉽지 않다.

package lang.object.equals;

import java.util.Objects;

public class UserV2 {
    private String id;

    public UserV2(String id) {
        this.id = id;
    }

//    @Override
//    public boolean equals(Object obj) {
//        UserV2 user = (UserV2) obj;
//        return id.equals(user.id);
//    }

    @Override
    public boolean equals(Object o) {
        if (o == null || getClass() != o.getClass()) return false;
        UserV2 userV2 = (UserV2) o;
        return Objects.equals(id, userV2.id);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(id);
    }
}

equals() 메서드를 구현할 때 지켜야할 규칙

  • 반사성: 객체는 자기 자신과 동등해야한다.
  • 대칭성: 두 객체가 서로 동일하다면, 이는 양방향으로 동일해야한다.
  • 추이성: 첫 번째 객체가 두 번째 객체와 동일하고, 두 번째 객체가 세 번째 객체와 동일하다면, 첫 번째 객체도 세 번째 객체와 동일해야 한다.
  • 일관성: 두 객체의 상태가 변하지 않는 한, equals() 메서드는 항상 동일한 값을 반환해야 한다.
  • null에 대한 비교: 모든 객체는 null과 비교했을 때 false를 반환해야 한다.

실무에서는 IDE가 제공해주는 equals()를 사용하므로, 이런 것들이 있다는 것만 알아두자.


[정리]

  • 동등성 비교가 필요한 경우에만 equals()를 재정의하면 된다.
  • equals()를 오버라이딩하면 hashCode()도 함께 오버라이딩하는 것이 일반적이다.
profile
오늘도 한 걸음씩 나아가

0개의 댓글