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 classsealed 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 

 

🤔 추가로 생각해 볼 질문들

  1. sealed interface와 sealed class는 어떻게 다를까?
  2. sealed class와 Result, Either는 어떤 상황에서 선택해야 할까?
  3. when 사용 시 else 없이도 안전하게 쓰는 방법은?
  4. sealed class를 다중 파일로 나눌 수 없는 이유는?
  5. Kotlin 1.5 이후의 sealed interface는 어떤 장점을 줄까?