instanceof 연산자

전제 클래스 (아래 문제 공통)

public class A {}
public class AA extends A {}     // A의 자식
public class AB extends A {}     // A의 자식 (AA의 형제)
public class AAA extends AA {}   // AA의 자식
        A
       / \
     AA   AB
     /
   AAA

다음 코드의 출력은? (자신·부모에 대해 instanceof)

AAA obj = new AAA();
System.out.println(obj instanceof AAA);
System.out.println(obj instanceof AA);
System.out.println(obj instanceof A);
true
true
true
  • instanceof는 실제 타입이 그 클래스이거나 자식이면 true
  • AAAAA, A와 is-a 관계 → 부모 클래스에 대해서도 true (묵시적 업캐스팅이 되는 관계면 true)

다음 코드의 출력은? (부모 개체를 자식으로 검사)

A a = new A();
System.out.println(a instanceof A);
System.out.println(a instanceof AA);
true
false
  • 실제 개체가 A이므로 자식 AA에 대해서는 false (부모는 자식이 아님)

다음 코드의 출력은? (형제 검사)

A ab = new AB();
System.out.println(ab instanceof AB);
System.out.println(ab instanceof AA);
System.out.println(ab instanceof A);
true
false
true
  • ABAA는 형제(is-a 아님) → false
  • 자신(AB)·부모(A)에 대해서는 true

다음 코드의 출력은? (정적 타입은 부모, 실제 타입은 자식)

A x = new AAA();
System.out.println(x instanceof AAA);
true
  • 변수 x의 정적 타입은 A지만, instanceof실행 중 타입(AAA)으로 판단 (RTTI)

다음 코드의 출력은? (instanceof로 ClassCastException 방지)

A obj = new AB();
if (obj instanceof AA) {
    AA aa = (AA) obj;
    System.out.println("AA");
} else {
    System.out.println("not AA");
}
not AA
  • 실제 개체가 ABobj instanceof AA는 false → 캐스팅하지 않음
  • 캐스팅 전에 instanceof로 확인하면 ClassCastException을 방지할 수 있음

0건의 항목