Java Category/Java

[JAVA] 봉인된 클래스(sealed class)

ReBugs 2023. 7. 14.

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


기본적으로 final 클래스를 제외한 모든 클래스는 부모 클래스가 될 수 있다.

또한 부모가 자식을 선택하는 것이 아니라, 자식이 부모를 선택해서 상속을 받을 수 있다.

하지만 Java 15부터는 부모 클래스가 특정 자식 클래스에게만 상속을 허락할 수 있게 되었다.

 

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

public sealed class Person permits Employee, Manager{}

이런 식으로 Person 클래스를 봉인된 클래스로 지정하고 permits 옆에 상속을 허락할 자식 클래스를 지정하면 된다.

 

봉인된 Person 클래스를 상속하는 Employee와 Manager 클래스는 final 또는 non-sealed 키워드로 선언하거나, sealed 키워드를 사용하여 또 다른 봉인 클래스로 선언해야 한다.

public final class Employee extends Person{}
public non-sealed class Manager extends Person{}

final은 더 이상 상속할 수 없다는 뜻이고, non-sealed는 봉인을 해제한다는 뜻이다.

따라서 Employee는 더 이상 자식 클래스를 만들 수 없지만 Manager는 자식 클래스를 만들 수 있다.

아래의 코드에서 Manager를 상속한 Director 클래스는 정상적으로 상속을 받고, Director 객체 또한 정상적으로 생성되는 것을 볼 수 있다.

 

person.java

public sealed class Person permits Employee, Manager{
	public String name;
	public void work()
	{
		System.out.println("백수입니다.");
	}
}

 

Employee.java

public final class Employee extends Person{
	public void work()
	{
		System.out.println("제품을 생산합니다.");
	}
}

 

Manager.java

public non-sealed class Manager extends Person{
	public void work()
	{
		System.out.println("생산 관리를 합니다.");
	}
}

 

Direcotr.java

public class Director extends Manager{
	public void work()
	{
		System.out.println("제품을 기획합니다.");
	}
}

 

Main.java

public class Main {
	public static void main(String[] args) {
		Person p = new Person();
		Employee e = new Employee();
		Manager m = new Manager();
		Director d = new Director();
		
		p.work();
		e.work();
		m.work();
		d.work();
	}
}
/*
백수입니다.
제품을 생산합니다.
생산 관리를 합니다.
제품을 기획합니다.
*/

댓글