PHpullh
학습 라이브러리/Java/Sealed Interfaces & Permits

JAVA · 객체지향

Sealed Interfaces & Permits

Java 17+의 sealed 인터페이스는 구현 가능한 클래스를 permits로 제한합니다. 도메인 모델링에서 타입 안전한 계층 구조를 만들고, switch 패턴 매칭과 결합하면 강력한 타입 시스템을 구축합니다.

객체지향중급sealedinterfacepermitsjava17domain-modeling

핵심 설명

Java 17+의 sealed 인터페이스는 구현 가능한 클래스를 permits로 제한합니다. 도메인 모델링에서 타입 안전한 계층 구조를 만들고, switch 패턴 매칭과 결합하면 강력한 타입 시스템을 구축합니다.

Java code

// Sealed Interface — 허용된 구현만 가능
public sealed interface Payment
    permits CreditCard, BankTransfer, DigitalWallet {

    double amount();
    String currency();
}

// 각 구현은 record, class, 또는 sealed로 선언 가능
record CreditCard(double amount, String currency,
                  String cardNumber, int installments) implements Payment {}

record BankTransfer(double amount, String currency,
                    String bankCode, String accountNumber) implements Payment {}

// non-sealed로 선언하면 추가 확장 허용
non-sealed class DigitalWallet implements Payment {
    private final double amount;
    private final String currency;
    private final String provider;

    public DigitalWallet(double amount, String currency, String provider) {
        this.amount = amount;
        this.currency = currency;
        this.provider = provider;
    }

    @Override public double amount() { return amount; }
    @Override public String currency() { return currency; }
    public String provider() { return provider; }
}

// 패턴 매칭과 결합
static String processPayment(Payment payment) {
    return switch (payment) {
        case CreditCard cc -> "카드결제: " + cc.cardNumber() +
            (cc.installments() > 1 ? " (" + cc.installments() + "개월)" : " (일시불)");
        case BankTransfer bt -> "계좌이체: " + bt.bankCode();
        case DigitalWallet dw -> "디지털월렛: " + dw.provider();
    };
}

학습 팁

sealed 타입의 구현체는 같은 패키지(또는 모듈)에 있어야 합니다. non-sealed로 선언하면 해당 서브타입은 자유롭게 확장 가능합니다.

주의할 점

permits 절을 생략하면 같은 파일에 선언된 클래스만 구현 가능합니다. 다른 파일에서 구현하려면 반드시 permits를 명시하세요.

자주 묻는 질문

Sealed Interfaces & Permits란 무엇인가요?

Java 17+의 sealed 인터페이스는 구현 가능한 클래스를 permits 로 제한합니다. 도메인 모델링에서 타입 안전한 계층 구조를 만들고, switch 패턴 매칭과 결합하면 강력한 타입 시스템을 구축합니다.

Sealed Interfaces & Permits 학습 시 주의할 점은 무엇인가요?

permits 절을 생략하면 같은 파일에 선언된 클래스만 구현 가능합니다. 다른 파일에서 구현하려면 반드시 permits 를 명시하세요.