Java/자바 정리

100. 객체 비교의 기준을 내 마음대로! – equals() 메서드 재정의

코딩하는냥이 2025. 5. 13. 13:05
반응형

이번 글에서는 Object 클래스의 equals() 메서드를 재정의하여,

두 객체가 동등한지 판단하는 기준을 직접 설정하는 방법을 배웁니다.
기본 equals()는 참조값(주소값) 비교이지만,

우리가 원하는 대로 내부 값이 같으면 같은 객체로 간주하도록 만들 수 있습니다.


📌 예제 코드

public class Member {
    public String id;

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

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Member target)
            if (id.equals(target.id))  // 문자열 id 값이 같으면 true
                return true;
        return false;
    }
}
public class EqualsExample {
    public static void main(String[] args) {
        Member obj1 = new Member("blue");
        Member obj2 = new Member("blue");
        Member obj3 = new Member("red");

        if (obj1.equals(obj2))
            System.out.println("obj1과 obj2는 동등합니다.");
        else
            System.out.println("obj1과 obj2는 동등하지 않습니다.");

        if (obj1.equals(obj3))
            System.out.println("obj1과 obj3는 동등합니다.");
        else
            System.out.println("obj1과 obj3는 동등하지 않습니다.");
    }
}

💻 실행 결과

obj1과 obj2는 동등합니다.
obj1과 obj3는 동등하지 않습니다.

💬 코드 설명

  • equals() 메서드는 기본적으로 두 객체의 참조값이 같은지를 비교합니다.
  • 하지만 Member 클래스에서는 equals()를 오버라이드하여, id 값이 같으면 true를 반환하도록 변경했습니다.
  • instanceof 조건문에서는 패턴 매칭을 사용하여, Member 타입으로 안전하게 캐스팅까지 한 번에 처리합니다.
  • "blue"라는 동일한 id를 가진 obj1과 obj2는 동등하다고 판단되어 첫 번째 비교는 true.
  • "red"를 가진 obj3은 obj1과 다르기 때문에 두 번째 비교는 false입니다.

💡 포인트 정리

  • equals()는 객체의 논리적 동등성을 정의할 때 오버라이딩해서 사용합니다.
  • 문자열과 같이 내용 기반으로 비교해야 할 경우, equals()를 재정의하면 유용합니다.
  • Java 16 이후부터는 instanceof 조건문에서 패턴 매칭 문법을 사용해 캐스팅을 간결하게 처리할 수 있습니다.
  • equals()를 재정의할 때는 null 체크와 클래스 타입 비교를 함께 고려하는 것이 좋습니다.

 


📌 정리하자면, 객체 비교는 단순히 주소가 같은지 확인하는 것이 아니라, 원하는 기준에 따라 동등함을 정의할 수 있습니다.
equals() 메서드를 재정의하면, 내부 데이터가 같은 두 객체를 같은 것으로 간주할 수 있어 비즈니스 로직에서 유연한 비교가 가능합니다.