sealed 클래스는 값이 제한된 집합의 유형 중 하나를 가질 수 있지만 다른 유형을 가질 수없는 제한된 클래스 계층 구조를 나타내는 데 사용됩니다. 그것들은 의미 상으로 enum 클래스의 확장입니다 : enum 타입에 대한 값의 집합도 제한되지만, 각각의 enum 상수는 단일 인스턴스로만 존재하는 반면, sealed 클래스의 서브 클래스는 포함 할 수있는 여러 인스턴스를 가질 수 있습니다 상태.sealed 클래스를 선언하려면
sealed
이름 앞에 한정자 를 추가합니다 . sealed 클래스는 하위 클래스를 가질 수 있지만 모두 sealed 클래스 자체와 동일한 파일에서 선언해야합니다. (Kotlin 1.1 이전에는 규칙이 훨씬 엄격했습니다. 클래스는 sealed 클래스의 선언 안에 중첩되어야했습니다.)
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
(위의 예에서는 Kotlin 1.1의 새로운 기능 중 하나 인 데이터 클래스가 sealed 클래스를 비롯한 다른 클래스를 확장 할 수있는 새로운 기능을 사용합니다.)sealed 클래스는 그 자체 로
클래스이며 직접 인스턴스화 할 수 없으며
추상
멤버를 가질 수 있습니다 .sealed 클래스는
비공개
생성자 를 가질 수 없습니다 (생성자는 기본적으로
비공개입니다
).sealed 클래스의 서브 클래스를 확장하는 클래스 (간접 상속인)는 동일한 파일에있을 필요없이 어디에도 배치 할 수 있습니다.sealed 클래스를 사용할 때의 주요 이점은
에서 사용할 때 유용합니다 . 명령문이 모든 사례를 포함하는지 확인할 수 있다면 명령문에
else
절을 추가 할 필요가 없습니다 . 그러나이
when
방법은 결과를 사용하는 표현식으로 사용하고 명령문으로 사용하지 않는 경우에만 작동 합니다.
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
// the `else` clause is not required because we've covered all the cases
}
'프로그래밍 > kotlin' 카테고리의 다른 글
코틀린 - 위임 프로퍼티 (0) | 2021.07.13 |
---|---|
코틀린 - 제네릭 (0) | 2021.04.26 |
코틀린 - 데이터 클래스 (0) | 2021.04.25 |
코틀린 - 확장 (0) | 2021.04.25 |
코틀린 - 함수 (0) | 2021.04.18 |