sealed class란?
sealed class는 자식 클래스가 누군지만 명시적으로 "봉인(seal)"할 수 있는 클래스.
즉, "이 클래스는 상속할 수 있는데 지정된 몇몇 클래스만 상속 가능하게 한다"는 뜻!
기본 문법
public sealed class Shape
permits Circle, Rectangle {
// ...
}
public final class Circle extends Shape {
// ...
}
public final class Rectangle extends Shape {
// ...
}
주요 키워드
| sealed | 상속은 가능하지만, 허용된 클래스만 상속 가능 |
| permits | 허용된 자식 클래스 목록 명시 |
| final | 더 이상 상속 불가 |
| non-sealed | 이 클래스는 다시 누구나 상속 가능 (제한 해제) |
언제 쓰면 좋을까?
- 상속 가능한 클래스의 범위를 명확하게 제한하고 싶을 때
- 패턴 매칭 / switch 문에서 exhaustive case 작성 가능하게
- API 보안/설계 상 “내가 지정한 클래스만 확장 가능하게” 통제하고 싶을 때
사용 예시: sealed + switch
sealed interface Shape permits Circle, Rectangle {}
final class Circle implements Shape {
int radius;
}
final class Rectangle implements Shape {
int width, height;
}
public String describe(Shape shape) {
return switch (shape) {
case Circle c -> "Circle: " + c.radius;
case Rectangle r -> "Rectangle: " + r.width + "x" + r.height;
};
}
→ switch문에서 Shape의 모든 하위 클래스가 컴파일 타임에 보이기 때문에, exhaustive check 가능!
sealed class의 실제 활용 예
| 도메인 모델 계층 | 예: sealed class PaymentResult permits Success, Failure |
| State 패턴 구현 | 명확한 상태 구분을 위한 상속 제한 |
| API 응답 타입 | 여러 응답 타입 정의할 때 (SuccessResponse, ErrorResponse) |
sealed vs abstract vs interface
| 구분 | abstract class | interface | sealed class |
| 상속 가능성 | 자유롭게 | 자유롭게 | 지정된 클래스만 |
| 다중 상속 | 불가능 | 가능 | 가능 (interface 기반) |
| 목적 | 기능 틀 정의 | 역할 정의 | 상속 통제 (보안 + 설계) |
| Java 버전 | 오래됨 | 오래됨 | Java 15 (preview), Java 17 이상부터 정식 |
주의사항
- sealed 클래스와 permits로 명시된 클래스는 같은 파일에 있거나, 같은 모듈에 있어야 한다.
- 하위 클래스는 반드시 하나를 명시해야 함:
- final (상속 금지)
- sealed (또 제한)
- non-sealed (제한 해제)
Spring과도 잘 어울릴까?
- Spring에서는 DTO/응답/도메인 상태 표현 시 사용할 수 있음
- 단, 아직 JPA Entity로는 sealed class 사용 할 수 없음.(Hibernate가 sealed class 지원 안 함)
'Java' 카테고리의 다른 글
| Javadoc (1) | 2025.06.21 |
|---|---|
| JAVA (2) | 2025.04.07 |
| java Record (0) | 2025.04.04 |
| [Java] java 제어문 (5) | 2025.01.17 |
| [Java] 클래스 기본 구조 (4) | 2025.01.16 |