어질어질 개발노트/Android
[Android] Sealed Class와 Enum의 차이점과 적절한 사용법 - Kotlin 개발자를 위한 가이드
tia.mom
2025. 1. 10. 23:59
반응형
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을 사용하고 있나요? 댓글로 여러분의 경험을 공유해주세요! 😊
반응형