프로그래밍언어/Java
[Java 중급] equals()
배세
2024. 8. 8. 15:03
동일성과 동등성
- 동일성(Identity) : == 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인
- 동등성(Equality) : equals() 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인
User a = new User("id-100")
User b = new User("id-100")
=> 다른 메모리에 있는 다른 객체이므로 동일성은 다르지만, 회원 번호는 같기 때문에 동등성은 같다.
예제
UserV1.java
public class UserV1 {
private String id;
public UserV1(String id) {
this.id = id;
}
}
EqualsMainV1.java
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)));
}
}
실행결과
=> 왜 둘 다 false 일까? equals 함수가 내부에서 '=='을 실행하기 때문이다.
equals 메서드를 재정의해서 비교해보자.
예제2
UserV2.java
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);
}
}
=> equals는 Object 타입을 매개변수로 사용하기 떄문에 객체의 특정값을 사용하려면 다운캐스팅이 필요하다.
id 는 String 이기 때문에 equals()로 비교한다.
EqualsMainV2.java
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)));
}
}
실행결과
=> 동등성 비교에서 true가 나온다.
정확한 equals() 구현
사실 equals를 정확하게 구현하려면 더 복잡하다. 인텔리제이에서는 equals 코드를 자동으로 만들어준다. (단축키 command+n)
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserV2 userV2 = (UserV2) o;
return Objects.equals(id, userV2.id);
}
=> equals() 메서드를 구현할 때 지켜야 하는 규칙
- 반사성: 객체는 자기 자신과 동등해야 한다.
- 대칭성: 두 객체가 서로에 대해 동일하다고 판단하면, 이는 양방향으로 동일해야 한다.
- 추이성: 한 객체가 두 번째 객체와 동일하고, 두번째 객체가 세 번째 객체와 동일하다면, 첫 번째 객체는 세 번째 객체와도 동일해야 한다.
- 일관성: 두 객체의 상태가 변경되지 않는 한 equals 메서드는 항상 동일한 값을 반환해야 한다.
- null 에 대한 비교: 모든 객체는 null과 비교했을 때 false를 반환해야 한다.
* 인프런 '김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다.