Langauge/Java-basic

[Java] instanceof : 캐스팅 가능 여부 확인

강잇 2022. 7. 30. 23:32

instanceof

  • 캐스팅의 가능 여부를 판단하기 위해서는 '클래스 사이의 상속 관계', '어떤 생성자로 인스턴스를 생성했는가?'를 판단해야 한다.
  • 프로젝트의 규모가 커지고, 클래스가 많아지면 이러한 조건을 매순간 판단하는 것이 어려워진다.
  • 이를 해결하기 위해 Java에서는 캐스팅 가능 여부를 boolean 타입으로 반환해주는 instanceof라는 연산자를 제공한다.
  • 소스 코드가 길어져 일일이 생성 객체의 타입을 확인하기 어려운 상황에서 에러를 최소화하는 유용한 수단이 될 수 있다.
    -> 캐스팅 가능 여부를 확인하고, 가능한 때만 캐스팅을 수행해 실행 예외로 프로그램이 종료되는 것을 방지할 수 있다.
참조 변수 instanceof 타입명

예시

public class Test {
    public static void main(String[] args) {
        Animal animal1 = new Animal();
        Animal cat1 = new Cat();
        Cat cat2 = new Cat();

        System.out.println("캐스팅 가능 여부");
        System.out.println(animal1 instanceof Cat); // animal1이 Cat으로 형변환 가능?
        System.out.println(cat1 instanceof Cat); // cat1가 Cat으로 형변환 가능?
        System.out.println(cat2 instanceof Animal); // cat2가 Cat으로 형변환 가능?

        Cat cat3 = null;
        if (cat1 instanceof Cat) { // Animal cat1이 Cat으로 캐스팅 가능?
            cat3 = (Cat)cat1; // 가능하면 형변환
            cat3.grooming(); // Cat의 기능 그루밍() 호출
        } else { // 다운 캐스팅을 할 수 없으면 오류 메세지 출력
            System.out.println("Animal cat1은 Cat으로 캐스팅할 수 없습니다.");
        }
        Cat cat4 = null;
        if (animal1 instanceof Cat) { // Animal animal1이 Cat으로 캐스팅 가능한가?
            cat4 = (Cat) animal1;
            cat4.grooming();
        } else {
            System.out.println("Animal animal1은 Cat으로 캐스팅할 수 없습니다.");
        }

    }
}
class Animal {
    public void sleep() {
        System.out.println("잠을 잡니다.");
    }
}
class Cat extends Animal {
    public void grooming() {
        System.out.println("그루밍을 합니다.");
    }
}