본문 바로가기
Back-End (web)

[Kotlin] Sealed Class

by 햄과함께 2021. 12. 28.
320x100

Sealed Class 의 구현체들은 컴파일 시간에 알 수 있습니다.

sealed class SealClass {
    abstract val no: Int
}

class A: SealClass() {
    override val no: Int = 12
}

fun main() {
    // Sealed types cannot be instantiated
    // val sealClass = SealClass()
    
    val a = A()
        .also { println(it.no) }
}

sealed class는 abstract 멤버를 가질 수 있습니다.

sealed class는 그자체로 객체가 될 수 없습니다. (Sealed types cannot be instantiated 에러 뱉음)

 

internal class SealedClassTest {

    interface Member
    class Vip(val point: Int, val vipPoint: Int) : Member
    class Normal(val point: Int) : Member

    fun getPoint(member: Member): Int =
        when (member) {
            is Vip -> member.point + member.vipPoint
            is Normal -> member.point
            else -> throw IllegalArgumentException("Unknown expression")
        }
}
internal class SealedClassTest {
    
    sealed interface Member
    class Vip(val point: Int, val vipPoint: Int) : Member
    class Normal(val point: Int) : Member


    fun getPoint(member: Member): Int =
        when (member) {
            is Vip -> member.point + member.vipPoint
            is Normal -> member.point
            // else 문 삭제 가능
        }
}

seled interface로 구현된 모든 클래스들의 타입은 컴파일러에게 전해지기 때문에 컴파일 단계에서 Vip, Normal 이 외의 타입은 존재하지 않음을 컴파일러가 알 수 있습니다.

 

Sealed Interfacekotlin version은 1.5.0 부터 지원을 하기 시작했기 때문에 버전은 1.5.0 이상이여야 합니다.

Modifier 'sealed' is not applicable to 'interface'

아니면 위와 같은 에러를 뱉습니다.


참고

https://kotlinlang.org/docs/sealed-classes.html

https://play.kotlinlang.org/koans/Classes/Smart%20casts/Task.kt

https://play.kotlinlang.org/koans/Classes/Sealed%20classes/Task.kt

 

320x100

댓글