wanna be dev 🧑‍💻

Cool 하고 Sick한 개발자가 되고 싶은 uzun입니다

A.K.A. Kick-snare, hyjhyj0901, h_uz99 solvedac-logo

Android/Study

💡 Kotlin 코틀린 : SealedClass 란?

Kick_snare 2022. 8. 20. 19:44
728x90

Enum

코틀린에는 당연히 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)) } 

이 코드에서 RGB 값을 수정하는 요청을 수행해보자

  • enum클래스의 각 상수들은 싱글톤 디자인 패턴을 따르기 때문에, 단 하나의 인스턴스만 존재
  • 따라서 최소에 설정한 상태를 변경할 수 없다. 즉 정적인 상태를 가짐
  • 또한 상속이 불가능 하기에 서브 클래스 생성 불가

What?

이러한 enum 클래스의 제약사항을 커버하기 위해 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 Yellow(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()     data class Indigo(val r: Int, val g: Int, val b: Int) : Color()     data class Violet(val r: Int, val g: Int, val b: Int) : Color() } 
  • 서브 클래스들은 각기 다른 값을 가지고 생성될 수 있다.
  • class, dataclass, object 모두 가능!

상태값이 바뀌지 않는 서브 클래스의 경우 object를 사용하는 것을 권장

fun main() {     val color: Color = Color.Red(255, 0, 20)     when (color) {         is Color.Red -> println("빨강")         is Color.Orange -> println("주황")         is Color.Yellow -> println("노랑")         is Color.Green -> println("초록")         is Color.Blue -> println("파랑")                 is Color.Indigo -> println("인디고")                 is Color.Violet -> println("바이올렛")     } } 

위와 같이 상태값을 쉽게 변경하는 동작이 가능하게 되는 것임

장점

sealed 클래스의 서브클래스 각각에 대해 여러개의 인스턴스 생성가능

→ 상태값을 유동적으로 변경

참고

[Kotlin] Sealed Class 알아보기

728x90