동일성과 동등성
- 자바는 두 객체가 같다는 표현을 2가지를 통해서 할 수 있다.
- 동일성 ( == ) : 물리적인 참조 값이 동일한가? 즉 동일한 인스턴스를 참조하고 있는가?
- 동등성 ( equals() ) : 두 객체의 논리적인 값이 동일한가? ( 객체가 갖고 있는 정보가 동일하다 )
public class User {
private Long id;
public User(Long id) {
this.id = id;
}
}
public class EqualsMain {
public static void main(String[] args) {
User user1 = new User(1L);
User user2 = new User(1L);
System.out.println("identity = " + (user1 == user2));
System.out.println("identity = " + (user1.equals(user2)));
}
}
// 실행결과
// false
// false
- User 객체를 2번 사용했기 때문에 인스턴스가 2번 생성되었을 것이다
- 따라서 == 을 활용한 동일성 비교는 false가 나오는 것이 맞을 것 같은데, 객체의 정보를 비교하는 equals 는 왜 false가 나올까?
equals() 메서드
public boolean equals(Object obj) {
return (this == obj);
}
- Object 클래스에서 제공하는 equals는 기본적으로 동일성을 비교하여 그 결과를 반환하기 때문이다.
- equals() 메서드를 통해서 동등성을 비교하기 위해서는 메서드 오버라이딩이 필요하다
@Override
public boolean equals(Object object) {
if (this == object) return true;
if (object == null || getClass() != object.getClass()) return false;
UserV2 userV2 = (UserV2) object;
return Objects.equals(id, userV2.id);
}
- 직접 코드를 작성해서 동등성 비교를 할 수도 있지만 실제로 다양한 제약조건들이 존재하기 때문에 기본적으로 ide에서 제공하는 equals를 활용하는 것이 편리하다
- 메서드를 오버라이딩한 뒤 다시 EqualsMain을 실행해보면 두번째 출력 결과는 true로 바뀌게 된다