값 타입4(값 타입의 비교)

Mina Park·2022년 9월 12일
0
  • 값 타입의 경우, 인스턴스가 다르더라도 그 안의 값이 같으면 같은 것으로 봐야함
    • 동일성(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);
    }
}

0개의 댓글