sealed 클래스

자신을 상속 받는 여러 서브 클래스들을 가질 수 있는 추상 클래스

sealed 클래스

sealed 클래스


자신을 상속받는 여러 서브 클래스들을 가질 수 있는 추상 클래스(abstract class)이다.

sealed 의 뜻은 봉인이라는 뜻으로 sealed 클래스는 enum 클래스의 확장 형태로 클래스들을 묶은 클래스이라고 할 수 있다.


sealed 클래스 특징


enum 클래스와 다르게 상속을 지원하기 때문에 이를 활용한 다양한 동작을 구현할 수 있으며 상속 받는 서브 클래스의 종류를 제한할 수 있다.

  • 서브 클래스들은 각각의 인스턴스를 가지고 있으며 class, data 클래스, object 모두 가능하다.
  • 상태(변수)가 없는 경우 객체를 2번 이상 메모리에 올려 생성하는 것은 리소스의 낭비이기 때문에 상태가 없는 경우에는 싱글톤으로 생성해주는 object 를 사용하는 것이 권장된다.
sealed class Color {
    data class Red(val r: Int, val g: Int, val b: Int) : Color()
    data class Green(val r: Int, val g: Int, val b: Int) : Color()
    data class Blue(val r: Int, val g: Int, val b: Int) : Color()
}


sealed 클래스의 서브 클래스들은 같은 파일 내에 선언되어야 하며 같은 파일 내에 있다면 sealed 클래스의 블록 내에 위치하지 않아도 된다.

sealed 클래스의 서브 클래스를 상속받은 클래스들은 같은 파일 내에 없어도 된다.

sealed class Color

data class Red(val r: Int, val g: Int, val b: Int) : Color()
data class Green(val r: Int, val g: Int, val b: Int) : Color()
data class Blue(val r: Int, val g: Int, val b: Int) : Color()



sealed 클래스와 when


sealed 클래스를 사용할 때의 이점은 when 을 사용할 때이다.

fun main() {
    val color: Color = Color.Red(255, 10, 10)
    
    when (color) {
        is Color.Red -> println("빨강색")
        is Color.Green -> println("초록색")
        is Color.Blue -> println("파랑색")
    }
}
essential