Sealed Class Vs Enum Class

rivermoon·2024년 10월 24일
post-thumbnail
  • Sealed ClassEnum Class 두 가지 모두 다양한 상태나 값을 정의할 때 해당 방식을 선택한다.
  • 두 개념 모두 한정된 값 집합을 다루는 데 사용되지만, 동작 방식과 사용 시점에서 중요한 차이가 있다.
  • 이 아티클에서는 각각의 특징과 차이점, 그리고 언제 어떤 것을 선택해야 하는지에 대해 알아보려고 한다.

Sealed Class

Sealed Class는 상속이 제한된 클래스이다.
Sealed Class는 계층 구조에서 상속 가능한 하위 클래스를 제한하고, 상태를 보다 유연하고 구체적으로 표현할 수 있다.
특히, 각 상태마다 다른 속성이나 데이터를 가질 수 있는 상황에서 유용하다.
Sealed Class는 상태 기반의 복잡한 데이터 구조를 표현하는 데 적합하고, 주로 API 응답, UI 상태관리에서 사용된다.

특징

  • 확장성
    상속이 가능하지만, 하위클래스는 같은 파일 내에서만 정의할 수 있다.
  • 유연성
    각 하위 클래스는 서로 다른 데이터를 가질 수 있어 복잡한 상태 표현에 적합하다.
  • 컴파일러 보장성
    모든 하위 클래스가 처리되지 않으면 컴파일러가 경고를 발생한다.

예시

sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val exception: Exception) : Result()
    object Loading : Result()
}

Result라는 Sealed Class가 API 호출의 3가지 상태를 나타내는 코드다.
각 상태는 data or exceoption을 포함할 수 있다.

언제 Sealed Class를 사용해야 될까?

  • 다양한 상태와 상태별 다른 데이터를 포함할 필요가 있을 때(네트워크 요청 결과, UI 상태관리 등)
  • 확장된 상태 관리가 필요할 때

Enum Class

Enum class는 고정된 상수 집합을 정의하는 데 사용된다.
모든 상수는 객체로 취급 되며, 각각의 상수는 고정된 값을 가진다.
주로 제한된 값들의 목록을 나타내는 데 유용하다.

특징

  • 고유 객체
    각 상수는 객체이며, 메서드나 추가적인 속성을 가질 수 있다.
  • 불변성
    Enum class 내의 상수는 미리 정의된 고정된 값이다.
  • name과 ordinal
    각 상수는 이름과 순서값을 가진다.
  • 안정성
    when문과 함께 사용되며, 모든 상수를 처리하지 않으면 컴파일러가 경고를 보낸다. 즉 안정성을 보장한다는 것.

예시

enum class Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Day이라는 열거형 클래스가 요일을 정의하는 예시코드다.

fun getDayType(day: Day): String {
    return when (day) {
        Day.SATURDAY, Day.SUNDAY -> "Weekend"
        Day.MONDAY -> "Start of the week"
        // 다른 값들이 처리되지 않았으므로 오류남
    }
}

위 코드는 모든 Enum 값이 처리되지 않았기 때문에 컴파일러는 경고를 발생시킨다. 꼭 나머지 값들도 누락시키기 않는 것이 요구된다.

언제 Enum Class를 사용해야 될까?

  • 단순한 상태나 값의 집합을 정의할 때:
    예를 들어, 요일, 방향, 색상 등을 표현할 때 적합할 수 있다.
  • 고정된 상수로 구성된 집합을 다룰 때:
    상수 간의 관계나 상수 자체에 다양한 데이터를 부여할 필요가 없는 경우에 사용된다.

Sealed Class Vs Enum Class

특징Enum ClassSealed Class
사용 목적고정된 상수 집합을 정의다양한 상태와 데이터를 표현하는 구조
확장성불가능 (고정된 상수)하위 클래스로 제한적 확장 가능
데이터 포함 여부상수마다 고유한 데이터 불가상태마다 서로 다른 데이터를 포함 가능
컴파일러 경고상수 처리 누락 시 경고 발생하위 클래스 처리 누락 시 경고 발생
사용 예시방향, 요일 등 단순한 값의 집합 표현API 결과, UI 상태, 복잡한 상태 표현

결론

단순한 상수 집합을 정의하고 싶다면 Enum Class가 적합하며, 상태별로 서로 다른 데이터를 포함해야 하는 복잡한 상태 관리가 필요하다면 Sealed Class가 더 적합할 수 있다.

References

https://kotlinlang.org/docs/enum-classes.html
https://kotlinlang.org/docs/sealed-classes.html

profile
Android Developer

0개의 댓글