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

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

equals() - 2. 구현

UserV2 예제

UserV2id(고객번호)가 같으면 논리적으로 같은 객체로 정의하겠습니다.

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

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

정확한 equals() 구현

앞서 UserV2에서 구현한 equals()는 이해를 돕기 위해 매우 간단히 만든 버전이고, 실제로 정확하게 동작하려면 다음과 같이 구현해야 합니다.
정확한 equals() 메서드를 구현하는 것은 생각보다 쉽지 않습니다.

IntelliJ를 포함한 대부분의 IDE는 정확한 equals() 코드를 자동으로 만들어 줍니다.

  • generator 단축키 : ⌘N(macOS) / Alt + Insert(Windows / Linux)
@Override
public boolean equals(Object o) {
    if (this == 0) return true;
    if (o == null || getClass() != o.getClass()) return false;
    User user = (User) o;
    return Objects.equalse(id, user.id);
}

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

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

실무에서는 대부분 IDE가 만들어주는 equalse()를 사용하므로, 이 규칙을 외우기 보다는 대략 이렇구나 정도로 한번 읽어보고 넘어가면 충분합니다.

정리

  • 참고로 동일성 비교가 항상 필요한 것은 아닙니다. 동일성 비교가 필요한 경우에만 equals()를 재정의하면 됩니다.
  • equals()hashCode()는 보통 함께 사용됩니다.
    • 이 부분은 추후에 컬렉션 프레임워크를 학습후 정리하겠습니다.