본문 바로가기
Program Language/Java

Java sealed class란?

by 준짱IT 2025. 7. 16.

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