DEV ℧ Developer Diary

[JPA] 값 타입의 비교

해당 포스트는 인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 듣고 정리한 글입니다.

값 타입의 비교

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

int a = 10;
int b = 10;
Address a = new Address(서울시)
Address b = new Address(서울시)

값 타입의 비교

각각 예시를 들어가며 설명해 보도록 하자.

Address addressA = new Address("city", "street", "zipcode");
Address addressB = new Address("city", "street", "zipcode");
  • 동일성(identity) 비교: 인스턴스의 참조 값을 비교, == 사용
System.out.println("addressA == addressB : " + (addressA == addressB));
addressA == addressB : false
  • 동등성(equivalence) 비교: 인스턴스의 값(주소)을 비교, equals()사용
System.out.println("addressA equals addressB : " + (addressA.equals(addressB)));
addressA equals addressB : true
  • 값 타입은 a.equals(b)를 사용해서 동등성 비교를 해야 함
  • 값 타입의 equals() 메소드를 적절하게 재정의(주로 모든 필드 사용)
@Embeddable
@Getter @Setter
@NoArgsConstructor
@AllArgsConstructor
public class Address {
    private String city;
    private String street;
    private String 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);
    }
}

해당 방식처럼 Override해서 사용하면 되지만, 때에따라 equals의 getter를 수정해야 할수도 있다. 또한 예전에 읽은 이펙티브 자바로 인해 주의할 점도 있으니 주의해서 재정의 해야한다.