반응형
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
반응형