본문 바로가기

Spring/JPA

JPA- 값 타입의 비교

값 타입의 비교

 임베디드 타입의 경우 아무래도 객체이므로 "==" 비교시에는 서로 다른 인스턴스를 가지므로 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