sealed interface

2023. 5. 8. 14:13High Level Programming Language/Reflection

sealed interface는 Java 15에서 도입된 기능으로, 인터페이스가 특정 클래스들만을 상속하거나 구현할 수 있도록 제한하는 기능을 제공합니다. 이를 통해 인터페이스를 상속하거나 구현할 수 있는 클래스들을 명시적으로 지정함으로써, 보다 강력한 캡슐화와 제어를 가능하게 합니다.

주요 특징:

  1. 제한된 상속:
    • sealed로 선언된 인터페이스는 permits 키워드를 사용하여 상속이나 구현할 수 있는 클래스 또는 인터페이스를 명시합니다.
    • sealed interface를 구현할 수 있는 클래스들은 반드시 같은 모듈 또는 패키지에 있어야 하며, 명시적으로 상속을 허용한 클래스만 가능합니다.
  2. 하위 클래스의 종류:
    • sealed interface를 구현하는 클래스는 세 가지로 구분될 수 있습니다:
      • final: 더 이상 다른 클래스에서 상속할 수 없는 클래스입니다.
      • sealed: 추가적인 하위 클래스를 제한할 수 있는 클래스입니다.
      • non-sealed: 상속이 제한되지 않은 클래스입니다.

예시:

public sealed interface Shape permits Circle, Rectangle, Square {
    double area();
}

public final class Circle implements Shape {
    private final double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
}

public final class Rectangle implements Shape {
    private final double width;
    private final double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double area() {
        return width * height;
    }
}

public non-sealed class Square implements Shape {
    private final double side;

    public Square(double side) {
        this.side = side;
    }

    @Override
    public double area() {
        return side * side;
    }
}

사용 이유:

  • 타입 계층의 안정성: sealed 인터페이스를 사용하면, 상속 구조를 보다 엄격하게 제어할 수 있어 코드의 유지보수성과 안정성이 향상됩니다.
  • 패턴 매칭: Java에서 도입된 패턴 매칭 기능과 잘 맞아, switch 문에서 각 케이스가 완전히 다루어졌는지 컴파일 타임에 검증할 수 있습니다.

sealed 인터페이스는 이러한 제어와 안정성을 통해 코드의 일관성을 유지하고 예측 가능한 계층 구조를 만들고자 하는 상황에서 유용하게 사용할 수 있습니다.

'High Level Programming Language > Reflection' 카테고리의 다른 글

클래스 로딩과 관련된 제약 사항  (0) 2023.05.19
Proxy Target Class 조건  (0) 2023.05.17
Structuring method calls  (0) 2023.05.02
type-safe proxy object  (0) 2023.05.02
Java Dynamic Proxy Classes  (0) 2023.04.28