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 Interface는 kotlin 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
댓글