본문 바로가기
Kotlin

Sealed Class

by 봄석 2019. 9. 2.

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 Sealed class를 사용한 UI 상태 관리 (1/3)

드로이드나이츠 2018 에서 발표한 Kotlin Sealed class 를 이용한 뷰상태 관리 를 조금 더 자세하게 정리해서 공유합니다. SealedClass는 무엇이고? 뷰상태 는 무엇인가?? 하나씩 천천히 정리하겠습니다.

medium.com

 

댓글