허용 가능한 값을 제한할 수 있다.
서로 다른 형태를 가질 수 없다.
// 불가능
enum class Result {
SUCCESS,
FAILED(val exception: Exception)
}
이를 꼭 구현해야한다면 abstract class를 사용해야 한다.
abstract class Result<out T : Any>
data class Success(out T: Any>(val data: T) : Result<T>()
data class Failed(val exception: Exception) : Result<Nothing>()
하지만 abstract class를 어떤 클래스가 상속받을지 complier가 알 수 없기 때문에 Enum 처럼 type 제한을 할 수 없다.
다양한 서브 클래스들을 만들 수 있다.
sealed class NetworkState {
object Ready: NetworkState()
object Success: NetworkState()
object Loading: NetworkState()
class Fail(val e: Exception): NetworkState()
}
또한 생성자를 포함할 수 있다.
sealed class ColorState(val color: Color) {
object Blue: ColorState(Color.Blue)
object Black: ColorState(Color.Black)
object Yellow: ColorState(Color.Yellow)
}
sealed class의 생성자를 가지고 있지 않은 interface 버전을 말한다. 생성자를 필요로 하지 않을 때 사용.
sealed interface ColorState {
object Blue: ColorState
object Black: ColorState
object Yellow: ColorState
}
| enum | sealed class | sealed interface | |
|---|---|---|---|
| 허용 가능한 값 제한 가능 | O | O | O |
| 서로 다른 형태를 가질 수 있는가? | X | O | O |
| 생성자를 가질 수 있는가? | O | O | X |
https://developer88.tistory.com/entry/Sealed-Class%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
https://tourspace.tistory.com/467