English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서에서, 예제를 통해 Sealed (봉쇄) 클래스를 배울 수 있습니다. 그리고 어떻게 생성하고 언제 사용하는지 배울 수 있습니다.
값이 제한된 집합(제한된 계층 구조)에서만 포함될 수 있는 경우에 봉쇄 클래스를 사용합니다.
봉쇄 클래스를 자세히 설명하기 전에, 그들이 해결하는 문제를 탐구해 보겠습니다. 예를 들어:
class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) { is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") }
위 프로그램에서 기본 클래스 Expr는 Const (숫자를 나타냄)과 Sum (두 표현식의 합을 나타냄) 두 개의 서브 클래스를 가지고 있습니다. 여기서는 else 브랜치를 사용하여 처리해야 합니다 when 표현식에서의 기본 조건.
지금, 만약 당신이 Expr 클래스에서 새로운 서브 클래스를 파생하면, 컴파일러는 어떤 것도 감지하지 못할 것입니다. 왜냐하면 else 브랜치가 그것을 처리하기 때문입니다. 이는 오류가 발생할 수 있습니다. 새로운 서브 클래스를 추가할 때 컴파일러가 오류를 발생시키면 더 좋습니다.
이 문제를 해결하려면 봉쇄 클래스를 사용할 수 있습니다. 이전에 설명한 것처럼, 봉쇄 클래스는 서브 클래스를 생성할 가능성을 제한합니다. 또한, 봉쇄 클래스의 모든 서브 클래스를 when 표현식에서 처리할 때 else 브랜치를 사용하지 않아도 됩니다.
봉쇄 클래스를 생성하려면 sealed 키워드를 사용하세요. 예를 들어,
sealed class Expr
이 문제를 해결하는 방법은 봉쇄 클래스를 사용하는 것입니다:
sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) { is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN }
그렇게 보이듯, else 분기는 없습니다. Expr 클래스에서 새로운 서브 클래스를 파생하면, 서브 클래스가 when 표현식에서 처리되지 않는 경우에만 컴파일러가 알림을 보냅니다.
검색 클래스의 모든 서브 클래스는 검색 클래스를 선언한 동일한 파일에서 선언해야 합니다.
검색 클래스 자체는추상에서, 그를 통해 객체를 인스턴스화할 수 없습니다.
검색 클래스의 비공개 생성자를 생성할 수 없습니다; 기본적으로 그들의 생성자는 private입니다.
열거 클래스검색 클래스와 매우 유사합니다. 열거형 타입의 값 집합도 검색 클래스와 같이 제한됩니다.
유일한 차이점은, 열거형은 하나의 인스턴스만 있고, 검색 클래스의 서브 클래스는 여러 인스턴스가 있을 수 있다는 점입니다.