값 타입의 비교
임베디드 타입의 경우 아무래도 객체이므로 "==" 비교시에는 서로 다른 인스턴스를 가지므로 false가 나오게 된다.
package hellojpa;
public class ValueMain {
public static void main(String[] args) {
Address address1 = new Address("city","street","zipcode");
Address address2 = new Address("city","street","zipcode");
int a, b; a = b = 10;
System.out.println("int a == int b: " + (a == b));
System.out.println("address1 == address2: " + (address1 == address2));
}
}
출력>>
int a == int b: true
address1 == address2: false
당연한 얘기이지만 int는 call by value를 사용하므로 "=="을 통해서 동일성 비교를 하는 경우에 서로 같음, true가 나오고,
임베디드 타입(값 타입) address1, 2는 서로 다른 인스턴스를 가지므로 false가 나오게 된다. 그래서 값 타입을 비교하는 경우에는
"=="이 아닌 equals() 메소드를 사용해야 한다.
- 동일성 비교: 인스턴스의 참조 값을 비교, == 사용
- 동등성 비교: 인스턴스의 값을 비교, equals() 사용
단순 equals 비교시
package hellojpa;
public class ValueMain {
public static void main(String[] args) {
Address address1 = new Address("city","street","zipcode");
Address address2 = new Address("city","street","zipcode");
System.out.println("address1.equals(address2): " + (address1.equals(address2)));
}
}
출력>>
address1.equals(address2): false
지금 보면 equals 비교로 동등성 값 비교를 했음에도 불구하고 false가 나왔다. 이는 equals 메소드를 까보면 명확하게 알 수 있다.
equals() 메소드 구현부
public boolean equals(Object obj) {
return (this == obj); // 기본이 == 비교
}
지금 보면 equals 메소드는 초기에는 == 비교를 하고 있어서 단순히 그냥 사용할 경우 == 비교와 다를 것이 없다는 것을 알 수 있다. 따라서 우리가 값 타입에 동등성 비교를 적용하기 위해서는 메소드를 따로 오버라이드 해줘야 한다.
package hellojpa;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.ManyToOne;
import java.util.Objects;
@Embeddable
@Getter
public class Address {
private String city;
private String street;
@Column(name = "ZIPCODE")
private String zipCode;
public Address() {
}
public Address(String city, String street, String zipCode) {
this.city = city;
this.street = street;
this.zipCode = zipCode;
}
@Override // 임베디드 타입의 동등성 비교를 위한 equals() 오버라이딩
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 메소드 오버라이딩의 경우 intellij 에서 mac의 경우 ⌘ + N으로, window의 경우 alt + insert로 간단히 생성할 수 있다.
'Spring > JPA' 카테고리의 다른 글
JPA- 기본 문법과 쿼리 API (0) | 2023.05.07 |
---|---|
JPA- 값 타입 컬렉션 (0) | 2023.04.30 |
JPA- 값 타입과 불변 객체 (0) | 2023.03.23 |
JPA- 임베디드 타입 (0) | 2023.03.22 |
JPA- Cascade와 고아 객체 (0) | 2023.03.21 |