Hibernate/JPA(EntityManager)

[JPA] 값 타입 객체간 비교 (equlas & hashcode)

유혁스쿨 2023. 6. 29. 19:46
728x90
반응형
  • 동일성 비교 : 인스턴스의 참조 값을 비교한다 ( == 사용)
  • 동등성 비교 : 인스턴스의 값을 비교한다. (equals() 사용)

 

인스턴스 형태인 값 타입의 경우 equals()를 사용하여 동등성을 비교해야한다.

 

Address addr1 = new Address("city", "street", "10000");
Address addr2 = new Address("city", "street", "10000");
System.out.println("addr1 == addr2 = " + (addr1 == addr2)); // false
System.out.println("addr1.equals(addr2) = " + addr1.equals(addr2)); // false

 

Object 클래스에 선언한 equals()의 기본이 동일성 비교이기 때문에 false가 뜬다.

따라서 값 타입의 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, lokcer);
    }

 

[동등성을 비교하기 위한 Address 클래스에 equals와 hashcode를 오버라이딩]

@Embeddable
@Getter
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);
    }
}

 

참고로 Equals를 구현하면 Hashcode를 구현해주는게 좋다.

hashcode를 사용하는 hashMap등에서 효율적으로 사용할 수 있게 된다.

 

자세한 내용은 이것이 자바다 책을 다시 들여다 보고 추가 설명을 작성하도록 하겠다.

728x90
반응형