값 타입은 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야한다.
int a
== int b
는 값을 비교하기 때문에 true
Address a
== Address b
는 참조 값을 비교하기 때문에 false
인스턴스의 참조 값을 비교 ==
사용
인스턴스의 값을 비교, equals()
사용
따라서 값 타입은 a.equals(b)
를 사용해서 동등성 비교를 해야한다.
값 타입의 equals()
메소드를 적절하게 재정의 해야한다.
Address address1 = new Address("city", "street", "10000");
Address address2 = new Address("city", "street", "10000");
System.out.println("address1==address2: " (address1==address2));
System.out.println("address1 equals address2: " (address1.equals(address2)));
address1==address2: false
address1 equals address2: false
equals()
를 이용해 동등성 비교를 해도 false
가 출력된다.
-> equals()
기본 구현이 ==
비교로 되어있다.
public boolean equals(Object obj){
return (this == obj);
}
따라서 equals()
를 오버라이딩해서 사용해야한다.
또한 equals()
를 오버라이딩 할 때, hashcode()
도 오버라이딩 해야 자바 컬렉션에서 효율적으로 사용할 수 있다.
class Address {
@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);
}
}
오버라이딩 후 Main Code를 실행하면
address1==address2: false
address1 equals address2: true
equals()
동등성 비교시 true
가 출력된다.
참고 :
김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.