Skip to content

Sealed classes

Published: at 오전 07:21

Table of contents

Open Table of contents

intro

Kotlin에서 sealed class는 제한된 계층 구조를 가지는 클래스로, 상속을 특정 파일 내에서만 허용하는 특성을 갖습니다. sealed class는 enum class와 abstract class의 장점을 결합한 형태로, 유한한 상태(Finite State Machine, FSM) 관리, UI 상태 처리, 이벤트 기반 설계 등에 유용합니다.

sealed class 란?

sealed class는 추상 클래스(abstract class)처럼 동작하지만, 상속할 수 있는 하위 클래스를 제한하는 특수한 클래스입니다.

주요 특징

sealed class 예시

sealed class TradeState

data class Idle() : TradeState()
data class Requesting() : TradeState()
data class Handling() : TradeState()

위 코드에서 TradeState는 다른 클래스에서 상속할 수 없으며, Idle, Requesting, Handling 세 가지 하위 클래스만 선언할 수 있습니다.

Sealed Class vs Enum vs Abstract Class

sealed classenum classabstract class의 장점을 조합한 기능입니다.

Sealed ClassEnum ClassAbstract Class
하위 클래스 제한같은 파일 내에서만 허용모든 멤버가 자동 정의확장 가능 (파일 제한 없음)
각 상태에 속성 추가 가능✅ 가능❌ 불가능 (모든 멤버 동일)✅ 가능
when에서 else 필요 여부❌ 필요 없음❌ 필요 없음✅ 필요함
사용 사례FSM, UI 상태, 이벤트 처리상수 값 관리공통 기능 제공

언제 Sealed Class를 사용할까?

Sealed Class를 활용한 실전 예제

FSM(유한 상태 머신) 적용 – 트레이딩 전략

sealed class TradeState {
    object Idle : TradeState()
    object Monitoring : TradeState()
    data class Buying(val price: Double, val amount: Double) : TradeState()
    data class Holding(val entryPrice: Double, val quantity: Double) : TradeState()
    data class Selling(val sellPrice: Double) : TradeState()
    object Exit : TradeState()
}

fun handleTradeState(state: TradeState) {
    when (state) {
        is TradeState.Idle -> println("대기 중...")
        is TradeState.Monitoring -> println("시장 감시 중...")
        is TradeState.Buying -> println("매수 주문 실행! 가격: ${state.price}, 수량: ${state.amount}")
        is TradeState.Holding -> println("보유 중! 진입가: ${state.entryPrice}, 수량: ${state.quantity}")
        is TradeState.Selling -> println("매도 주문 실행! 매도가: ${state.sellPrice}")
        is TradeState.Exit -> println("전략 종료")
    }
}

➡ 각 상태(State)별로 데이터(가격, 수량 등)를 포함할 수 있음 → 유연한 FSM 구현 가능!

결론