with ChatGPT/코틀린 with ChatGPT
[코틀린 with ChatGPT #19] Kotlin의 sealed class와 enum class의 차이 및 장점
dev_writer
2025. 4. 2. 09:00
with ChatGPT 시리즈는 ChatGPT의 내용과 개인의 생각을 토대로 학습해 보는 컨텐츠입니다.
Kotlin에서는 여러 분기 (branching)나 상태 (state)를 표현할 때 enum class와 sealed class 둘 다 사용할 수 있습니다.
두 구조 모두 "한정된 집합"을 표현하지만, 표현력, 확장성, 타입 안정성 측면에서 서로 다른 특징을 가집니다.
이번 글에서는 이 둘의 차이와 언제 어떤 것을 사용해야 하는지를 중심으로 정리해 보겠습니다.
🔹 1. enum class란?
enum class는 Java에서 유래한 구조로, 고정된 상수 집합을 표현할 때 사용합니다.
enum class Direction {
NORTH, SOUTH, EAST, WEST
}
- 상수 집합 정의에 적합
- 각 항목은 싱글턴 객체
- 상태나 값이 단일하고 고정적인 경우 유리
val dir = Direction.NORTH
when (dir) {
Direction.NORTH -> println("↑")
Direction.SOUTH -> println("↓")
Direction.EAST -> println("→")
Direction.WEST -> println("←")
}
🔹 2. sealed class란?
sealed class는 클래스 계층의 하위 타입을 제한하고, 패턴 매칭을 안전하게 지원하는 추상 클래스입니다.
sealed class NetworkResult
data class Success(val data: String) : NetworkResult()
data class Failure(val error: Throwable) : NetworkResult()
object Loading : NetworkResult()
- 하위 클래스는 반드시 같은 파일에 정의되어야 함
- when 표현식에서 exhaustive 체크가 가능
- 각 하위 클래스에 상태, 데이터, 로직을 모두 정의 가능
🔍 sealed class vs enum class 비교
항목 | enum class | sealed class |
목적 | 고정된 값 정의 | 제한된 클래스 계층 정의 |
데이터 포함 | 가능하나 제한적 (프로퍼티 직접 포함) | 각 하위 클래스마다 자유롭게 정의 가능 |
로직 포함 | 제한적 | 각 클래스마다 함수 정의 가능 |
상속 구조 | 불가능 (모든 enum은 고정) | 가능 (하위 클래스 확장 구조) |
패턴 매칭 지원 | when 지원, exhaustive 아님 | when에서 exhaustive 체크 가능 |
실전 사용 | 상태가 단순할 때 | 복잡한 상태, 다양한 정보 표현 시 |
✅ 실무 예시: API 응답 처리
❌ enum class만 사용할 경우 (비추천)
enum class ApiStatus {
LOADING, SUCCESS, ERROR
}
- 상태는 표현되지만, 결과 데이터나 오류 정보는 외부 변수로 따로 관리해야 함
✅ sealed class를 사용할 경우
sealed class ApiResult<T> {
data class Success<T>(val data: T) : ApiResult<T>()
data class Error<T>(val exception: Throwable) : ApiResult<T>()
class Loading<T> : ApiResult<T>()
}
fun handle(result: ApiResult<String>) = when (result) {
is ApiResult.Success -> println("데이터: ${result.data}")
is ApiResult.Error -> println("에러: ${result.exception.message}")
is ApiResult.Loading -> println("로딩 중...")
}
sealed class는 상태 + 데이터 + 분기 로직까지 함께 표현할 수 있어,
실무에서 API 상태나 UI 상태를 표현할 때 매우 강력하게 사용됩니다.
🚀 결론
비교 포인트 | enum class | sealed class |
고정된 상수 표현 | ✅ 적합 | ❌ 부적합 |
상태 + 데이터 표현 | ❌ 불편 | ✅ 매우 적합 |
로직 포함 | ❌ 제한적 | ✅ 가능 |
확장성 | ❌ 없음 | ✅ 클래스 계층 확장 가능 |
when의 exhausitive 검사 | ❌ 경고 없음 | ✅ 컴파일러가 누락 분기 체크 |
✅ 단순한 상태 구분에는 enum class
✅ 데이터를 포함하는 복합 상태 표현에는 sealed class
🤔 추가로 생각해 볼 질문들
- sealed interface와 sealed class는 어떻게 다를까?
- sealed class와 Result, Either는 어떤 상황에서 선택해야 할까?
- when 사용 시 else 없이도 안전하게 쓰는 방법은?
- sealed class를 다중 파일로 나눌 수 없는 이유는?
- Kotlin 1.5 이후의 sealed interface는 어떤 장점을 줄까?