Language/kotlin

Enum, Sealed Class - 공통점, 차이점 정리

kimjingyu 2023. 5. 23. 15:07
728x90

Enum

  • 열거형. 클래스 내에 상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성하고 그 중 하나의 상태를 선택해 나타내는 방식이다.
  • 특징
    1. enum class 안에는 상수를 나타내는 대문자로 나타낸다.
    2. enum 객체들은 고유한 속성을 가질 수 있다.
    3. 일반 클래스처럼 함수 선언도 가능하다.
enum class Color (val red: Int, val green: Int, val blue: Int) {
   RED(255, 0, 0),
   GREEN(0, 255, 0),
   BLUE(0, 0, 255); <- ;이 핵심
   
   fun isRed() = this == Color.RED
}
  • 단점
    • 각 객체들이 서로 다른 형태를 가질 수 없다.
      • enum 클래스의 각 상수들은 싱글톤 디자인 패턴을 따르기 때문에 단 하나의 인스턴스만 존재하게 된다.
      • 따라서 최초에 설정한 enum 각각에 대한 상태를 변경할 수 없다.
      • RED(255,0,0)이라고 정의해뒀으면, 속성값들을 바꿀 수 없다는 이야기이다.
    • 상속이 불가능한 형태이기 때문에 enum에 대한 서브 클래스를 생성할 수도 없다.
enum class Result {
    SUCCESS,
    FAILED(val exception: Exception);
}

Sealed

  • Enum과 같은 value 당 제한을 가지면서 각 value의 형태를 다르게 확장성 있도록 가져가기 위해서 sealed class를 사용한다.
  • sealed 클래스는 자기 자신이 추상 클래스이고, 자신을 상속받는 여러 서브 클래스들을 가질 수 있다.
  • 이를 사용하면 enum 클래스와 달리 상속을 지원하기 때문에 상속을 활용한 풍부한 동작을 구현할 수 있다.
  • 특징
    • sealed class의 서브 클래스들은 반드시 같은 파일 내에 선언되어야 한다. 단, sealed 클래스의 서브 클래스를 상속한 클래스들은 같은 파일 내에 없어도 된다. 
    • sealed class는 기본적으로 abstract 클래스이다.
    • sealed class는 private 생성자만 가진다.
    • 각 타입을 특정 범위로 묶을 수 있다.
    • 각각의 요소가 되는 항목들 역시 다른 형태의 값을 지닐 수 있다.
    • sealed class를 상속받는 클래스들은 같은 kt 파일 또는 패키지 안에 존재해야 한다.
      • 내부적으로 private한 constructor를 갖기 때문이다.
      • 외부에서 sealed class를 상속받는다면 컴파일 에러가 발생한다.
  • 서브 클래스 각각은 각기 다른 값을 가지고 개성있게 생성될 수 있도록 되어있다.
    • 서브 클래스들은 class, data class, object 모두 가능하다.
    • 상태값이 바뀌지 않는 서브 클래스의 경우 object를 권장
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()

Sealed Class 의 장점

  • sealed 클래스의 서브 클래스 각각에 대해 여러 개의 인스턴스 생성이 가능하다.
    • 이 덕분에 상태값을 유동적으로 변경할 수 있다.
  • sealed 클래스의 계층을 생성할 수 있다.

 

인용

https://velog.io/@ddyy094/Enum-class%EC%99%80-Sealed-class

 

Enum class와 Sealed class

Enum 클래스와 Sealed 클래스 Enum class vs Sealed clas 👉🏻둘다 타입을 제한적으로 사용하고자 할 때 많이 사용하게 됨. Enum에서는 특정 값을 single instance로서 하나의 객체만 제한적으로 사용할 수 있

velog.io

https://velog.io/@haero_kim/Kotlin-Sealed-Class-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

 

[Kotlin] Sealed Class 알아보기

Enum Class 의 확장판, Sealed Class 의 개념

velog.io

https://jgeun97.tistory.com/242

 

[Kotlin] Enum Class와 Sealed class

Enum Class: Enumerated Type 열거형의 준말로 class 내에 상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성하고 그 중 하나의 상태를 선택해 나타내는 방식입니다. 1. enum class 안에는 상수를 나타

jgeun97.tistory.com

 

728x90