sealed
//sealed class를 상속받는 모든 하위 클래스들은 그 수퍼클래스에 중첩되어야 한다.
sealed class Expr {
data class Const(val number: Double): Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
}
//하지만 같은 파일내에 정의하는 경우, 클래스 외부에 선언해도 무방하다.
sealed class Expr {
object NotANumber : Expr()
}
data class Const(val number: Double): Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
fun eval(e: Expr): Double = when(e) {
is Const -> e.number
is Sum -> eval(e.e1) + eval(e.e2)
NotANumber -> Double.NaN -> // object타입은 별도 캐스팅을 할 필요가 없기때문에 is를 붙이지 않는다.
//가능한 모든 케이스들에 대해 분기를 작성해 주었기 때문에 else 문(기본분기)을 작성할 필요가 없다.
}
// enum class와 매우 유사하다. enum의 확장판.
// enum은 각 object들이 같은 생성자와 같은 함수들을 갖지만, sealed class는 object의 hierarchies 제한만 갖고
// 별도의 생성자와 프로퍼티를 가질 수 있다.
//sealed class를 상속받은 클래스는 꼭 같은 파일에 있을 필요는 없다.Last updated