자바에서 instanceof 사용법이 많이 헷갈려서 정리를 해보고자 합니다. 추가적으로 왜 instanceof 를 사용해야 하는지도 같이 적어보겠습니다 :)
- 다운 캐스팅 주의점
- instanceof 사용법
위의 그림은 A가 부모 클래스, B 는 A 의 자식 클래스, C는 B의 자식 클래스를 의미합니다.
여기서 만약에 C c = (C) new B() 를 선언 한다면, 오른쪽 메모리에 보다시피 C 클래스가 인스턴스 내부에 생성이 되질 않습니다. 이때 C 클래스에 있는 메서드, 혹은 멤버 변수에 접근하고자 한다면 런타임 오류를 발생할 것입니다.
이러한 문제는 new B() 가 어떠한 인스턴스를 포함하고 있는지 모르기 때문에 오류가 발생 된 것입니다. 그래서 해당 클래스 변수가 어떠한 인스턴스를 포함하고 있는지 파악하기 위해서 도움을 주는 기능이 바로 instanceof 입니다.
package poly.basic;
public class CastingMain5 {
public static void main(String[] args) {
Parent parent1 = new Parent();
System.out.println("parent1 호출");
call(parent1);
Parent parent2 = new Child();
System.out.println("parent2 호출");
call(parent2);
}
private static void call(Parent parent) {
parent.parentMethod();
if (parent instanceof Child) {
System.out.println("Child 인스턴스 맞음");
Child child = (Child) parent;
child.childMethod();
}
}
}
위의 코드 실행결과:
parent1 호출
Parent.parentMethod
parent2 호출
Parent.parentMethod
Child 인스턴스 맞음
Child.childMethod
여기서 parent instance of Child 는 parent 라는 클래스 변수가 child 의 인스턴스를 포함하는가 를 의미합니다. 그래서 parent2 의 경우 call 메서드를 호출하면 "Child 인스턴스 맞음" 이 출력됨을 알 수 있습니다.
참고) 자바 16버전 부터는 instanceof 를 확인함과 동시에 Child 변수를 생성할 수 있게 해줍니다.
// 위에는 동일
if (parent instanceof Child child) {
System.out.println("Child 인스턴스 맞음");
//Child child = (Child) parent; //요기 필요 없음
child.childMethod();
}