Home > 2024 > Java > ☕️[Java] equals() - 1.동일성과 동등성

☕️[Java] equals() - 1.동일성과 동등성
Java Programming Language

equals() - 1.동일성과 동등성

Object는 동등성 비교를 위한 equals() 메서드를 제공합니다.

자바는 두 객체가 같다라는 표현을 2가지로 분리해서 제공합니다.

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

단어 정리
“동일”은 완전히 같음을 의미합니다. 반면 “동등”은 같은 가치나 수준을 의미하지만 그 형태나 외관 등이 완전히 같지는 않을 수 있습니다.

  • 쉽게 이야기해서 동일성은 물리적으로 같은 메모리에 있는 객체 인스턴스인지 참조값을 확인하는 것이고, 동등성은 논리적으로 같은지 확인하는 것입니다.
  • 동일성은 자바 머신 기준이고 메모리 참조가 기준이므로 물리적입니다.
    • 반면 동등성은 보통 사람이 생각하는 논리적인 기준에 맞추어 비교합니다.

예를 들어 같은 회원 번호를 가진 회원 객체가 2개 있다고 가정해봅시다.

User a = new User("id-100") // 참조 x001
User b = new User("id-100") // 참조 x002
  • 이 경우 물리적으로 다른 메모리에 있는 다른 객체이지만, 회원 번호를 기준으로 생각해보면 논리적으로는 같은 회원으로 볼 수 있습니다.(주민등록번호가 같다고 가정해도 됩니다.)
    • 따라서 동일성은 다르지만, 동등성은 같습니다.

문자의 경우도 마찬가지입니다.

String s1 = "hello";
String s2 = "hello";
  • 이 경우 물리적으로 각각의 “hello” 문자열이 다른 메모리에 존재할 수 있지만, 논리적으로는 같은 "hello"라는 문자열입니다.(사실 이 경우 자바가 같은 메모리를 사용하도록 최적화 합니다. 이 부분은 추후에 학습하겠습니다.)

예제를 통해서 동일성과 동등성을 비교해봅시다.

package lang.object.equals;

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("equlity = " + (user1.equals(user2)));
  }
}

실행 결과

identity = false
equlity = false

동일성 비교

user1 == user2
x001 == x002
false // 결과

동등성 비교
Object.equals() 메서드

public boolean equals(Object obj) {
    return (this == obj);
}
  • Object가 기본적으로 제공하는 equals()==으로 동일성 비교를 제공합니다.

equals 실행 순서 예시

user1.equals(user2)
return (user1 == user2) // Object.equals 메서드 안
return (x001 == x002) // Object.equals 메서드 안
return false
false

동등성이라는 개념은 각각의 클래스 마다 다릅니다.

어떤 클래스는 주민등록번호를 기반으로 동등성을 처리할 수 있고, 어떤 클래스는 고객의 연락처를 기반으로 동등성을 처리할 수 있습니다.
어떤 클래스는 회원 번호를 기반으로 동등성을 처리할 수 있습니다.

따라서 동등성 비교를 사용하고 싶으면 equals() 메서드를 재정의해야 합니다.
그렇지 않으면 Object는 동일성 비교를 기본으로 제공합니다.