PHpullh
학습 라이브러리/Java/Sealed Class & Pattern Matching (Java 17/21)

JAVA · 기초 문법

Sealed Class & Pattern Matching (Java 17/21)

대수적 데이터 타입을 Java에서 구현하는 Sealed Class와 패턴 매칭.

기초 문법중급Sealed classPattern MatchingJava 21switchinstanceof

핵심 설명

대수적 데이터 타입을 Java에서 구현하는 Sealed Class와 패턴 매칭.

Java code

// Sealed class (Java 17+)
public sealed interface Shape
    permits Circle, Rectangle, Triangle {}

public record Circle(double radius) implements Shape {}
public record Rectangle(double w, double h) implements Shape {}
public record Triangle(double base, double height) implements Shape {}

// Pattern Matching for switch (Java 21)
public class PatternMatching {

    static double area(Shape shape) {
        return switch (shape) {
            case Circle c       -> Math.PI * c.radius() * c.radius();
            case Rectangle r    -> r.w() * r.h();
            case Triangle t     -> 0.5 * t.base() * t.height();
            // else 불필요 — sealed로 완전성 보장
        };
    }

    // Guarded patterns (Java 21)
    static String classify(Shape shape) {
        return switch (shape) {
            case Circle c when c.radius() > 10  -> "대형 원";
            case Circle c                        -> "소형 원";
            case Rectangle r when r.w() == r.h() -> "정사각형";
            case Rectangle r                     -> "직사각형";
            case Triangle t                      -> "삼각형";
        };
    }

    // instanceof Pattern Matching (Java 16+)
    static void printInfo(Object obj) {
        if (obj instanceof String s && !s.isBlank()) {
            System.out.println("문자열 길이: " + s.length());
        } else if (obj instanceof Integer i && i > 0) {
            System.out.println("양의 정수: " + i);
        }
    }

    public static void main(String[] args) {
        Shape[] shapes = {
            new Circle(5), new Rectangle(3, 4), new Triangle(6, 8)
        };
        for (var s : shapes) {
            System.out.printf("%s → %.2f%n", classify(s), area(s));
        }
        printInfo("Hello");
        printInfo(42);
    }
}

학습 팁

Sealed class + pattern matching은 Kotlin의 sealed class + when과 동일한 역할을 합니다. Java 21에서 정식 기능이 됐습니다.

주의할 점

switch에서 Sealed class를 사용할 때 permits 타입 중 하나라도 빠지면 컴파일 에러가 납니다. 이것이 exhaustive 검사의 강점입니다.

자주 묻는 질문

Sealed Class & Pattern Matching (Java 17/21)란 무엇인가요?

대수적 데이터 타입을 Java에서 구현하는 Sealed Class와 패턴 매칭.

Sealed Class & Pattern Matching (Java 17/21) 학습 시 주의할 점은 무엇인가요?

switch 에서 Sealed class를 사용할 때 permits 타입 중 하나라도 빠지면 컴파일 에러가 납니다. 이것이 exhaustive 검사의 강점입니다.