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
trueinstanceof는 실제 타입이 그 클래스이거나 자식이면 trueAAA는AA,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
trueAB와AA는 형제(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- 실제 개체가
AB라obj instanceof AA는 false → 캐스팅하지 않음 - 캐스팅 전에
instanceof로 확인하면ClassCastException을 방지할 수 있음