자바 instanceof

장원재·2024년 1월 8일
0

java

목록 보기
2/19

자바에서 instanceof 사용법이 많이 헷갈려서 정리를 해보고자 합니다. 추가적으로 왜 instanceof 를 사용해야 하는지도 같이 적어보겠습니다 :)

  1. 다운 캐스팅 주의점
  2. instanceof 사용법
  1. 다운 캐스팅 주의점:
  • 자바에서 특히 다형성을 이용을 할 때, 부모 자식의 상속 관계를 정확하게 파악하지 못한채 다운 캐스팅을 하면 심각한 런타임 오류가 발생할 수 도 있습니다.
    <출처: 김영한 실전 자바 교안>
  • 위의 그림은 A가 부모 클래스, B 는 A 의 자식 클래스, C는 B의 자식 클래스를 의미합니다.

  • 여기서 만약에 C c = (C) new B() 를 선언 한다면, 오른쪽 메모리에 보다시피 C 클래스가 인스턴스 내부에 생성이 되질 않습니다. 이때 C 클래스에 있는 메서드, 혹은 멤버 변수에 접근하고자 한다면 런타임 오류를 발생할 것입니다.

  • 이러한 문제는 new B() 가 어떠한 인스턴스를 포함하고 있는지 모르기 때문에 오류가 발생 된 것입니다. 그래서 해당 클래스 변수가 어떠한 인스턴스를 포함하고 있는지 파악하기 위해서 도움을 주는 기능이 바로 instanceof 입니다.


  1. 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();
}
profile
데이터 분석에 관심있는 백앤드 개발자 지망생입니다

0개의 댓글

관련 채용 정보