“==”
연산자로 비교를 한다.Object
클래스에는 equals()
메서드가 존재하는데 내부 구현을 보면 “==
” 을 사용함을 알 수 있다.public boolean equals(Object obj) {
return (this == obj);
}
equals()
메서드를 재정의하는 것이 필요하다. 재정의는 인텔리제이 기능을 사용하면 되니 외울 필요는 없다.equals()
메서드를 오버라이딩하여 비교한다.package lecture.objects.inner;
import java.util.Objects;
public class MemberV2 {
private int memberId;
private String name;
private String email;
public MemberV2(int memberId, String name, String email) {
this.memberId = memberId;
this.name = name;
this.email = email;
}
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) {
return false;
}
MemberV2 memberV2 = (MemberV2) o;
return memberId == memberV2.memberId && Objects.equals(name, memberV2.name) && Objects.equals(
email, memberV2.email);
}
@Override
public int hashCode() {
return Objects.hash(memberId, name, email);
}
}
equals()
을 재정의할 때 hashCode()
도 반드시 재정의 해야 한다. HashMap
, HashSet
같은 자료형에서는 Object 들을 해시할 때 Object.hashCode()
를 사용해 해시 값을 구하기 때문이다.true
를 반환해야 한다.equals()
의 결과는 항상 같아야 한다.x.equals(null)
는 항상 false를 반환해야 함.여기서 등장하는 것이 이펙티브 자바에서도 언급하는 "hashCode()
와 equals()
함수를 재정의해라"이다. 반드시
hashCode() 함수는 자바의 최상위 클래스인 Object에서 정의가 되어있는데 그 내용은 다음과 같다.
public class Object {
public native int hashCode();
}
여기서 native는 C,C++로 작성되어(java로 작성되지 않음) JVM 내부의 네이티브 코드로 작성되어있다는 말이다. native method를 사용하는 이유는 다음과 같다.