Java의 sealed class는 클래스 계층의 상속을 제한하고 명시적으로 허용된 클래스만 상속할 수 있도록 만든 기능이다.
이는 클래스의 확장 가능성을 제어하고, 패턴 매칭이나 코드의 안전성을 높이는 데 사용이 된다.
✅ 도입 버전
- sealed 키워드는 Java 15(Preview) 에 처음 도입되고, Java 17부터 정식으로 사용!
📌 목적
- 클래스 계층에서 누가 상속할 수 있는지 명확히 제한하여 안정성, 보안성, 코드 가독성 향상 효과
✅ 기본 문법
public sealed class Shape
permits Circle, Rectangle, Triangle {
// ...
}
- sealed class는 permits 키워드를 통해 어떤 클래스만 상속 가능한지 명시
- sealed 클래스를 상속하는 클래스는 다음 중 하나로 선언
- final: 더 이상 상속 불가
- sealed: 다시 제한적으로 상속 가능
- non-sealed: 제한 없이 상속 가능
📘 예시 코드
// Shape.java
public sealed class Shape permits Circle, Rectangle, Triangle {
public abstract double area();
}
// Circle.java
public final class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
// Rectangle.java
public final class Rectangle extends Shape {
private double width, height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}
// Triangle.java
public non-sealed class Triangle extends Shape {
private double base, height;
public Triangle(double base, double height) {
this.base = base;
this.height = height;
}
@Override
public double area() {
return 0.5 * base * height;
}
}
// ScaleneTriangle.java (가능: Triangle이 non-sealed이므로 상속 가능)
public class ScaleneTriangle extends Triangle {
public ScaleneTriangle(double base, double height) {
super(base, height);
}
}
🧠 장점 요약
기능설명
| 제한적 상속 | 누가 상속 가능한지 명시적 제어 (permits) |
| 안전한 계층 구조 | sealed class를 상속한 클래스는 반드시 final, sealed, non-sealed 중 하나로 지정 |
| 유지 보수성 향상 | 패턴 매칭 switch와 함께 사용 시 모든 하위 클래스를 컴파일 타임에 알 수 있음 |
🚫 예외 사항
- sealed class와 그것을 상속하는 모든 클래스는 같은 모듈 또는 같은 패키지 내에 있어야 합니다.
'Program Language > Java' 카테고리의 다른 글
| Java21 Virtual Thread(가상쓰레드) - 2 (2) | 2025.07.22 |
|---|---|
| Java21 Virtual Thread(가상쓰레드) - 1 (5) | 2025.07.22 |
| Java record란? (1) | 2025.07.16 |
| Java 12 - Switch Expressions (1) | 2025.07.16 |
| Java10의 var 변수란?(Javascript X) (1) | 2025.07.15 |