밤빵's 개발일지
[TIL]20241027 sealed class 와 Enum 본문
자바에서 열거형을 사용해 본 경험이 있었지만, 코틀린에서는 sealed class라는 또 다른 개념이 있다는 것을 알게 되었다. 이 두 개념은 모두 고정된(제한된) 범위의 값을 정의하는 데 사용되지만, 각각의 목적과 사용법에는 차이가 있다.
▶sealed class란?
sealed class는 계층 구조에서 클래스의 상속을 제한하기 위해 사용된다. sealed class를 상속받는 하위 클래스는 같은 파일 내에서만 정의할 수 있다. 이를 통해 클래스 계층을 제한적으로 관리할 수 있고, 코드의 안정성과 유지보수성을 높일 수 있다. 예를 들어, 특정 상태(State)를 나타내는 sealed class를 사용하면, 예상치 못한 새로운 상태가 추가되는 것을 방지할 수 있다. 이는 코드 작성 시 미리 정의된 상태만을 처리하도록 보장하는 효과가 있다.
▷sealed class 사용
sealed class NetworkResult {
object Success : NetworkResult()
object Loading : NetworkResult()
data class Error(val message: String) : NetworkResult()
}
fun handleNetworkResult(result: NetworkResult) {
when (result) {
is NetworkResult.Success -> println("Network request succeeded!")
is NetworkResult.Loading -> println("Loading...")
is NetworkResult.Error -> println("Error occurred: ${result.message}")
}
}
→ NetworkResult는 sealed class로 선언되었고, 세 가지 하위 타입(Success, Loading, Error)이 있다.
→ Error는 추가적인 데이터를 담기 위해 data class로 선언되었다.
→ when 표현식을 사용하여 각 타입에 대한 처리 로직을 명확하게 구현할 수 있다.
▶Enum 클래스란?
열거형(Enum)은 정해진 상수 집합을 나타내는 데 사용되는 클래스이다. 자바에서도 열거형을 사용해봤기 때문에 익숙한 개념이었다. Enum 클래스는 주로 상태, 방향, 옵션 등을 표현할 때 유용하고, 몇 가지 고정된 값만 사용할 때 유용하다. Enum 클래스의 각 상수는 고유한 객체로 취급된다.
▷Enum 클래스 사용
enum class Direction {
NORTH, SOUTH, EAST, WEST
}
fun navigate(direction: Direction) {
when (direction) {
Direction.NORTH -> println("Going North")
Direction.SOUTH -> println("Going South")
Direction.EAST -> println("Going East")
Direction.WEST -> println("Going West")
}
}
→ Direction은 Enum 클래스로, 네 가지 방향을 나타내는 상수를 포함하고 있다.
→ when 표현식을 사용해 각 방향에 대한 로직을 구현할 수 있다.
▶sealed class와 Enum의 차이점
sealed class와 Enum은 모두 제한된 값의 집합을 정의하는 데 사용되지만, 그 차이는 다음과 같다:
항목 | sealed class | Enum |
확장성 | 하위 클래스를 통해 확장이 가능 | 고정된 상수 집합으로 확장 불가능 |
데이터 저장 | 각 하위 클래스마다 고유한 필드를 가질 수 있음 | 각 Enum 상수는 고유한 속성을 가질 수 있음 |
표현 가능성 | 복잡한 데이터 구조 표현에 적합 | 단순한 상수 집합을 표현하는 데 적합 |
파일 위치 제한 | 같은 파일 내에서만 하위 클래스를 정의할 수 있음 | Enum 클래스는 어디에서나 참조 가능 |
패턴 매칭 지원 | when 표현식에서 패턴 매칭이 강력하게 지원됨 | Enum 값에 대해서도 when 표현식 지원 |
▶sealed class의 장단점
▷장점
- 유연성: 각 하위 클래스에 서로 다른 데이터나 메서드를 정의할 수 있어, 복잡한 데이터 구조를 표현하기에 적합하다.
- 안정성: 모든 하위 클래스가 같은 파일 내에 정의되어야 하므로, 예상치 못한 타입 추가나 오류를 방지할 수 있다.
- 명확한 패턴 매칭: when 표현식과 결합하여 명확한 패턴 매칭이 가능하다.
▷단점
- 파일 내 정의 제한: 모든 하위 클래스를 같은 파일에 정의해야 하므로, 파일 크기가 커질 수 있다.
- 복잡한 구조: 단순한 상수 집합을 표현하기에는 불필요하게 복잡할 수 있다.
▶Enum의 장단점
▷장점
- 간결성: 단순한 상수 집합을 정의하는 데 매우 유용하고, 코드가 간결하다.
- 고정된 값 표현: 값의 범위가 고정되어 있어, 특정 값들만 사용해야 할 때 유용하다.
- 유연한 속성: 각 Enum 상수에 속성을 추가할 수 있어, 고정된 값들에 대한 속성을 정의할 때 적합하다.
▷단점
- 확장성 부족: 고정된 값만을 다루므로, 새로운 값을 추가하거나 수정하는 데 제약이 있다.
- 복잡한 데이터 구조 표현에 부적합: 복잡한 구조나 다양한 데이터 형태를 표현하기에는 한계가 있다.
▶sealed class와 Enum의 활용 사례
- sealed class는 주로 다양한 상태(State)나 이벤트(Event)를 표현할 때 사용한다. 예를 들어, 네트워크 상태, UI 상태, API 응답 등을 처리할 때 유용하다.
- Enum은 고정된 값들의 집합을 정의할 때 사용한다. 예를 들어, 요일, 색상, 방향 등을 다룰 때 적합하다.
코틀린에서 sealed class와 Enum은 각각 고유한 장점을 가진 중요한 개념이다. sealed class는 유연성과 확장성을 가지고 복잡한 데이터 구조를 표현하는 데 강점이 있는 반면, Enum은 단순하고 고정된 값을 다루는 데 적합하다.
'Kotlin' 카테고리의 다른 글
[TIL]20241029 Nested Functions (3) | 2024.10.29 |
---|---|
[TIL]20241028 by 와 Delegation (1) | 2024.10.28 |
[TIL]20241026 apply, with, run (2) | 2024.10.26 |
[TIL]20241025 오버로딩 & 오버라이딩 (1) | 2024.10.25 |
[TIL]20241024 Type-Safe Builder (0) | 2024.10.24 |