본문 바로가기
어질어질 개발노트/Android

[Android] Sealed Class와 Enum의 차이점과 적절한 사용법 - Kotlin 개발자를 위한 가이드

by tia.mom 2025. 1. 10.
반응형

Kotlin을 사용하다 보면 sealed class와 enum을 만날 때가 많습니다. 두 개념은 서로 유사해 보이지만, 본질적으로 다르며 사용해야 할 상황도 구분됩니다. 이 글에서는 sealed class와 enum의 차이점, 컴파일 결과의 차이, 그리고 적절한 사용법에 대해 샘플 코드와 함께 설명합니다.


1. Sealed Class와 Enum: 기본 개념

Sealed Class란?

sealed class는 특정 클래스 계층 구조를 제한하는 Kotlin의 기능입니다.

  • 동일한 파일 내에서만 하위 클래스를 정의할 수 있습니다.
  • 상속을 통해 다양한 상태나 데이터를 표현하는 데 유리합니다.

Enum이란?

enum은 고정된 값의 집합을 정의하는 데이터 타입입니다.

  • 모든 상수 값은 불변이며, 명확한 값 집합을 표현할 때 사용됩니다.
  • 각 상수는 객체로 관리됩니다.

2. 컴파일된 결과의 차이

Sealed Class의 컴파일 결과

sealed class는 상위 클래스와 하위 클래스의 계층 구조를 유지하며 각각 독립된 클래스 파일로 컴파일됩니다.
이 구조 덕분에 when 문을 사용할 때, 모든 하위 클래스를 컴파일 타임에 확인하도록 강제할 수 있습니다.

Enum의 컴파일 결과

enum은 하나의 클래스 파일로 컴파일되며, 내부에 열거형 상수를 포함합니다.
각 상수는 클래스의 싱글톤 인스턴스로 표현됩니다.


3. 사용 사례 비교

Sealed Class: 복잡한 상태 관리

  • 네트워크 요청의 상태를 관리하거나 다양한 유형의 데이터를 처리할 때 적합합니다.
  • 각 상태에 추가적인 속성을 가질 수 있습니다.

Enum: 고정된 데이터 집합

  • 상수값으로 이루어진 데이터를 처리할 때 적합합니다.
  • 추가적인 속성이나 상태 관리가 필요 없는 경우 사용합니다.

4. 샘플 코드로 살펴보기

Sealed Class 예제: 네트워크 상태 관리

sealed class NetworkResult {
    data class Success(val data: String) : NetworkResult()
    data class Error(val errorMessage: String) : NetworkResult()
    object Loading : NetworkResult()
}

fun handleResult(result: NetworkResult) {
    when (result) {
        is NetworkResult.Success -> println("Data: ${result.data}")
        is NetworkResult.Error -> println("Error: ${result.errorMessage}")
        is NetworkResult.Loading -> println("Loading...")
    }
}​

Enum 예제: 방향 정의

enum class Direction {
    NORTH, SOUTH, EAST, WEST
}

fun move(direction: Direction) {
    when (direction) {
        Direction.NORTH -> println("Moving North")
        Direction.SOUTH -> println("Moving South")
        Direction.EAST -> println("Moving East")
        Direction.WEST -> println("Moving West")
    }
}

5. 왜 사용해야 할까?

  • Sealed Class는 계층 구조가 필요하거나 다양한 상태를 처리할 때 적합합니다.
  • Enum은 고정된 값 집합을 정의하고 관리하기에 간결하고 효과적입니다.

6. 결론: 올바른 도구를 올바른 곳에

sealed class와 enum은 Kotlin에서 데이터와 상태를 처리하는 강력한 도구입니다.
이 두 가지를 적절히 사용하면 가독성과 유지보수성이 뛰어난 코드를 작성할 수 있습니다.

여러분은 어떤 상황에서 sealed class와 enum을 사용하고 있나요? 댓글로 여러분의 경험을 공유해주세요! 😊

반응형