[Kotlin] Sealed Classes VS Enum Classes VS Sealed Inferfaces

김민형·2022년 7월 28일
0

Self Study

목록 보기
1/2

Sealed Classes 와 Enum Classes 의 공통점

  • 하나의 클래스로 여러 가지 상태를 열거할 때 사용한다.
    • 예를 들어, API 통신 결과를 핸들링하고 싶을 때 사용하는데 sealed class 경우 아래와 같이 소스코드를 작성한다.
sealed class Resource<T>(val data: T? = null, val message: String? = null) {
	class Success<T>(data: T) : Resource<T>(data)
    class Loading<T>(data: T? = null) : Resource<T>(data)
    class Error<T>(message: String, data: T? = null) : Resource<T>(message, data)
}

Sealed Classes 와 Enum Classes 의 차이점

  • Sealed Class 는 위의 소스코드에서 정의한 것 처럼 class 를 포함해 자식 클래스를 세 가지로 분류한다.
    • Object : 상태를 특정하는 변수가 필요하지 않은 경우 메모리 관리를 위해 singleton 기법으로 하나의 객체만을 생성하기 위한 object class
    • Class : Sealed class 에서 정의한 변수를 사용할 수 있는 일반적인 class
    • Data class : Sealed class 에서 정의한 변수 이외에 특정한 상태를 표현하기 위한 변수를 새로 정의할 수 있는 data class
  • 아래의 소스코드로 차이점을 확인하는 것이 이해가 빠르다.
sealed class HttpError(val code: Int) {
	object Unauthorized : HttpError(401)
    object NotFound : HttpError(404)
}

enum class HttpErrorEnum(val code: Int) {
	Unauthorized(401),
    NotFound(404)
}
sealed class HttpError(val code: Int) {
	data class Unauthorized(val reason: String) : HttpError(401)
    object NotFound : HttpError(404)
}

enum class HttpErrorEnum(val code: Int) {
	Unauthorized(401),
    NotFound(404)
}

selaed class 의 경우 code 가 401 인 경우에만 reason 이라는 변수를 추가 생성하여 핸들링하려고 할 때 위의 소스코드 처럼 data class 로 정의하면 가능하다.
하지만, enum class 의 경우 위의 작업이 불가능하다.

  • 반대로 Enum class 는 아래와 같은 작업이 가능하다.
// MainActivity.kt

val error: HttpErrorEnum = HttpErrorEnum.NotFound
HttpErrorEnum.value().forEach {::println}
when (error) {
	is HttpErrorEnum.Unauthorized -> Unit
    is HttpErrorEnum.NotFound -> Unit
}

Sealed Classes 와 Sealed Interfaces 의 차이점

  • 아래의 코드에서 변수(프로퍼티)가 없을 경우 Constructor 가 필요없는 인터페이스를 사용하면 된다.
sealed class HttpError(val code: Int) {
	data class Unauthorized(val reason: String) : HttpError(401)
    object NotFound : HttpError(404)
}
sealed interface HttpError {
	data class Unauthorized(val reason: String) : HttpError
    object NotFound : HttpError
}
profile
Stick To Nothing!

0개의 댓글