[Android] Enum Class vs Sealed Class

이승우·2023년 5월 26일
1
post-custom-banner

Enum Class와 Sealed Class의 차이점에 대해서 알아보자.

🔦 Enum class vs Sealed class

👉 둘 다 타입을 제한적으로 사용하고 싶을 때 사용할 수 있다.

  • Enum class에서는 특정 값을 single instance로서 하나의 객체만 제한적으로 사용할 수 있으며, 생성자의 형태도 동일해야 한다.
  • Sealed class에서는 state를 포함하고 있는 여러개의 instance를 가질 수 있고, 생성자도 각각의 특징에 따라서 다르게 정의할 수 있다. (정적이 아니라 다양한 State를 사용할 수 있다.)

📌 Sealed Class

  • 자기 자신이 추상 클래스이고, 자신을 상속받는 여러 서브 클래스들을 가질 수 있다. -> enum class와는 달리 상속을 지원하기 때문에 다양한 동작의 구현이 가능하다.
  • 상속받는 서브 클래스의 종류를 제한할 수 있다.
  • 속성값을 변경할 수 있다.
  • 상태가 바뀌지 않는 경우, object를 사용하는 것을 권장한다.

Sealed class의 서브 클래스들을 반드시 같은 파일 내에 선언되어야 한다.

  • 단, sealed class의 서브 클래스를 상속한 클래스들은 같은 파일 내에 없어도 된다.
  • sealed class는 기본적으로 abstract 클래스이다.
  • sealed class는 private 생성자만 갖는다.
  • 하위 클래스로는 class, data class, object를 정의할 수 있다.
sealed class Color {
	// singleton 패턴이 적용된 객체
	object Red: Color()
	object Blue: Color()
    data class Yellow(val message: String): Color()
}

// 객체 생성
val colorRed: Color = Red

Sealed class를 사용하면 when을 통한 분기 처리를 할때 else를 추가하지 않아도 되는 이점이 있다. 다만, Sealed Class를 상속받는 서브 클래스가 추가되었을 때, 분기 처리를 해주지 않으면 컴파일 에러가 발생한다. 👉 이를 통해서 타입 안정성을 챙길 수 있다.

sealed class Color {
	object Red: Color()
    object Blue: Color()
}

val color: Color = Blue
when(color){
	Color.Red -> { }
    Color.Blue -> { }
    // sealed class에 Green을 추가했다면, when 구문에 추가해줘야 한다. 그렇지 않으면 에러 발생.
}

📌 Enum Class

enum class Color(val r: Int, val g: Int, val b: Int) {
    RED(255, 0, 0), ORANGE(255, 165, 0),
    YELLOW(255, 255, 0), GREEN(0, 255, 0),
    BLUE(0, 0, 255);

    fun rgb() = (r * 256 + g) * 256 + b
}

fun getColorName(color: Color) = when (color) {
    Color.RED -> "빨강"
    Color.ORANGE -> "주황"
    Color.YELLOW -> "노랑"
    Color.GREEN -> "초록"
    Color.BLUE -> "파랑"
}

fun main() {
    println(getColorName(Color.BLUE))
}
  • RED(255,0,0)을 RED(255,0,20)으로 변경하고 싶지만, Enum class는 최초에 정의한 enum 각각에 대한 상태를 변경할 수 없다.
  • 각 객체들이 고유한 속성을 갖지만, 각 객체들이 서로 다른 형태를 가질 수는 없다. (동일한 형태를 띄어야 한다.)
  • 또한, 상속이 불가능하기 때문에 enum에 대한 서브 클래스를 생성할 수 없다.
  • 하지만, 이렇게 인스턴스의 생성과 상속을 방지하여 타입 안정성이 보장된다.

Ref

profile
Android Developer
post-custom-banner

0개의 댓글