Objest의 equals()를 오버라이딩 하지 않는다면, 서로 다른 객체의 주소만을 비교하므로, 실제 데이터 값이 동일하더라도 false만 리턴될 것이다. 이에 equals를 다음과 같이 오버라이딩 해줄 필요가 있다.
public class Value {
int value;
public Value(int value) {
value = value;
}
// override 전, return this == obj 서로 다른 객체의 참조값(주소) 비교 // 항상 false
// override 후, return this.value == v.value 인스턴스 내 데이터 값 비교 // true
public boolean equals (Object obj){
// 참조변수의 형변환 전에는 반드시 instanceof로 확인해야함
if(!(obj instanceof Value)){
return false;
}
Value v = (Value)obj; // obj를 value로 형변환
return this.value == v.value;
}
}
중간에 주석으로 잠깐 등장하고 지나가지만, Object 클래스가 최상위 클래스인 점을 빌려 참조 변수의 형변환 전에는 반드시 instanceof를 확인하는 과정을 빼놓지 말아야 한다는 것도 기억하자.
public class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if(v1.equals(v2)){
System.out.println("v1과 v2는 동일합니다.");
} else {
System.out.println("v1과 v2는 다릅니다.");
}
}
}
참고로, 이후 강의에도 등장하지만 equals()를 오버라이딩 했다면, hashCode()도 오버라이딩 해야 한다(고 한다).