Enum Class와 Sealed Class의 차이점에 대해서 알아보자.
👉 둘 다 타입을 제한적으로 사용하고 싶을 때 사용할 수 있다.
Enum class
에서는 특정 값을 single instance로서 하나의 객체만 제한적으로 사용할 수 있으며, 생성자의 형태도 동일해야 한다.Sealed class
에서는 state를 포함하고 있는 여러개의 instance를 가질 수 있고, 생성자도 각각의 특징에 따라서 다르게 정의할 수 있다. (정적이 아니라 다양한 State를 사용할 수 있다.)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 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))
}