값 타입은 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야한다.

int a == int b는 값을 비교하기 때문에 trueAddress a == Address b는 참조 값을 비교하기 때문에 false인스턴스의 참조 값을 비교 == 사용
인스턴스의 값을 비교, equals() 사용
따라서 값 타입은 a.equals(b)를 사용해서 동등성 비교를 해야한다.
값 타입의 equals() 메소드를 적절하게 재정의 해야한다.
Address address1 = new Address("city", "street", "10000");
Address address2 = new Address("city", "street", "10000");
System.out.println("address1==address2: " (address1==address2));
System.out.println("address1 equals address2: " (address1.equals(address2)));
address1==address2: false
address1 equals address2: false
equals()를 이용해 동등성 비교를 해도 false가 출력된다.
-> equals() 기본 구현이 ==비교로 되어있다.
public boolean equals(Object obj){
return (this == obj);
}
따라서 equals()를 오버라이딩해서 사용해야한다.
또한 equals()를 오버라이딩 할 때, hashcode()도 오버라이딩 해야 자바 컬렉션에서 효율적으로 사용할 수 있다.
class Address {
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Address address = (Address) o;
return Objects.equals(city, address.city) && Objects
.equals(street, address.street) && Objects.equals(zipcode, address.zipcode);
}
@Override
public int hashCode() {
return Objects.hash(city, street, zipcode);
}
}
오버라이딩 후 Main Code를 실행하면
address1==address2: false
address1 equals address2: true
equals() 동등성 비교시 true가 출력된다.
참고 :
김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.