Java - Runtime Type Checking

1 분 소요

Java - Runtime Type Checking

  • Java를 포함한 OOP 언어들에서는 BaseClass(혹은 Interface)의 reference Variable을 사용해서 DerivedClass의 Class Instance를 가리키게 할 수 있습니다. 대략 다음과 같죠.
class BaseClass {
}
class DerivedClass extends BaseClass {
}

// BaseClass 변수인 obj가 DerivedClass Instance를 가리킵니다.
BaseClass obj = new DerivedClass();
  • “왜 이런짓을 해야 하지?”라는 생각이 들 수 있으나. 이를 통해 코드 자체를 매우 유연하게 개발할 수 있습니다.
  • 이런 짓을 Dynamic Typing 혹은 Runtime Type Binding이라고도 하죠.
  • 지금 해당 Variable에 묶여 있는 Object가 무엇인지 알기 위해서는 instanceof를 사용할 수 있죠. 그 외에도 몇 가지 방법이 더 있는데 아래 코드에 정리하였습니다.
class Main {
    public static void main(String[] args) throws Exception {
        /*
        * stringObj는 Object Reference Variable이죠.
        * Java에서는 BaseClass의 Reference Variable을 사용하여,
        * Derived Class Instance를 가리키도록 할 수 있습니다.
        * 즉, 아래에서는 Java의 모든 Class의 BaseClass인 Object Reference Variable을 사용하여
        * String을 가리키도록 한 것이죠. */
        Object stringObj = String.valueOf("11");

        // Instanceof ---------------------------------------------
        // instanceof를 사용하여 Is-A Relationship을 확인할 수 있씁니다.
        // DerivedClass is BaseClass는 true이지만
        // BaseClass isn't DerivedClass 이죠.
        System.out.println(stringObj /*Is-A*/ instanceof String); // true
        System.out.println(stringObj /*Is-A*/ instanceof Object); // true
        System.out.println(stringObj /*Is-A*/ instanceof Integer); // true

        // getClass() ---------------------------------------------
        // Class Instance의 getClass() method를 사용해서 비교하는 것도 가능하죠.
        System.out.println(stringObj.getClass()); // class java.lang.String
        System.out.println(String.class); // class java.lang.String
        System.out.println(stringObj.getClass() == String.class);

        // isInstance() ---------------------------------------------
        // class의 method인 isInstance()를 사용해서 체크하는 것도 가능하죠.
        System.out.println(String.class.isInstance(stringObj));// true
        System.out.println(Object.class.isInstance(stringObj));// true
    }
}

Wrap-up

  • 다만, 내가 사용하려는 methodName이 Reference Variable에 이미 선언되어 있지 않으면 사용할 수 없습니다. 그런 경우에는 다음과 같이 typeConversion을 해줘야 사용할 수 있죠.
BaseClass obj = new DerivedClass();
// Type Converstion
DerivedClass obj1 = (DerivedClass) DerivedClass;

댓글남기기