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))
}
위와 같이 Enum 객체를 사용할 수 있습니다.
-> 위에서 Enum 객체들에 대하여 RGB값을 수정해야 하는 상황이 발생한다면?
enum 클래스의 각 상수들은 싱글톤으로 이루어져 있기 때문에, 단 하나의 인스턴스만 존재합니다. 따라서 최초에 설정한 enum 각각의 대한 상태를 변경할 수 없습니다.
제약사항
=> 이러한 제약사항들을 커버할 수 있도록 코틀린에서는 Sealed class를 제공합니다.
Sealed Class
특징
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의 이점