0Pricing
Java Academy · 강의

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 value

instanceof 없이 발생하는 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 기본형과 참조형
  2. 확장 변환과 축소 변환
  3. instanceof 연산자
  4. 실전에서의 형 변환
← Java Academy(으)로 돌아가기