Enum class와 Sealed class

dada·2022년 4월 15일
3

Android

목록 보기
3/4

Enum 클래스와 Sealed 클래스

얼마전에 면접에서 해당 질문을 받았는데 제대로 답하지 못했다. 다시 정리하며
기억하기 위해 enum클래스와 sealed클래스의 차이점에 대해 알아보려고 한다!

Enum class vs Sealed clas

👉🏻둘다 타입을 제한적으로 사용하고자 할 때 많이 사용하게 됨.

  • Enum에서는 특정 값을 single instance로서 하나의 객체만 제한적으로 사용할 수 있으며, 생성자의 형태도 동일해야만 한다.
  • Sealed에서는 state을 포함하고 있는 여러개의 instance를 가질 수 있고, 생성자도 각각의 특징에 따라서 다르게 가져갈 수 있다. ⇒ 정적인 아닌 다양한 state를 사용할 수 있다.

🎈Sealed Class

  • 자기 자신이 추상 클래스이고, 자신을 상속받는 여러 서브 클래스들을 가질 수 있다. ⇒ enum클래스와 달리 상속을 지원하기 때문에, 다양한 동작 구현 가능
  • 상속받는 서브 클래스의 종류를 제한할 수 있음.
  • 상태가 바뀌지 않는 경우 object를 사용하는 것을 권장
    • sealed 클래스의 서브 클래스들은 반드시 같은 파일 내에 선언되어야 함.
      • 단, sealed 클래스의 서브 클래스를 상속한 클래스들은 같은 파일 내에 없어도 됨.
      • sealed 클래스는 기본적으로 abstrac 클래스임
      • sealed 클래스는 private 생성자만 갖게 됨.
      • 하위 클래스는 class, data class, object class로 정의할 수 있다,
    sealed class Color
    object Red : Color()
    object Green : Color()
    object Blue : Color()
    //object 클래스로 정의하면 singleton 패턴이 적용됨
    
    //객체 생성
    val color : Color = Red
    
    //중첩 클래스로 선언
    sealed class Color {
    	object Red : Color()
    	object Green : Color()
    	object Blue : Color()
    }
    
    val color : Color = Color.Red
    Sealed class로 부터 얻는 이점when을 사용할 때 Sealed class를 사용하면 else 구문을 추가하지 않아도 된다.
    sealed class Color {
        object Red: Color()
        object Green: Color()
    }
    
    val color : Color = Color.Red
    val font = when (color) {
        is Color.Red -> {
            "Noto Sans"
        }
        is Color.Green -> {
            "Open Sans"
        }
        // No error!
    		//하지만 sealed에 blue를 추가해주고 when에서 blue에 대한 정의가
    //없다면 오류 
    
    }

🎈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))
}

⇒ RED(255,0,0)를 RED(255,0,20)으로 변경하고 싶지만 Enum 클래스는 최초에 설정한 enum 각각에 대한 상태를 변경할 수 없다.

⇒ 상속 또한, 불가능하기 때문에 enum에 대한 서브 클래스를 생성할 수도 없다.

Reference

https://velog.io/@haero_kim/Kotlin-Sealed-Class-알아보기

https://codechacha.com/ko/kotlin-sealed-classes/

profile
기록하기

1개의 댓글

comment-user-thumbnail
2023년 2월 4일

좋은글 감사합니다~

답글 달기