핵심 인사이트 (3줄 요약)
- 객체의 상태 변화 자동화: 객체의 내부 상태가 바뀜에 따라 객체의 행위가 달라지도록 하는 패턴이다.
- if-else 조건문의 제거: 복잡한 조건문(if-else/switch)을 상태 클래스로 분산시켜 가독성과 확장성을 높인다.
- 클래스 동적 변경: 클라이언트 관점에서는 객체의 클래스가 동적으로 바뀌는 것처럼 행동하게 된다.
Ⅰ. 개요 (Context & Background)
- 자판기, 엘리베이터, 미디어 플레이어 등은 현재 상태에 따라 같은 입력에도 다른 반응을 보여야 한다. 이를 하나의 클래스에서 if-else로 처리하면 코드가 거대해지고 수정이 불가능해지는데, 상태 패턴은 각 상태를 독립된 객체로 캡슐화하여 해결한다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
[ Context ] ----> [ <<Interface>> State ]
| |
| +--------+--------+
| | |
| [ ConcreteStateA ] [ ConcreteStateB ]
| | |
+---- [ State Transfer ] <-----+
<Bilingual ASCII Diagram: 상태 패턴 전이 구조 / State Pattern Transition Structure>
- 핵심 메커니즘:
- Context(문맥): 현재 상태를 나타내는
State 객체를 유지하며, 클라이언트의 요청을 현재 상태 객체로 위임한다.
- State(상태 인터페이스): 상태별 공통 행위를 캡슐화한다.
- ConcreteState(구체적 상태): 각 상태에 맞는 로직을 구현하고 다음 상태로의 전이(Transition)를 관리한다.
Ⅲ. 융합 비교 및 다각도 분석 (Comparison & Synergy)
| 구분 | 상태 패턴 (State Pattern) | 전략 패턴 (Strategy Pattern) |
| 목적 | 상태 전이에 따른 행동의 변화 통제 | 필요에 따라 알고리즘 자체를 교체 |
| 변화 주체 | 객체 내부의 로직/이벤트에 의한 자동 전이 | 클라이언트의 능동적 주입에 의한 수동 교체 |
| 의존성 | 상태 간에 서로의 존재를 알거나 Context에 의존 | 각 전략은 서로를 모르는 독립적 존재 |
Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)
- 적용 지점: 상태 기계(State Machine)가 필요할 때, 특히 상태의 개수가 많고 전이 규칙이 복잡할 때 효과적이다.
- 판단 지점: 상태 전이를 상태 클래스에서 할지, Context에서 할지 결정해야 한다. 상태 클래스에서 하면 전이 로직이 캡슐화되지만 클래스 간 결합도가 높아질 수 있다.
Ⅴ. 기대효과 및 결론 (Future & Standard)
- 단일 책임 원칙(SRP)과 개방-폐쇄 원칙(OCP)을 동시에 만족시키는 최적의 도구이다. 비즈니스 로직의 복잡성을 객체 지향적으로 해결하여 유지보수 비용을 획기적으로 낮춘다.
📌 관련 개념 맵 (Knowledge Graph)
- GoF 디자인 패턴 -> 행위 패턴 -> (State Pattern, Strategy Pattern) -> Finite State Machine (FSM)
👶 어린이를 위한 3줄 비유 설명
- 상태 패턴은 주인공의 "기분(상태)"에 따라 행동이 바뀌는 것과 같아요.
- 기분이 좋을 때와 슬플 때 똑같이 "안녕"이라고 해도 목소리나 표정이 달라지는 걸 상상해 보세요.
- 각 기분을 따로따로 서랍(클래스)에 넣어두고, 기분이 바뀔 때마다 그 서랍을 열어서 행동하는 거랍니다.