블로그

[JAVA] instanceof 연산자 본문

개발자 준비과정/JAVA

[JAVA] instanceof 연산자

하늘바람a 2024. 3. 11. 17:45

참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위한 연산자

 

주로 조건문에 사용된다.

연산의 결과 -> boolean 타입인 true, false 반환

 

연산결과가 true 이면 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.

 

 

참조변수 instanceof 타입(클래스명)

 

public class InstanceOf {
    public static void main(String[] args) {
        // instanceof : 연산자
        // 피연산자 갯수 : 2개
        // 왼쪽항 : 참조변수
        // 오른쪽항 : Type(Class, Instance)
        // 연산결과 : boolean (true / false)

        Tiger tiger = new Tiger();
        Animal animal = tiger;

        boolean b1 = animal instanceof Cat; // false
        boolean b2 = animal instanceof Tiger; // true
        boolean b3 = animal instanceof Animal; // true
        
        if (animal instanceof Cat) { // false이므로 실행되지 않는다.
            C04Cat cat = (C04Cat) animal; 
            cat.meow();
        }

        // 자바 12부터 가능
        if (animal instanceof Cat cat) { // 위의 조건문을 줄여서 쓸 수 있다. 
            cat.meow();
        }
        System.out.println("프로그램 종료");
    }
}
class Animal {}
class Tiger extends Animal {}
class Cat extends Animal {
    public void meow() {
        System.out.println("야옹");
    }
}

 

참조변수 animal은 Tiger 객체를 참조하고 있고, Cat은 참조하고 있지 않다.

그러므로 Cat으로 형변환을 할 수 없다.

 

이를 알아보기 위해 위의 코드처럼 instanceof 연산자를 이용했고,

boolean b1 = animal instance of Cat 결과 false인 것을 알 수 있다.

 

강제형변환이 안되는 상태인데 실행하면 프로그램 종료가 일어나기 때문에 instanceof 연산자로 객체 타입을 확인하고 강제형변환을 시켜야 한다.


String s = "java";
Object o = s;
System.out.println(s instanceof String);
System.out.println(s instanceof Object); //String의 부모클래스
System.out.println(s instanceof Serializable); //String의 인터페이스

CharSequence charSequence = s;
System.out.println(charSequence instanceof CharSequence); //true
System.out.println(charSequence instanceof String); //true

 

위의 코드에서 instanceof 연산자가 쓰인 코드가 모두 true인 이유는

s, charSequence 모두 실제 인스턴스가 String이기 때문이다.

'개발자 준비과정 > JAVA' 카테고리의 다른 글

[JAVA] 람다식  (0) 2024.03.13
[JAVA] 중첩 클래스, 익명 클래스  (0) 2024.03.12
[JAVA] 객체 배열...  (3) 2024.03.07
[JAVA] Class String, Arrays 주요 메소드  (1) 2024.03.06
[JAVA] Call By Value  (0) 2024.03.04