JPA/JPA 기본

34. 값타입 비교

sdafdq 2023. 10. 29. 20:57

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

 

예를 들면 테이블에서 같은 주소를 가지고 있으면 그건 같은 곳에 사는 거니까..

 

 

근데 임베디드 타입, 얘네들은 클래스기 때문에 == 했을 때 인스턴스의 주소를 비교하기 때문에.. 

내부의 값이 같다고 해도 다른 거라고 나옴.

 

그래서, 값타입 비교 시 

동일성 비교 : 인스턴스의 참조를 비교, == 사용 과

동등성 비교 : 인스턴스의 값을 비교, equals() 등

 

이 둘을 구분해서 사용해야 함.

 

그래서, 값타입은 equals() 메소드를 재정의 해야 함.

거의 모든 필드를 지정해서 재정의 해야함.

 

참고로, equals() 자체의 기본이 ==비교라

재정의 해야 함.

 

보통 equals() 재정의 할 때는 자동으로 만들어 주는 거 쓰는게 좋음.

 

나는 alt + insert 해서 나오는 것 중에 equals() and hashcode() 선택하고 이거 했음.

그럼

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

이렇게 나옴.

둘이 같은 인스턴스면 true를 반환,

인자로 온 오브젝트가 비어있거나 같은 종류의 클래스가 아니면 false 반환.

 

같은 클래스면 그 오브젝트를 같은 클래스로 형변환 한 다음에,

equals를 이용하여(기본이 ==) 다 비교.

근데 이러면 내부에 또 클래스가 있으면 어떻게 되는거지..?

 

 

여튼, 값타입끼리의 비교는 항상 equals()를 써야 함.

 

참고로 equals() 구현하면 hashcode()도 거기에 맞게 구현 해야 함.

그래야 hashmap 등 효율적으로 사용 가능.

 

 

임베디드 타입은

꼭 불변객체로 만들어야 한다.

꼭 equals()를 재정의 해 줘야 한다.

 

 

'JPA > JPA 기본' 카테고리의 다른 글

36. 값타입 실전  (0) 2023.10.30
35. 값타입 컬렉션  (0) 2023.10.29
33. 값타입과 불변 객체  (0) 2023.10.29
32. 임베디드 타입  (0) 2023.10.29
31. 기본값 타입  (0) 2023.10.29