
- Sealed Class와 Enum 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을 포함할 수 있다.
Enum class는 고정된 상수 집합을 정의하는 데 사용된다.
모든 상수는 객체로 취급 되며, 각각의 상수는 고정된 값을 가진다.
주로 제한된 값들의 목록을 나타내는 데 유용하다.
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 |
|---|---|---|
| 사용 목적 | 고정된 상수 집합을 정의 | 다양한 상태와 데이터를 표현하는 구조 |
| 확장성 | 불가능 (고정된 상수) | 하위 클래스로 제한적 확장 가능 |
| 데이터 포함 여부 | 상수마다 고유한 데이터 불가 | 상태마다 서로 다른 데이터를 포함 가능 |
| 컴파일러 경고 | 상수 처리 누락 시 경고 발생 | 하위 클래스 처리 누락 시 경고 발생 |
| 사용 예시 | 방향, 요일 등 단순한 값의 집합 표현 | API 결과, UI 상태, 복잡한 상태 표현 |
단순한 상수 집합을 정의하고 싶다면 Enum Class가 적합하며, 상태별로 서로 다른 데이터를 포함해야 하는 복잡한 상태 관리가 필요하다면 Sealed Class가 더 적합할 수 있다.
https://kotlinlang.org/docs/enum-classes.html
https://kotlinlang.org/docs/sealed-classes.html