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]20241109 sealed interface 본문

Kotlin

[TIL]20241109 sealed interface

최밤빵 2024. 11. 9. 19:14

sealed interface는 제한된 클래스 계층을 정의하여 다형성을 구현하는 도구이다. sealed 클래스와 유사하지만 인터페이스의 특성을 가지기 때문에 다양한 구현체가 더 자유롭게 동작할 수 있다.

 

▶sealed interface의 개념

sealed interface는 sealed 클래스와 마찬가지로 특정 계층 내에서만 구현될 수 있도록 제한한다. 같은 파일 내에서만 구현 클래스가 정의될 수 있어 외부에서 무분별하게 구현체를 추가하는 것을 방지한다. 이를 통해 코드의 안전성을 높이고 유지보수를 용이하게 할 수 있다.

sealed interface Vehicle {
    fun drive()
}

class Car : Vehicle {
    override fun drive() {
        println("Driving a car")
    }
}

class Bike : Vehicle {
    override fun drive() {
        println("Riding a bike")
    }
}

→ Vehicle이라는 sealed interface를 정의하고 CarBike 클래스가 이를 구현했다. 이때 CarBike는 반드시 같은 파일 내에서 정의되어야 한다.

 


▶sealed interface의 장점

계층 제한

sealed interface를 사용하면 클래스 계층을 제한할 수 있어 의도한 대로만 구현체를 생성할 수 있다. 이를 통해 예기치 않은 구현을 방지할 수 있어 코드의 신뢰성을 높인다.

컴파일러 지원

sealed interface는 when 표현식에서 모든 구현체를 검사하도록 컴파일러가 보장한다. 이를 통해 when 블록에서 누락된 경우를 컴파일 타임에 발견할 수 있다.

fun describeVehicle(vehicle: Vehicle) = when (vehicle) {
    is Car -> "This is a car."
    is Bike -> "This is a bike."
    // 컴파일러는 모든 Vehicle 구현체를 다뤘는지 확인한다.
}

▶사용 사례

sealed interface는 다양한 사용 사례에 활용할 수 있다. 특히 복잡한 상태나 이벤트를 다루는 데 유용하다. 예를 들어, UI 상태 관리나 이벤트 기반 시스템에서 다양한 상태를 명확하게 구분하고 관리할 수 있다.

 

▷상태 관리 예시

sealed interface UiState

object Loading : UiState
object Success : UiState
class Error(val message: String) : UiState

fun handleState(state: UiState) {
    when (state) {
        is Loading -> println("Loading...")
        is Success -> println("Success!")
        is Error -> println("Error: ${state.message}")
    }
}

→ UiState라는 sealed interface는 Loading, Success, Error와 같은 상태를 정의한다. when 블록에서 모든 상태를 안전하게 다룰 수 있다.

 

▷이벤트 처리 예시

이벤트 기반 시스템에서도 sealed interface를 사용해 다양한 이벤트 타입을 정의하고 처리할 수 있다.

sealed interface UiEvent

object Click : UiEvent
object Swipe : UiEvent
class Input(val data: String) : UiEvent

fun processEvent(event: UiEvent) {
    when (event) {
        is Click -> println("Button clicked")
        is Swipe -> println("Screen swiped")
        is Input -> println("User input: ${event.data}")
    }
}

→ UiEvent라는 sealed interface는 Click, Swipe, Input 등 다양한 이벤트를 표현할 수 있다. when 표현식을 통해 모든 이벤트 타입을 안전하게 다룰 수 있다.


▶sealed interface와 sealed 클래스의 차이

sealed interface는 다중 구현을 허용하기 때문에 클래스가 다른 인터페이스를 추가로 구현할 수 있다. 반면 sealed 클래스는 상속 구조에 좀 더 엄격하다. sealed interface는 인터페이스의 장점을 유지하면서도 계층을 제한할 수 있는 유연성을 제공한다.


sealed interface는 코드의 신뢰성과 안전성을 보장하면서 다형성을 구현할 수 있는 유용한 도구이다. 다양한 상태나 이벤트를 안전하게 처리할 수 있으며, 유지보수성도 뛰어나다. 이를 잘 활용하면 복잡한 시스템을 보다 명확하고 안전하게 관리할 수 있다. 코틀린의 특성을 더 잘 이해하고자 한다면 sealed interface를 학습해 다양한 프로젝트에 적용해 보는 것이 좋다.

'Kotlin' 카테고리의 다른 글

[TIL]20241118 확장성과 오버엔지니어링  (3) 2024.11.18
[TIL]20241110 커링(Currying)  (0) 2024.11.10
[TIL]20241108 Lazy  (1) 2024.11.08
[TIL]20241107 실드클래스(Sealed Class)  (1) 2024.11.07
[TIL]20241106 제네릭(Generic)  (1) 2024.11.06