this :
현재 메서드가 호출된 객체 자신을 가리킵니다
class Person {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Person)) return false;
Person person = (Person) obj;
return age == person.age &&
Objects.equals(name, person.name);
}
}
Person person1 = new Person("John", 30);
Person person2 = person1; // 같은 객체를 참조
Person person3 = new Person("John", 30); // 같은 값을 가진 새로운 객체
// equals 메서드 호출 시
person1.equals(person2); // 여기서 this는 person1
if (this == obj) 호출시
this = person1
obj = person2
person1과 person2는 같은 객체를 참조하므로 true 반환
person1.equals(person3) 호출시
this는 person1
obj는 person3
다른 객체이므로 this == obj는 false
따라서 다음 단계의 비교 (instanceof와 필드 비교)로 진행
instanceof
instanceof는 객체가 특정 클래스의 인스턴스인지 확인하는 연산자
class Person {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
// 1. null 체크
if (obj == null) return false;
// 2. instanceof 검사
if (!(obj instanceof Person)) return false;
// obj가 Person 클래스의 인스턴스가 아니면 false 반환
// 예: String, Integer 등 다른 타입이 들어오면 false
// 3. 형변환 후 비교
Person person = (Person) obj; // 안전하게 형변환 가능
return age == person.age && Objects.equals(name, person.name);
}
}
// 사용 예시
Person person = new Person("John", 30);
String str = "John";
person.equals(person); // true (같은 객체)
person.equals(str); // false (String은 Person의 인스턴스가 아님)
person.equals(null); // false (null 체크)
instanceof를 사용하는 이유:
타입 안전성: 다른 타입의 객체와 비교하려고 할 때 오류 방지
안전한 형변환: instanceof 검사 후에는 안전하게 형변환 가능
NPE(NullPointerException) 방지: null 객체에 대한 처리 가능
public boolean equals(Object obj) {
// instanceof 없이 바로 형변환하면
Person person = (Person) obj; // String이 들어오면 ClassCastException 발생!
return age == person.age && Objects.equals(name, person.name);
}