ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA Sealed class / interface
    공부/자바 2023. 7. 27. 00:01
    728x90
    개발자가 클래스나 인터페이스를 구현할 때 명시적으로 제어하고, 상위 클래스의 사용을 선언적으로 제한하는 방법을 제공해준다. 또한 패턴 매칭과 관련하여 미래의 방향성을 지원하고, 패턴의 철저한 분석을 위한 기반을 제공한다.

    동기

    부모 클래스는 널리 접근 가능해야 하지만, 널리 확장될 수 없게 재한되어야 한다. 즉 해당 부모 클래스를 확장하는 자식 클래스들은 개발자가 미리 알고 있는 특정 클래스들에 한정되어야 한다.

    부모 클래스 개발자는 해당 클래스가 특정 자식 클래스들과 함께 개발되었다고 표현할 수 있어야 한다. 또한 자식 클래스들을 지나치게 제약해서는 안된다.

    설명

    Sealed class / interface 는 허가된 클래스/인터페이스에 대해서만 확장되거나 구현 가능해야 한다.

    해당 클래스의 선언에 sealed를 적용하고, extends와 implements 절 뒤에 permits절을 사용하여 sealed 클래스에서 확장할 수 있는 클래스들을 명시하여 사용가능하다.

    permits절에 지정된 클래스들은 부모 클래스 근처에 위치해야 한다. 즉 같은 모듈에 속해야 한다. 만약 무명 모듈에 선언된 경우 같은 패키지에 속해야 한다.

    각 허용된 자식 클래스는 반드시 봉인된 클래스를 직접 상속해야 한다.

    혀용된 자식 클래스는 봉인된 부모 클래스에서 시작된 봉인을 어떻게 전파하는지 설명하기 위해 수정자를 사용해야 한다.

    1. 클래스 계층을 더 이상 확장하지 못하도록 하기 위해 final로 선언될 수 있다.
    2. 더 확장할 수 있도록 하기 위해 sealed로 선언될 수 있다.
    3. 알려지지 않는 자식 클래스에 의해 확장될 수 있도록 non-sealed로 선언될 수 있다.

    sealed class 예제

    //Fruits.java  
    public abstract sealed class Fruits permits Apple, Peache, Orange{  
    }
    
    //Peache.java  
    public class Peache extends Fruits { //수정자가 없어서 에러 발생  
    }
    
    //Apple.java  
    public final class Apple extends Fruits { //확장 불가  
    }
    
    //Orange.java  
    public non-sealed class Orange extends Fruits { //확장 가능  
    }
    
    //Meat.java  
    public class Meat extends Fruits{ //permits에 선언 안되어 있어서 에러가 발생한다.  
    }
    
    //Food.java  
    public abstract sealed class Food {// 적은 수로 상속할 때는 sealed 클래스 내부에서 선언가능하다.  
    final class OrangeJuice extends Food{}  
    }

    Sealed interfaces

    클래스와 마잔가지로 interface도 sealed 수정자를 사용하여 인터페이스를 봉인할 수 있다.

    Sealing and record classes

    Record 클래스는 암시적으로 final이기 때문에 잘 호환된다

    출처:sealed class/interface

     

    728x90
    반응형

    '공부 > 자바' 카테고리의 다른 글

    17 preview version 안되는 오류  (0) 2023.07.29
    JDK 내부의 강력한 캡슐화  (0) 2023.07.27
    스프링부트 웹레이어에서 테스트  (0) 2023.07.27
    스프링 부트 3.0 이후 gradle 에러  (0) 2023.07.27
    JDK17  (0) 2023.07.27

    댓글

Designed by Tistory.