봉인된 클래스
란 하위 클래스들에 의한 상위 클래스의 무분별한 남용을 방지하고자 Java 15부터 도입된 클래스로, 상위 클래스에서 지정한 하위 클래스만 해당 상위 클래스를 상속받도록 할 수 있는 기능입니다.
사용법은 접근 제한자의 뒷부분에 sealed 키워드를 작성해준 뒤, 클래스 이름 뒤에 permites 키워드를 작성하고, 다시 그 뒤에 해당 클래스의 상속을 허용할 하위 클래스들을 작성해주면 됩니다.다음과 같습니다.
public sealed class phone permites AiFunction{ }
다음은 sealed
키워드에 의해 생성된 클래스를 상속받는 하위 클래스는 해당 클래스에 의해 봉인된 클래스를 다른 클래스로 상속 받을 수 있기 때문에, final
키워드를 붙여 허용된 클래스를 끝으로 더 이상 상속이 안되게 하거나, non-sealed
키워드를 붙여 상속이 가능하도록 해야 하는데요.
단 non-selaed
클래스를 상속 받는 또 다른 하위 클래스는 해당 클래스를 상속 받되, permites
를 지정한 상위 클래스의 멤버까지 지정 받는 것은 아닙니다. 한 마디로 non-sealed
키워드는 해당 하위 클래스부터 다시 상속을 허용하는 것을 의미하지, 해당 하위 클래스가 상속 받은 sealed 클래스(상위 클래스) 까지의 상속을 허용한다는 것은 아님을 표시한 키워드라고 할 수 있죠.
// 추상 클래스: Ai 기능 sealed abstract class AiFunction permits Smartphone { // 추상 메서드 : abstract void talkingWithAi(); } // 하위 클래스: 폴더블폰은 Ai 기능 상속을 허용되지 않으므로 상속받지 못합니다. 그러나 상속을 받도록 하고는 있으므로 final이나 non0-selaed 키워드 중 하나를 붙여줘야 하되, AiFunction 부분에서 The type FlipPhone extending a sealed class AiFunction should be a permitted subtype of AiFunction 에러가 발생합니다. non-sealed class FlipPhone extends AiFunction { // 전화 걸기 메서드 구현 void talkingWithAi() { System.out.println("talking with AI"); } } // 하위 클래스: 스마트폰은 Ai 기능 상속이 허용되므로 상속 메서드를 구현하는 것이 가능합니다. 해당 클래스에 final 키워드를 붙일 경우, 해당 클래스를 끝으로 더 이상 하위 클래스로부터의 상속을 허용하지 않음을 의미하게 됩니다. final class Smartphone extends AiFunction { void talkingWithAi() { System.out.println("talking with AI"); } // 추가 기능: 인터넷 사용 void browseInternet() { System.out.println("Browsing the internet from Smartphone"); } } public class Hello { public static void main(String[] args) { // 폴더블폰 객체 생성 및 사용 FlipPhone flipPhone = new FlipPhone(); flipPhone.talkingWithAi(); // Ai기능 사용 x System.out.println(); // 스마트폰 객체 생성 및 사용 Smartphone smartphone = new Smartphone(); smartphone.talkingWithAi(); // Ai기능 사용 o smartphone.browseInternet(); } }