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의 부모타입임)
왜 사용하는가
캐스팅 안정성 확보를 위해서
- 자바에서 상위 타입으로 선언된 참조 변수는 하위 객체를 가리킬 수 있지만, 다시 하위 타입으로 캐스팅할 때 형변환 오류가 발생할 수 있다
- 이 때 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 |