인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 한다.
// primitive type 비교
int a = 10;
int b = 10;
System.out.println(a == b);//true
// 임베디드 타입(인스턴스) 비교
Address a = new Address("서울", "AAA", 1000);
Address b = new Address("서울", "AAA", 1000);
System.out.println(a == b);//false
❓ 어째서 임베디드 타입의 ==비교는 false가 뜨는것인가? 당연하다. 인스턴스가 다르니 다른객체이기 때문이다.
그럼 어떻게 해야할까?
동일성(identity) 비교: 인스턴스의 참조 값을 비교, == 사용
동등성(equivalence)비교: 인스턴스의 값을 비교, equals() 사용
값 타입은 a.equals(b)를 사용해서 동등성 비교를 해야 한다.
값 타입의 equals()메소드를 적절하게 재정의 해준다(주로 모든 필드 사용)
@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);
}
...
...
...
// 임베디드 타입(인스턴스) 비교
Address a = new Address("서울", "AAA", 1000);
Address b = new Address("서울", "AAA", 1000);
System.out.println(a.equals(b));//true 이제 true가 된다.