본문 바로가기
Java

Java sealed class

by curious week 2025. 4. 4.

 

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 이 클래스는 다시 누구나 상속 가능 (제한 해제)

언제 쓰면 좋을까?

  1. 상속 가능한 클래스의 범위를 명확하게 제한하고 싶을 때
  2. 패턴 매칭 / switch 문에서 exhaustive case 작성 가능하게
  3. 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 이상부터 정식

 주의사항

  1. sealed 클래스와 permits로 명시된 클래스는 같은 파일에 있거나, 같은 모듈에 있어야 한다.
  2. 하위 클래스는 반드시 하나를 명시해야 함:
    • 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