Java 17, Sealed Class

wwe221·2022년 8월 1일
0

Java Memo

목록 보기
3/10
post-thumbnail

Java 17 에서 추가된 Sealed Class/Interface 는 상속하거나(extends), 구현(implements) 할 클래스를 지정해두고, 해당 클래스들만 상속/구현이 가능하도록 제한하는 기능입니다.

이를 통해 개발자는 어떤 클래스가 해당클래스를 상속받는지를 쉽게 알수 있고 제한할수 있습니다.

사용법

super-class 에 sealed 키워드를 사용하고, permits 키워드 뒤에 해당 클래스를 상속받을 sub-class 를 선언합니다.
Sealed 된 클래스를 활용하기 위해서는 같은 모듈 혹은 같은 패키지 안에 존재 해야 합니다.

활용 권한을 받은 sub-class 는 sealed, non-sealed , final 총 세가지 종류로 나누어지는데 예시를 통해 차이를 설명하겠습니다

히어로와 몬스터, 두 가지 종류의 캐릭터가 나오는 게임을 만들고 싶은데, 히어로는 링크, 마리오 총 두가지로 제한을 주고,

몬스터는 생각날 때마다 내키는 대로 생성하고 싶습니다.

// Character.java
public sealed class Character permits Hero, Monster {}
...

// Hero.java
// permits 로 선언된 class 들 (Link , Mario) 만이 Hero class 를 상속할 수 있다.
public sealed class Hero extends Character permits Link, Mario {}
...

// Monster.java
// non-sealed 로 선언된 Monster 는 어떤 class 든지 상 속 할 수 있다.
public non-sealed class Monster extends Character {}
// Hero 를 상속 받을 수 있는 클래스는 Link, Mario 뿐이다.
public final class Link extends Hero {}
public final class Maro extends Hero {}
// Link 와 Mario 는 final 로 선언된 class 들이기 때문에,
// 어떠한 class 도 이 둘을 상속 할 수 없다.
public class Troll extends Hero {} // 상속 불가능, 에러
public class Troll extends Link {} // 상속 불가능, 에러
//
public class Troll extends Monster {} // 상속 가능

Hero class 에서 Troll class 에게 상속권한을 주지 않았기 때문에 Hero 가 될 수 없고, Final로 정의된 클래스인 Link 또한 될 수 없습니다.

하지만 non-sealed 로 정의되었고 캐릭터로 상속 권한을 받은 몬스터 클래스를 상속받아 몬스터가 될 수 있습니다.

차이점

final 과 non-sealed 의 차이는,
final class 는 어떤 클래스도 상속할 수 없고,
non-sealed class 는 어떤 클래스도 상속할 수 있는 것 입니다.

0개의 댓글