Sealed Class에 관하여

최희창·2022년 6월 1일
0

Kotlin

목록 보기
4/13

Enum Class

  • Sealed 클래스에 앞서 Enum 클래스 설명을 필요로 합니다.
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))
}
  • 위와 같이 Enum 객체를 사용할 수 있습니다.
    -> 위에서 Enum 객체들에 대하여 RGB값을 수정해야 하는 상황이 발생한다면?

  • enum 클래스의 각 상수들은 싱글톤으로 이루어져 있기 때문에, 단 하나의 인스턴스만 존재합니다. 따라서 최초에 설정한 enum 각각의 대한 상태를 변경할 수 없습니다.

제약사항

  1. 각 enum 상수들은 단 하나의 인스턴스를 가질 수 있습니다.
    -> enum 상수 정의 이후에 속성값을 변경할 수 없음.
  2. enum 클래스에 대해 서브 클래스를 생성할 수 없습니다.

=> 이러한 제약사항들을 커버할 수 있도록 코틀린에서는 Sealed class를 제공합니다.

Sealed Class

  • sealed 클래스는 자기 자신이 추상 클래스이고, 자신을 상속받는 여러 서브 클래스들을 가질 수 있습니다. 그래서 enum 클래스와 달리 상속을 지원하기 때문에, 상속을 활용한 풍부한 동작을 구현할 수 있습니다.
  • 자신을 상속받는 서브 클래스의 종류를 제한할 수 있습니다.

특징

  • sealed 클래스의 서브 클래스들은 반드시 같은 파일 내에 선언되어야 합니다.
  • sealed 클래스는 기본적으로 abstract 클래스입니다.
  • sealed 클래스는 private 생성자만 갖게 됩니다.
sealed class Color {
    data class Red(val r: Int, val g: Int, val b: Int) : Color()
    data class Orange(val r: Int, val g: Int, val b: Int) : Color()
    ...
}

-> data class 대신 object로 선언해도 됩니다.
(상태값이 바뀌지 않는 서브 클래스의 경우 object 사용을 권장)

fun main() {
    val color: Color = Color.Red(255, 0, 20)
    when (color) {
        is Color.Red -> println("빨강")
        is Color.Orange -> println("주황")
        ...
    }
}

Sealed class의 이점

  • sealed 클래스의 서브 클래스 각각에 대해 여러 개의 인스턴스 생성 가능
    -> 상태값을 유동적으로 변경 가능
  • sealed 클래스의 계층을 생성할 수 있음.
profile
heec.choi

0개의 댓글