Sealed Class
Sealed Class란 ?
sealed의 뜻은 봉인이라는 뜻으로
enum 클래스의 확장형태입니다. sealed 클래스는 클래스들을 묶은클래스입니다.
Kotlin reference 에서 소개하는 예로 Expr 이라는 sealed 클래스를 보도록 하겟습니다.
sealed class Expr{
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
}
먼저, Sealed 클래스 내부에 작성된 클래스는 Sealed클래스를 상속할수 있습니다.
sealed클래스의 작점은 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
}
확인하기 위하여 innerClass로 생성해보도록 하겠습니다
/NotSealedClass
open class ExprNonSealed {
inner class Const(val number: Double) : ExprNonSealed()
inner class Sum(val e1: ExprNonSealed, val e2: ExprNonSealed) : ExprNonSealed()
inner class NotANumber : ExprNonSealed()
}
//NotSealedClass when
fun tmpEval(exprNonSealed: ExprNonSealed) : Double=when(exprNonSealed){
is ExprNonSealed.Const -> exprNonSealed.number
is ExprNonSealed.Sum -> tmpEval(exprNonSealed.e1)+tmpEval(exprNonSealed.e2)
is ExprNonSealed.NotANumber->1.2
}
object는 싱글톤 디자인이라 내부 클래스로 사용할 수 없으므로 1.2라는 실수를 리턴하도록 코드를 변경하였습니다.
코드를 복사하고 실행시키면 when문법에서 컴파일 에러가 발생합니다. else를 작성하라는 오류 내용이 나옵니다.
when문법의 특징은 컴파일러가 예상하는 모든 경우의 수에 대한 처리를 하지 않으면 컴파일을 할 수 없다는 특징이 있습니다.
즉 sealed클래스는 컴파일러가 when의 경우의 수를 예측할 수 있으나 내부 클래스는 컴파일러가 모든 경우의 수를 예측할 수 없다는 것입니다.
어 그러면 when만을 위하여 sealed클래스를 써야하나 ?? 는
아래 좋은글이 있어 소개드립니다.
https://medium.com/@lazysoul/kotlin-sealed-class를-사용한-ui-상태-관리-1-3-98cf37207c13
'Kotlin' 카테고리의 다른 글
가변인자 알아보기 ( ... , vararg (0) | 2019.10.18 |
---|---|
Kotlin Property , Custom Getter & Setter (2) | 2019.10.07 |
Fold, Reduce (0) | 2019.08.29 |
고차함수 (Higher-order-function) ,1급시민[객체,함수] (First-Class Citizen) (0) | 2019.08.29 |
Reflection (0) | 2019.06.08 |
댓글