Sealed Classes
- Sealed 클래스는 값이 제한된 집합의 유형 중 하나를 가질 수 있지만, 다른 유형을 가질 수 없는 제한된 클래스 계층 구조를 나타내는데 사용
- 의미 상으로 enum 클래스의 확장
- 각각의 enum 상수는 단일 인스턴스로만 존재하지만, Sealed 클래스의 서브 클래스는 여러 인스턴스를 가질수 있
sealed
제한자 사용- 서브 클래스를 가질 수 있다
모든 것은 sealed 클래스 선언 내에 있어야한다
sealed class Expr {
class Const(val number: Double) : Expr()
class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
}
sealed 클래스의 서브 클래스를 확장 하는 클래스(간접 상속) 는 sealed 클래스 선언 내가 아니더라도 가능
when 식에서 모든 케이스를 포함하는지 확인하기위해 else
절을 사용할 필요 없다
fun eval(expr: Expr): Double = when(expr) {
is Expr.Const -> expr.number
is Expr.Sum -> eval(expr.e1) + eval(expr.e2)
Expr.NotANumber -> Double.NaN
// `else` 절은 모든 경우를 다루었기에 필요하지않다
}
Sealed 클래스에 대한 편한 규칙 (1.1 이후)
동일 파일의 서브 클래스
sealed
클래스의 서브 클래스를 최상위 레벨로 선언 가능. 단, 부모 클래스와 동일한 파일에 배치해야함
Sealed 클래스와 데이터 클래스
데이터 클래스는 sealed
클래스를 포함하여 다른 클래스를 확장 가능
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
fun eval(expr: Expr): Double = when (expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
}