[Kotlin] enum vs sealed class vs sealed interface

지누크·2023년 7월 16일

Kotlin

목록 보기
1/1
post-thumbnail

enum class

허용 가능한 값을 제한할 수 있다.
서로 다른 형태를 가질 수 없다.

// 불가능
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

다양한 서브 클래스들을 만들 수 있다.

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 interface

sealed class의 생성자를 가지고 있지 않은 interface 버전을 말한다. 생성자를 필요로 하지 않을 때 사용.

sealed interface ColorState {
	object Blue: ColorState
    object Black: ColorState
    object Yellow: ColorState
}

그래서 뭘 써야할까

enumsealed classsealed interface
허용 가능한 값 제한 가능OOO
서로 다른 형태를 가질 수 있는가?XOO
생성자를 가질 수 있는가?OOX

참고

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

profile
더 잘하고 싶어요.

0개의 댓글