PHpullh
학습 라이브러리/Kotlin/상태 패턴 (State Pattern)

KOTLIN · 객체지향

상태 패턴 (State Pattern)

객체의 상태에 따라 동작을 변경하는 패턴입니다. sealed class와 when으로 안전하게 상태 전이를 관리합니다.

객체지향고급state-patternsealed-classstate-machinetransition

핵심 설명

객체의 상태에 따라 동작을 변경하는 패턴입니다. sealed class와 when으로 안전하게 상태 전이를 관리합니다.

Kotlin code

sealed class OrderState {
    data object Created : OrderState()
    data object Paid : OrderState()
    data object Shipped : OrderState()
    data object Delivered : OrderState()
    data class Cancelled(val reason: String) : OrderState()
}

class Order(val id: String) {
    var state: OrderState = OrderState.Created
        private set

    fun pay() { transition(OrderState.Created, OrderState.Paid) }
    fun ship() { transition(OrderState.Paid, OrderState.Shipped) }
    fun deliver() { transition(OrderState.Shipped, OrderState.Delivered) }
    fun cancel(reason: String) {
        require(state !is OrderState.Delivered) { "배송 완료 후 취소 불가" }
        state = OrderState.Cancelled(reason)
    }

    private fun transition(from: OrderState, to: OrderState) {
        require(state == from) { "현재 상태($state)에서 전이 불가" }
        state = to
        println("주문[$id]: $from → $to")
    }
}

fun main() {
    val order = Order("ORD-001")
    order.pay()
    order.ship()
    order.deliver()
    println("최종 상태: ${order.state}")
}

학습 팁

sealed class로 상태를 정의하면 when에서 모든 상태를 빠짐없이 처리할 수 있어 상태 누락 버그를 방지합니다.

주의할 점

상태 전이 규칙을 검증하지 않으면 유효하지 않은 상태 변경이 발생합니다. require로 전이 사전 조건을 반드시 검증하세요.

자주 묻는 질문

상태 패턴 (State Pattern)란 무엇인가요?

객체의 상태에 따라 동작을 변경하는 패턴입니다. sealed class와 when으로 안전하게 상태 전이를 관리합니다.

상태 패턴 (State Pattern) 학습 시 주의할 점은 무엇인가요?

상태 전이 규칙을 검증하지 않으면 유효하지 않은 상태 변경이 발생합니다. require 로 전이 사전 조건을 반드시 검증하세요.