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 를 명시하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.