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
반응형
'Hibernate > JPA(EntityManager)' 카테고리의 다른 글
[JPA] 상속 관계 매핑 @Inheritance , @Discriminator____ (0) | 2023.06.30 |
---|---|
[JPA] 값 타입 컬렉션 (@ElementCollection / @CollectionTable) (0) | 2023.06.29 |
[JPA] 임베디드 내장 타입 @Embadded 와 불변 객체 (0) | 2023.06.29 |
[JPA] @ManyToMany와 한계점 극복 (0) | 2023.06.29 |
[JPA] @OneToOne 단방향/양방향 - 외래키 정책 기준 (1) | 2023.06.29 |