Java - instanceOf 연산자

instanceOf 연산자는 객체가 어떤 클래스인지, 어떤 클래스를 상속받았는지 확인하는데 사용하는 연산자입니다.

instanceOf를 어떻게 사용하고, 어떻게 동작하는지 알아보겠습니다.

Syntax

Syntax는 다음과 같습니다. object가 type이거나 type을 상속받는 클래스라면 true를 리턴합니다. 그렇지 않으면 false를 리턴합니다.

object instanceOf type

instanceOf 예제

간단히 표현하면 ArrayList와 List 클래스의 구조는 다음과 같습니다.

public class ArrayList<E> implements List {
}

public List {

}

아래와 같이 ArrayList 객체가 있을 때, instanceOf를 사용하면 이 객체가 ArrayList인지, List로부터 상속받은 클래스의 객체인지 확인할 수 있습니다.

ArrayList list = new ArrayList();

System.out.println(list instanceof ArrayList);
System.out.println(list instanceof List);

Output:

true
true

하지만 다음과 같이 Set의 클래스인지 확인해보면 false를 리턴하게 됩니다. ArrayList는 Set도 아니고, Set를 상속하지도 않기 때문입니다.

ArrayList list = new ArrayList();
System.out.println(list instanceof Set);

Output:

false

Object에 대한 instanceOf

모든 클래스는 Object를 상속하기 때문에 object instanceOf Object는 항상 true를 리턴합니다.

ArrayList list = new ArrayList();

System.out.println(list instanceof Object);

Output:

true

null 객체에 대한 instanceOf

object가 null이라면 instanceOf는 항상 false를 리턴합니다.

ArrayList list = null;

System.out.println(list instanceof Object);
System.out.println(list instanceof ArrayList);
System.out.println(list instanceof List);
System.out.println(list instanceof Set);

Output:

false
false
false
false

Generics의 instanceOf

ArrayList<String>처럼 Generics로 생성된 객체도 동일하게 instanceOf로 타입을 체크할 수 있습니다.

ArrayList<String> list = new ArrayList<>();

System.out.println(list instanceof Object);
System.out.println(list instanceof ArrayList);
System.out.println(list instanceof List);

Output:

true
true
true
false

하지만 Generic 클래스 내에서 T와 같은, 타입이 결정되지 않은 상태에서 instanceOf로 타입 체크는 할 수 없습니다. T는 컴파일 과정에서 실제 타입으로 변경되기 때문입니다.

public <T> void printListItem(List<T> list) {
    if (T instanceof String) {
        for (T item : list) {
            System.out.println(item);
        }
    }
}

위 코드는 다음과 같은 컴파일 에러가 발생합니다.

Error:(41, 13) java: cannot find symbol
  symbol:   variable T
  location: class example.InstanceOf

다음과 같이 List<T>의 타입을 확인하는 것도 컴파일 에러가 발생합니다.

public <T> void printListItem(List<T> list) {
    if (list instanceof List<String>) {
        for (T item : list) {
            System.out.println(item);
        }
    }
}
Error:(41, 33) java: illegal generic type for instanceof
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha