Home > Java > Java > ☕️[Java] equals() - 2, 구현.

☕️[Java] equals() - 2, 구현.
Java Programming Language Backend

☕️[Java] equals() - 2, 구현.

1️⃣ UserV2 예제.

  • 'UserV2''id'(고객번호) 가 같으면 논리적으로 같은 객체로 정의하겠습니다.
package lang.object.equals;

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);
    }
}
  • 'Object''equals()' 메서드를 재정의했습니다.
  • 'UserV2' 의 동등성은 'id'(고객번호) 로 비교합니다.
  • 'equals()''Object' 타입을 매개변수로 사용합니다.
    • 따라서 객체의 특정 값을 사용하려면 다운캐스팅이 필요합니다.
  • 여기서는 현재 인스턴스('this')에 있는 'id' 문자열과 비교 대상으로 넘어온 객체의 'id' 문자열을 비교합니다.
  • 'UserV2' 에 있는 'id''String' 입니다.
    • 문자열 비교는 '==' 이 아니라 'equals()' 를 사용해야 합니다.
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));
    }
}

실행 결과

identity = false
equa;ity = true

  • 동일성(Identity) : 객체의 참조가 다르므로 동일성은 다릅니다.
  • 동등성(Equlity) : 'user1', 'user2 는 서로 다른 객체이지만 둘다 같은 'id'(고객번호) 를 가지고 있습니다.
    • 따라서 동등합니다.

2️⃣ 정확한 equals() 구현.

  • 앞서 'UserV2' 에서 구현한 'equals()' 는 이해를 돕기 위해 매우 간단히 만든 버전입니다.
    • 실제로 정확하게 동작하려면 다음과 같이 구현해야 합니다.
    • 정확한 'equals()' 메서드를 구현하는 것은 생각보다 쉽지 않습니다.
  • IntelliJ를 포함한 대부분의 IDE는 정확한 'equals()' 코드를 자동으로 만들어줍니다.
// 변경 - 정확한 equals 구현, IDE 자동 생성
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    User user (User) o;
    return Objects.equals(id, user.id);
}

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

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

정리

  • 참고로 동일성 비교가 항상 필요한 것은 아닙니다.
    • 동일성 비교가 필요한 경우에만 'equals()' 를 재정의하면 됩니다.
  • 'equals()''hashCode()' 는 보통 함께 사용됩니다.