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)처럼 동작하지만, 상속할 수 있는 하위 클래스를 제한하는 특수한 클래스입니다.
주요 특징
- 같은 파일 내에서만 하위 클래스를 선언할 수 있음 → 외부에서 확장 불가.
when
표현식에서else
없이 모든 경우를 체크할 수 있음 → 컴파일러가 모든 경우를 보장.enum 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 class
는 enum class
와 abstract class
의 장점을 조합한 기능입니다.
Sealed Class | Enum Class | Abstract Class | |
---|---|---|---|
하위 클래스 제한 | 같은 파일 내에서만 허용 | 모든 멤버가 자동 정의 | 확장 가능 (파일 제한 없음) |
각 상태에 속성 추가 가능 | ✅ 가능 | ❌ 불가능 (모든 멤버 동일) | ✅ 가능 |
when에서 else 필요 여부 | ❌ 필요 없음 | ❌ 필요 없음 | ✅ 필요함 |
사용 사례 | FSM, UI 상태, 이벤트 처리 | 상수 값 관리 | 공통 기능 제공 |
언제 Sealed Class를 사용할까?
- 유한한 상태(State)를 표현할 때 (예: UI 상태 관리, 이벤트 처리)
- 각 상태마다 다른 데이터를 포함할 때 (
data class
활용 가능) when
문에서 exhaustive(완전한) 검사를 활용하고 싶을 때
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 구현 가능!
결론
- sealed class는 제한된 계층 구조를 정의할 때 유용
- when 문에서 else 없이 모든 경우를 체크할 수 있어 안정성이 높음
- FSM, 이벤트 처리, UI 상태 관리 등에 활용 가능
- 각 상태마다 추가 속성을 가질 수 있어 enum class보다 유연함