- 값 타입의 경우, 인스턴스가 다르더라도 그 안의 값이 같으면 같은 것으로 봐야함
- 동일성(identity) 비교: 인스턴스의 참조 값을 비교, == 사용'
동등성(equivalence) 비교: 인스턴스의 값을 비교, equals() 사용
- 값 타입은 반드시 a.equals(b) 로 동등성 비교가 필요
- 값 타입의 equals() 메소드를 적절하게 재정의
- 📌 equals() and hashcode() 생성시 getters 사용하도록 체크!!!
- 프록시인 경우를 고려, 직접 필드에 접근하기보다는 안전하게 값을 가져오기 위해(?)
public class ValueMain {
public static void main(String[] args) {
int a = 10;
int b = 10;
System.out.println("a == b: " + (a == b)); //true
Address address1 = new Address("Seoul", "star-ro","1000");
Address address2 = new Address("Seoul", "star-ro","1000");
System.out.println("address1 == address2: " + (address1 == address2)); //false
System.out.println("address1 equals address2: " + (address1.equals(address2))); //true
//Address 엔티티에서 equlas 메소드를 오버라이딩해서 재정의해두었기 때문(equals 기본은 == 비교여서 오버라이딩 필요)
}
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
public Address() {
}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
public String getCity() {
return city;
}
public String getStreet() {
return street;
}
public String getZipcode() {
return zipcode;
}
@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);
}
}