[JAVA] 자바 17 특징 - Sealed Class
sealed class, interface는 상속하거나 구현할 클래스를 지정하고, 지정한 클래스 외에는 상속 또는 구현할 수 없도록 하는 기능으로 무분별한 상속과 구현을 방지할 수 있습니다.
1. sealed 클래스(인터페이스)
super-class에 sealed 키워드를 사용하고 permits 키워드 뒤에 해당 클래스(인터페이스)를 상속(구현) 받을 클래스를 선언합니다. sub-class에서는 sealed, non-sealed, final 키워드를 사용하여 sealed 클래스를 상속(구현) 합니다.
아래 예제에서 Monster를 sealed 클래스로 만들었고, permits 키워드를 통해 트롤(Troll)과 오우거(Ogre) 클래스만 몬스터를 상속할 수 있도록 제한하였습니다.
// Monter를 상속할 수 있는 클래스는 Troll, Ogre, Dragon 뿐
public sealed class Monster permits Troll, Ogre, Dragon{
}
// 트롤은 몬스터를 상속할 수 있다.
public non-sealed class Troll extends Monster{
}
// 오우거는 몬스터를 상속할 수 있다.
public non-sealed class Ogre extends Monster{
}
// 드래곤은 몬스터를 상속했지만 final로 정의함.
public final class Dragon extends Monster{
}
만일 엘프(Elf)가 몬스터를 상속하려고 하면 컴파일 에러가 발생합니다.
// 엘프는 몬스터를 상속할 수 없다..
// 컴파일 에러
public non-sealed class Elf extends Monster{
}
2. sealed, non-sealed, final
sub-class에서 사용할 수 있는 키워드는 sealed, non-sealed, final입니다. 위에서 확인했듯이 sealed 키워드로 정의한 클래스는 permits 키워드에 정의한 클래스만 상속할 수 있습니다. 반면 non-sealed 키워드로 정의한 클래스는 아무 클래스에서나 상속할 수 있으며, final 키워드로 정의한 클래스는 어느 클래스도 상속할 수 없습니다.
아래 예제에서 트롤과 오우거 클래스는 non-sealed 키워드로 정의되었기 때문에 BigTroll 클래스와 BigOgre 클래스에서 상속할 수 있습니다.
// 트롤을 상속한 빅트롤
public class BigTroll extends Troll{
}
// 오우거를 상속하는 빅오우거
public class BigOgre extends Ogre{
}
하지만 드래곤 클래스는 final로 정의되어 있기 때문에 드래곤을 다시 상속할 수 없습니다.
// 컴파일 에러
public class BlackDragon extends Dragon{
}
2023.04.30 - [기타/프로그래밍 언어] - [JAVA] 자바 17 특징 - 텍스트 블록
[JAVA] 자바 17 특징 - 텍스트 블록
1. 기존 스타일과의 비교 String textBlockHtml = """ example text """; @Test public void givenAnOldStyleMultilineString_whenComparing_thenEqualsTextBlock() { String expected = "\n" + "\n" + " \n" + " example text\n" + " \n" + ""; assertEquals(expect
lazy-man.tistory.com
2023.05.01 - [기타/프로그래밍 언어] - [JAVA] 자바 17 특징 - Switch 문
[JAVA] 자바 17 특징 - Switch 문
자바 17에서는 Switch 문의 기능이 개선되었다. 향상된 Switch 문을 사용하면 break 문을 사용하거나 여러 개의 case를 묶을 때 자바 11 이전의 버전보다 편리하게 사용할 수 있다. 1. 자바 11 이전의 switch
lazy-man.tistory.com
2023.05.01 - [기타/프로그래밍 언어] - [JAVA] 자바 17 특징 - Record Type
[JAVA] 자바 17 특징 - Record Type
불변성을 가지는 데이터 클래스를 위한 타입이다. 자바 14 이전 버전에서는 불변의 데이터 클래스를 생성하기 위해서는 private final 필드, 모든 필드를 초기화하는 생성자, equals 메서드, toString 메
lazy-man.tistory.com
2023.05.01 - [기타/프로그래밍 언어] - [JAVA] 자바 17 특징 - 기타
[JAVA] 자바 17 특징 - 기타
이번 포스팅에서는 자바 17의 특징 중 텍스트 블록, Switch 문, Record, Sealed 외의 특징에 대해 알아보도록 하겠습니다. 1. instanceof instanceof 체크할 때 변수를 선언할 수 있기 때문에 좀 더 간결한 코드
lazy-man.tistory.com