프로그래밍언어/Java

[Java 중급] equals()

배세 2024. 8. 8. 15:03

동일성과 동등성


  • 동일성(Identity) : == 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인
  • 동등성(Equality) : equals() 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인
User a = new User("id-100")
User b = new User("id-100")

 

=> 다른 메모리에 있는 다른 객체이므로 동일성은 다르지만, 회원 번호는 같기 때문에 동등성은 같다. 

 

 

예제


 

UserV1.java

public class UserV1 {

    private String id;

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

}

 

EqualsMainV1.java

public class EqualsMainV1 {
    public static void main(String[] args) {
        UserV1 user1 = new UserV1("id-100");
        UserV1 user2 = new UserV1("id-100");

        System.out.println("identity = " + (user1 == user2));
        System.out.println("equality = " + (user1.equals(user2)));
    }
}

 

 

실행결과

 

=> 왜 둘 다 false 일까? equals 함수가 내부에서 '=='을 실행하기 때문이다. 

equals 메서드를 재정의해서 비교해보자. 

 

예제2


UserV2.java

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 타입을 매개변수로 사용하기 떄문에 객체의 특정값을 사용하려면 다운캐스팅이 필요하다. 

id 는 String 이기 때문에 equals()로 비교한다. 

 

 

EqualsMainV2.java

public class EqualsMainV2 {
    public static void main(String[] args) {
        UserV2 user1 = new UserV2("id-100");
        UserV2 user2 = new UserV2("id-100");

        System.out.println("identity = " + (user1 == user2));
        System.out.println("equality = " + (user1.equals(user2)));
    }
}

 

실행결과

 

=> 동등성 비교에서 true가 나온다. 

 

 

정확한 equals() 구현


사실 equals를 정확하게 구현하려면 더 복잡하다. 인텔리제이에서는 equals 코드를 자동으로 만들어준다. (단축키 command+n)

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

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

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

 

* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다.