instanceof 연산자
캐스팅하기 전에 객체 유형을 확인하고 ClassCastException을 방지하는 데 instanceof를 사용합니다.
instanceof 연산자은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
instanceof 연산자
instanceof 연산자는 실행 중 객체가 지정된 형식의 인스턴스인지 확인합니다. true 또는 false를 반환하며, 형변환 전에 ClassCastException이 발생하는 것을 방지합니다.
기본 instanceof 사용법
안전한 형변환을 수행하기 전에 instanceof를 사용하여 객체의 실행 중 형식을 확인합니다.
Object obj = "Hello, Java!";
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.toUpperCase()); // HELLO, JAVA!
}
Object num = Integer.valueOf(42);
System.out.println(num instanceof Integer); // true
System.out.println(num instanceof String); // false상속과 instanceof
객체가 해당 클래스 또는 모든 하위 클래스의 인스턴스이거나, 구현된 인터페이스 중 하나의 인스턴스이면 instanceof는 true를 반환합니다.
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
Animal a = new Dog();
System.out.println(a instanceof Animal); // true
System.out.println(a instanceof Dog); // true
System.out.println(a instanceof Cat); // false패턴 매칭 instanceof (Java 16 이상)
Java 16에서는 instanceof에 패턴 매칭이 도입되었습니다. 같은 표현식에서 바인딩 변수를 선언할 수 있으므로 명시적인 형변환이 필요하지 않습니다.
Object shape = "circle";
// Old way
if (shape instanceof String) {
String s = (String) shape;
System.out.println(s.length());
}
// New way (Java 16+) — binding variable 's' is in scope
if (shape instanceof String s) {
System.out.println(s.length()); // 6
}메서드에서의 패턴 매칭
패턴 매칭을 사용하면 형식에 따른 분기 처리를 깔끔하고 안전하게 구현할 수 있습니다. 바인딩 변수는 조건이 참이라고 확인되는 범위에서만 사용할 수 있습니다.
sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}
static double area(Shape s) {
if (s instanceof Circle c) {
return Math.PI * c.radius() * c.radius();
} else if (s instanceof Rectangle r) {
return r.width() * r.height();
}
throw new IllegalArgumentException("Unknown shape");
}
System.out.println(area(new Circle(5))); // 78.53...
System.out.println(area(new Rectangle(4, 6))); // 24.0널 값과 instanceof
null instanceof AnyType는 항상 false를 반환하며 절대 예외를 발생시키지 않습니다. 따라서 instanceof는 형변환 전에 확인할 때 널 값에도 안전한 방법입니다.
String s = null;
System.out.println(s instanceof String); // false (not NPE)
Object o = null;
if (o instanceof Number n) {
System.out.println(n.intValue());
} else {
System.out.println("Not a number (or null)"); // prints this
}switch 표현식과 패턴 매칭
Java 21에서는 패턴 매칭을 switch 표현식으로 확장하여, 여러 if-else를 연결하지 않고도 형식에 따라 깔끔하게 분기할 수 있습니다.
static String describe(Object obj) {
return switch (obj) {
case Integer i -> "Integer: " + i;
case Double d -> "Double: " + d;
case String s -> "String of length " + s.length();
case null -> "null value";
default -> "Unknown: " + obj.getClass().getSimpleName();
};
}
System.out.println(describe(42)); // Integer: 42
System.out.println(describe(3.14)); // Double: 3.14
System.out.println(describe("hello")); // String of length 5
System.out.println(describe(null)); // null valueinstanceof 없이 발생하는 ClassCastException
먼저 확인하지 않고 형변환하면 실행 중 ClassCastException이 발생합니다. 이는 기존 코드에서 흔히 발생하는 버그이며 패턴 매칭으로 방지할 수 있습니다.
Object obj = "I am a String";
try {
Integer i = (Integer) obj; // ClassCastException!
} catch (ClassCastException e) {
System.out.println("Cannot cast String to Integer");
}
// Safe version
if (obj instanceof Integer i) {
System.out.println("Is integer: " + i);
} else {
System.out.println("Not an integer");
}실전: 혼합 목록 처리
실제 활용 사례로, 패턴 매칭을 사용하여 여러 형식의 객체가 섞인 목록을 처리할 수 있습니다.
import java.util.List;
List<Object> events = List.of(
"User login", 42, 3.14, "Payment processed", 100
);
double numericSum = 0;
for (Object e : events) {
if (e instanceof Integer n) numericSum += n;
else if (e instanceof Double d) numericSum += d;
else if (e instanceof String s) System.out.println("Log: " + s);
}
System.out.printf("Numeric sum: %.2f%n", numericSum); // 145.14봉인 클래스와 완전한 매칭
봉인 클래스(Java 17 이상)는 해당 클래스를 확장할 수 있는 클래스를 제한합니다. 패턴 매칭 switch와 함께 사용하면 컴파일러가 모든 경우를 처리했는지 확인할 수 있으므로 기본 경우가 필요하지 않습니다.
sealed interface Notification permits EmailNotification, SmsNotification {}
record EmailNotification(String to, String body) implements Notification {}
record SmsNotification(String phone, String text) implements Notification {}
static void send(Notification n) {
switch (n) {
case EmailNotification e ->
System.out.println("Email to " + e.to() + ": " + e.body());
case SmsNotification s ->
System.out.println("SMS to " + s.phone() + ": " + s.text());
// no default needed — compiler knows all cases are covered
}
}가드 패턴
패턴 매칭은 when(Java 21)을 사용한 가드를 지원하므로 형식 확인과 함께 불리언 조건을 추가할 수 있습니다.
static String classify(Number n) {
return switch (n) {
case Integer i when i < 0 -> "negative int: " + i;
case Integer i when i == 0 -> "zero";
case Integer i -> "positive int: " + i;
case Double d -> "double: " + d;
default -> "other number";
};
}
System.out.println(classify(-5)); // negative int: -5
System.out.println(classify(0)); // zero
System.out.println(classify(7)); // positive int: 7빠른 확인
다음 표현식은 무엇을 반환합니까?
Object obj = null; boolean result = obj instanceof String; System.out.println(result);
복습: instanceof 연산자
핵심 정리:
- instanceof는 실행 중 형식을 확인하고 ClassCastException을 방지합니다
- 널 값에서는 false를 반환하며 NPE를 절대 발생시키지 않습니다
- 해당 클래스 자체와 모든 하위 클래스 및 인터페이스에 대해 true를 반환합니다
- Java 16 이상 패턴 매칭: if 조건에서 instanceof String s는 확인과 형변환을 함께 수행합니다
- Java 21의 패턴을 사용하는 switch는 선택적인 가드와 함께 형식에 따라 깔끔하게 분기합니다
- 봉인 클래스와 모든 경우를 처리하는 switch를 함께 사용하면 기본 경우가 필요하지 않습니다
자주 묻는 질문
“instanceof 연산자” 강의는 무료인가요?
네 — “instanceof 연산자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“instanceof 연산자”에서 뭘 배우나요?
캐스팅하기 전에 객체 유형을 확인하고 ClassCastException을 방지하는 데 instanceof를 사용합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“instanceof 연산자” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 기본형과 참조형
- 확장 변환과 축소 변환
- instanceof 연산자
- 실전에서의 형 변환