1211 TIL: equals()

hjern·2023년 12월 10일

자바의 정석

목록 보기
1/3

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()도 오버라이딩 해야 한다(고 한다).

참고자료
[자바의 정석 - 기초편] ch9-1~3 Object클래스와 equals()

profile
주니어의 굴레는 언제 벗어날 것인가

0개의 댓글