Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20241027 sealed class 와 Enum 본문

Kotlin

[TIL]20241027 sealed class 와 Enum

최밤빵 2024. 10. 27. 21:05

자바에서 열거형을 사용해 본 경험이 있었지만, 코틀린에서는 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}")
    }
}

→ NetworkResultsealed 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")
    }
}

→ DirectionEnum 클래스로, 네 가지 방향을 나타내는 상수를 포함하고 있다.

→ 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