공부/JPA

JPA 값 타입 - 값 타입의 비교

데부한 2022. 7. 12. 23:24
반응형

출처 : 자바 ORM 표준 JPA 프로그래밍 인프런 강의

 

JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.

 

값 타입의 비교

  • 값 타입 : 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야 한다.
// 같다.
int a = 10;
int b = 10;

// 다르다.
Address a = new Address("서울시");
Address b = new Address("서울시");

그런데 객체의 경우엔 == 비교 시 false가 반환된다. 왜나햐면 JAVA에서는 == 비교 시 참조 값을 비교하게 되는데 a와 b는 각각 다른 참조 값을 갖고 있기 때문에 false가 반환된다.

  • 동일성(identity) 비교 : 인스턴스의 참조 값을 비교, == 사용
  • 동등성(equivalence) 비교 : 인스턴스의 값을 비교, equals() 사용
  • 값 타입은 a.equals(b)를 사용해서 동등성 비교를 해야 함
  • 값 타입의 equals() 메서드를 적절하게 재정의(주로 모든 필드 사용)

그럼 equalse()를 사용해보자.

Address address1 = new Address("city", "street", "1000");
Address address2 = new Address("city", "street", "1000");

System.out.println("address1 == address2 : " + (address1 == address2)); // false
System.out.println("address1.equals(address2) : " + address1.equals(address2)); // false

생각했던 것과 다르게 equals()를 사용해도 false가 출력된다. 이유는 equals()는 기본적으로 == 비교를 하기 때문이다.

// equals() 
public boolean equals(Object obj) {
    return (this == obj);
}

그렇기 때문에 의도하는 대로 true를 반환하게 하고 싶으면 equals()를 재정의해야 한다.

// Address.class

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

위와 같이 추가해주면 되는데.... 인텔리제이 기능을 이용하여 쉽게 코드를 자동으로 만들 수 있다.

mac 기준 Control + N 후 equals() and hashCode() 선택

웬만하면 다 기본으로 제공하는 설정을 사용하는 게 좋다. 그러니 계속 next를 누르다가 create를 누르면 위의 코드가 자동으로 생성된다.
그러고 애플리케이션을 다시 실행해보면 원하던 의도대로 실행되는 걸 볼 수 있다.

System.out.println("address1 == address2 : " + (address1 == address2));
System.out.println("address1.equals(address2) : " + address1.equals(address2)); // true

 

반응형