본문 바로가기

JAVA/다형성(Polymorphism)

instanceof

instanceof 연산자는 참조변수의 타입 변환(캐스팅)이 가능한지의 여부를 boolean 값으로 반환한다

클래스의 상속관계나 다형성이 복잡해질수록, 객체가 실제 어떤 타입의 인스턴스인지 코드상에서 직접 파악하기 어려워지는데, 이 때 instanceof를 통해 안전하게 형변환이 가능한지의 여부를 판단할 수 있다


기본 문법

 

참조변수 instanceof 클래스명

 

  • 참조변수가 해당 클래스나 그 자식 클래스의 인스턴스라면, true를 반환한다
  • 그렇지 않으면 false를 반환한다
  • 참조변수가 null이면, 항상 false를 반환한다

class Animal {

}

class Bat extends Animal {

}

class Cat extends Animal {

}

public class InstanceOfExample {
	public static void main(String[] args) {
    	Animal animal = new Animal();
        System.out.println(animal instanceof Object); // true
        System.out.println(animal instanceof Animal); // true
        System.out.println(animal instanceof Bat);    // false

        Animal cat = new Cat();
        System.out.println(cat instanceof Object);    // true
        System.out.println(cat instanceof Animal);    // true
        System.out.println(cat instanceof Cat);       // true
        System.out.println(cat instanceof Bat);       // false
    }
}

 

* animal instanceof Bat이 false인 이유

animal은 Animal로 생성되었기 때문에 Bat 타입이 아니고, 또한 Bat은 Animal의 자식이기 때문에 Bat타입이거나 Bat타입의 자식이 아니므로 false임 (Animal은 Bat의 부모타입임)

 


왜 사용하는가

캐스팅 안정성 확보를 위해서

  1. 자바에서 상위 타입으로 선언된 참조 변수는 하위 객체를 가리킬 수 있지만, 다시 하위 타입으로 캐스팅할 때 형변환 오류가 발생할 수 있다
  2. 이 때 instanceof를 활용하여 캐스팅이 안전한지 검사한 뒤에 타입변환을 진행하면, 오류를 예방할 수 있다

타입 안정성을 확보하는 구조

if(참조변수 instanceof 클래스명) {
    클래스명 변수명 = (클래스명) 참조변수;
    // 안전하게 다운캐스팅 후 로직 수행
}

 

class Animal {

}

class Bat extends Animal {
	void fly() {
    	System.out.println("박쥐가 날아요");
    }
}

class Cat extends Animal {
	void meow() {
    	System.out.println("고양이가 울어요");
    }
}

public class Example {
	public static void main(String[] args) {
    	Animal animal = new Cat(); // 업캐스팅
        
        if(animal instanceof Cat) { // Cat이 자식이고 Animal이 부모이므로 가능
        	((Cat)animal).meow(); // 안전한 다운캐스팅
        } else if(animal instanceof Bat) {
        	((Bat)animal).fly();
        }
    }
}

 

* Animal 타입의 참조 변수 animal이 실제로는 Cat 객체를 가리키고 있을 때

* instanceof를 통해 객체의 실제 타입을 판별한 후

* Cat 타입으로 안전하게 다운캐스팅하여 meow() 메서드를 호출한다

* 만약 animal이 Bat 객체라면, 대신 fly() 메서드를 호출한다


정리

항목 설명
사용 목적 참조변수의 실제 타입 확인 및 안전한 다운캐스팅 수행
반환값 boolean
null 참조 검사 null instanceof 클래스 << 항상 false임
주의할 점 instanceof는 형변환 자체를 수행하지 않으며, 여부만 판단한다
주요 활용 케이스 다형성 상황에서 다운캐스팅이 필요할 때, 형변환 전에 안전성 확보

 

'JAVA > 다형성(Polymorphism)' 카테고리의 다른 글

참조 변수의 타입 변환(up-casting, down-casting)  (0) 2026.04.17
다형성(Polymorphism)  (0) 2026.04.17