이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다. 


Java 15부터 무분별한 자식 인터페이스 생성을 방지하기 위해 봉인된 인터페이스를 사용할 수 있다.

인터페이스 A의 자식 인터페이스는 인터페이스 B만 가능하고, 그 이외는 자식 인터페이스가 될 수 없도록 아래와 같이 인터페이스 A를 봉인된 인터페이스로 선언할 수 있다.

public sealed interface InterfaceA  permits InterfaceB{

}

 

sealed 키워드를 사용하면 permits 키워드 뒤에 상속 가능한 자식 인터페이스를 지정해야한다.

봉인된 InterfaceA를 상속하는 interfaceB는 non-sealed 키워드로 아래와 같이 선언하거나 sealed 키워드를 사용해서 또 다른 봉인된 인터페이스로 선언해야 한다.

public non-sealed interface InterfaceB extends InterfaceA {

}

non-sealed는 봉인을 해제한다는 뜻이다. 따라서 InerfaceB는 다른 자식 인터페이스를 만들 수 있다.

public interface InterfaceC extends InterfaceB {

}

 


 

예제

interfaceA.java

public sealed interface InterfaceA  permits InterfaceB{
	void methodA();
}

 

interfaceB.java

public non-sealed interface InterfaceB extends InterfaceA {
	void methodB();
}

 

interfaceC.java

public interface InterfaceC extends InterfaceB {
	void methodC();
}

 

ImplClass.java

public class ImplClass implements InterfaceC {
	public void methodA() {
		System.out.println("methodA() 실행");
	}

	public void methodB() {
		System.out.println("methodB() 실행");
	}

	@Override
	public void methodC() {
		System.out.println("methodC() 실행");
	}
}

 

Main.java

public class Main {
	public static void main(String[] args) {
		ImplClass impl = new ImplClass();

		InterfaceA ia = impl;
		ia.methodA();

		System.out.println();

		InterfaceB ib = impl;
		ib.methodA();
		ib.methodB();

		System.out.println();

		InterfaceC ic = impl;
		ic.methodA();
		ic.methodB();
		ic.methodC();
	}
}
/*
methodA() 실행

methodA() 실행
methodB() 실행

methodA() 실행
methodB() 실행
methodC() 실행
*/