instanceof 연산자란?
자바의 instanceof 연산자는 객체 참조 변수에만 사용할 수 있는 연산자입니다. 이 연산자는 해당 객체가 특정 타입(클래스 타입 또는 인터페이스 타입)에 속하는지 여부를 검사하는 데 사용됩니다.
기본 문법
(객체 참조 변수) instanceof (클래스/인터페이스 타입)
연산자 왼쪽의 변수가 참조하는 객체가 오른쪽에 명시된 클래스 또는 인터페이스 타입에 대한 IS-A 관계 검사를 통과하면 결과는 true, 그렇지 않으면 false가 됩니다.
예제 1: 기본적인 사용법
public class Test {
public static void main(String args[]) {
String name = "James"; // name은 String 타입이므로 true 반환
boolean result = name instanceof String;
System.out.println(result);
}
}실행 결과
true
위 예제에서 name 변수는 String 타입이므로 instanceof 검사 결과 true가 출력됩니다.
예제 2: 상속 관계에서의 instanceof
instanceof 연산자는 비교 대상 객체가 오른쪽 타입과 할당 호환(assignment compatible) 관계일 때도 true를 반환합니다. 즉, 부모 클래스 타입의 참조 변수가 실제로는 자식 클래스의 인스턴스를 가리키고 있어도 검사를 통과합니다.
class Vehicle {}
public class Car extends Vehicle {
public static void main(String args[]) {
Vehicle a = new Car();
boolean result = a instanceof Car;
System.out.println(result);
}
}실행 결과
true
Vehicle 타입으로 선언된 변수 a가 실제로는 Car 인스턴스를 참조하고 있으므로, a instanceof Car는 true를 반환합니다. 이처럼 instanceof는 다형성(polymorphism) 환경에서 객체의 실제 타입을 확인할 때 유용하게 활용됩니다.
추가로 알아두면 좋은 점
null 값 처리
참조 변수가 null을 가리키고 있으면 어떤 타입과 비교하더라도 항상 false를 반환합니다. 이때 NullPointerException이 발생하지 않으므로 안전하게 사용할 수 있다는 장점이 있습니다.
Java 16+ 패턴 매칭(Pattern Matching)
Java 16부터는 instanceof 연산자에 패턴 매칭 기능이 정식 도입되어, 타입 검사와 형 변환(casting)을 한 번에 처리할 수 있습니다.
if (obj instanceof String s) {
// s는 자동으로 String 타입으로 형변환됨
System.out.println(s.length());
}기존에는 instanceof로 타입을 확인한 뒤 별도로 강제 형변환을 해야 했지만, 패턴 매칭을 사용하면 코드가 더 간결하고 안전해집니다.