sealed class 자신을 상속받는 여러 서브 클래스들을 가질 수 있다. 이때, 서브 클래스들의 종류를 제한하는 특성이 있어 컴파일러에서 sealed class의 서브 클래스가 어떤 것이 있는지 알 수 있다.
그래서 when문을 사용할 때 유용하다.
sealed class Color {
object Red: Color()
object Green: Color()
object Blue: Color()
}
fun main() {
val color : Color = Color.Blue
when(color) {
is Color.Blue -> {}
is Color.Green -> {}
is Color.Red -> {}
}
컴파일러가 서브 클래스들을 알고 있기 때문에 when문에서 else문을 사용하지 않고, 작업을 수행할 코드를 작성하지 않은 서브클래스나 중복된 처리가 없도록 도와준다.
다음과 같이 말이다.
val color : Color = Color.Blue
when(color) {
is Color.Blue -> {}
is Color.Green -> {}
}
서브 클래스 Red에 대한 수행 코드를 작성하지 않아서 작성해 달라고 알려준다.
상속이 가능하다
서브 클래스를 추가하는 경우, Kotlin 1.5.0부터는 sealed class 내부 혹은 외부에서 상속할 수 있다.
이전에는 서브 클래스들은 반드시 같은 파일 내에 선언되었어야 한다.
객체 생성이 불가능하다
sealed class는 객체 생성이 안되며 생성된 서브 클래스들의 인스턴스를 사용한다.
객체를 사용하려고 하면 다음과 같이 알려준다. 객체 생성이 불가능하다
Sealed types cannot be instantiated
둘은 요소들의 집합이라는 점에서 유사하다.
하지만, enum class는 상수를 처리하고 sealed class는 개별 인스턴스를 처리한다.
enum class EnumColor {
RED, BLUE
}
val enumColor: EnumColor = EnumColor.RED
when(enumColor) {
EnumColor.RED -> {}
EnumColor.BLUE -> {}
}
enum class의 경우, 각 상수에 대한 동작을 처리하면 된다.
sealed class SealedColor {
data class Red(val description: String) : SealedColor()
object Blue : SealedColor()
}
하지만 sealed class의 경우, description에 따라 여러 인스턴스를 생성할 수 있게 된다.