이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다.
기본적으로 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();
}
}
/*
백수입니다.
제품을 생산합니다.
생산 관리를 합니다.
제품을 기획합니다.
*/
'Java Category > Java' 카테고리의 다른 글
[JAVA] 봉인된 인터페이스(sealed interface) (0) | 2023.07.16 |
---|---|
[JAVA] 인터페이스 - default 메소드, static 메소드, private 메소드 (0) | 2023.07.15 |
[JAVA] main() 메소드의 String[] 매개변수 용도 (0) | 2023.07.13 |
[JAVA] 오버플로우와 언더플로우 (0) | 2023.07.12 |
[JAVA] 기본 연산을 할 때 주의사항 (0) | 2023.07.12 |