This 문법

minjun kim·2024년 12월 2일

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
  1. if (this == obj) 호출시
    this = person1
    obj = person2
    person1과 person2는 같은 객체를 참조하므로 true 반환

  2. 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);
}
profile
배움의 흔적을 남기고 싶습니다.

0개의 댓글