밤빵's 개발일지
[TIL]20241109 sealed interface 본문
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를 정의하고 Car와 Bike 클래스가 이를 구현했다. 이때 Car와 Bike는 반드시 같은 파일 내에서 정의되어야 한다.
▶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 |