☕️[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()'
는 보통 함께 사용됩니다.