☕️[Java] equals() - 1, 동일성과 동등성.
1️⃣ equals() - 1, 동일성과 동등성.
-
'Object'
는 동등성 비교를 위한'equals()'
메서드를 제공합니다. - 자바는 “두 객체가 같다” 라는 표현을 두 가지로 분리해서 제공합니다.
-
동일성(Identity)
-
'=='
연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인.
-
-
동등성(Equality)
-
-
'equals()'
메서드를 사용하여 두 객체가 논리적으로 동등한지 확인
-
-
-
동일성(Identity)
2️⃣ 단어 정리
- “동일” 은 “완전히 같음 을 의미합니다.”
- “동등” 은 “같은 가치나 수준을 의미하지만 그 형태나 외관 등이 환전히 같지 않을 수 있습니다.”
- 즉, “동일성” 은 물리적으로 같은 메모리에 있는 객체 인스턴스인지 참조값을 확인하는 것이고, “동등성” 은 논리적으로 같은지 확인하는 것입니다.
- “동일성” 은 자바 머신 기준이고 메모리의 참조가 기준이므로 물리적입니다.
- “동등성” 은 보통 사람이 생각하는 논리적인 기준에 맞추어 비교합니다.
- 예를 들어 같은 회원 번호를 가진 회원 객체가 2개 있다고 가정해봅시다.
User a = new User("id-100"); // 참조 x001 User b = new User("id-100"); // 참조 x002
- 이 경우 물리적으로 다른 메모리에 있는 다른 객체이지만, 회원 번호를 기준으로 생각해보면 논리적으로는 같은 회원으로 볼 수 있습니다.
- (주민등록번호가 같다고 가정해도 됩니다.)
- 따라서 동일성은 다르지만, 동등성은 같습니다.
- (주민등록번호가 같다고 가정해도 됩니다.)
- 문자의 경우도 마찬가지입니다.
String s1 = "hello"; String s2 = "hello";
- 이 경우 물리적으로는 각각의 “hello” 문자열이 다른 메모리에 존재할 수 있지만, 논리적으로는 같은
"hello"
라는 문자열입니다.- (사실 이 경우 자바가 같은 메모리를 사용하도록 최적화 합니다.)
3️⃣ UserV1 예제.
public class UserV1 {
private String id;
public UserV1(String id) {
this.id = id;
}
}
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)));
}
}
실행 결과
Identity = false
Equality = false
동일성(Identity) 비교
user1 == user2
x001 == x002
false // 결과
동등성(Equality) 비교
Object.equals() 메서드
public boolean equals(Object obj) {
return (this == obj);
}
-
'Object'
가 기본으로 제공하는'equals()'
는'=='
으로 동일성 비교를 제공합니다.
Object.equals
equals 실행 순서 예시
user1.equals(user2)
return (user1 == user2) // Object.equals 메서드 안
return (x001 == x002) // Object.equals 메서드 안
return false
false
- 동등성(Equality)이라는 개념은 각각의 클래스마다 다릅니다.
- 어떤 클래스는 주민등록번호를 기반으로 동등성을 처리할 수 있고, 어떤 클래스는 고객의 연락처를 기반으로 동등성을 처리할 수도 또 어떤 클래스는 회원 번호를 기반으로 동등성을 처리할 수 있습니다.
- 따라서 동등성 비교를 사용하고 싶으면
'equals()'
메서드를 재정의해야 합니다.- 그렇지 않으면
'Object'
는 동일성(Identity) 비교를 기본으로 제공합니다.
- 그렇지 않으면
- 따라서 동등성 비교를 사용하고 싶으면
- 어떤 클래스는 주민등록번호를 기반으로 동등성을 처리할 수 있고, 어떤 클래스는 고객의 연락처를 기반으로 동등성을 처리할 수도 또 어떤 클래스는 회원 번호를 기반으로 동등성을 처리할 수 있습니다.