상태(State) 패턴
2024. 10. 14. 05:03ㆍDesign Pattern
상태 패턴(State Pattern) - C#에서의 활용
상태 패턴(State Pattern)은 객체가 내부 상태에 따라 동작을 변경하는 디자인 패턴입니다.
상태 패턴은 상태 변화에 따라 객체의 행동을 다르게 하기 위해 사용하는 패턴으로, 클래스의 복잡한 조건문을 제거하고 각 상태를 별도의 클래스로 분리하여 관리하는 데 유용합니다.
1. 상태 패턴이란?
상태 패턴은 객체의 상태에 따라 다른 동작을 정의하는 패턴입니다. 이는 객체의 상태가 변경되면 그에 따라 행동도 달라지도록 설계합니다. 즉, 객체가 여러 상태를 가질 수 있을 때, 상태마다 객체의 행동을 다르게 표현할 수 있습니다. 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.
2. 상태 패턴 구조
상태 패턴은 다음과 같은 구성 요소로 이루어져 있습니다:
- Context(문맥): 상태 전환을 관리하며, 현재 상태 객체에 동작을 위임합니다.
- State(상태 인터페이스): 모든 상태 클래스가 구현할 공통 인터페이스를 정의합니다.
- ConcreteState(구체적인 상태 클래스): 특정 상태에 따른 동작을 정의하며, 상태 변경을 관리합니다.
3. 상태 패턴 예제
3.1 상태 인터페이스 정의
// 상태 인터페이스
public interface IState
{
void Handle(Context context);
}
3.2 구체적인 상태 클래스 정의
// ConcreteStateA - 상태 A
public class StateA : IState
{
public void Handle(Context context)
{
Console.WriteLine("State A: 행동을 수행 중입니다.");
context.State = new StateB(); // 상태 전환
}
}
// ConcreteStateB - 상태 B
public class StateB : IState
{
public void Handle(Context context)
{
Console.WriteLine("State B: 행동을 수행 중입니다.");
context.State = new StateA(); // 상태 전환
}
}
3.3 Context 클래스 정의
// Context 클래스
public class Context
{
private IState _state;
public Context(IState state)
{
State = state;
}
public IState State
{
get => _state;
set
{
_state = value;
Console.WriteLine($"상태가 {_state.GetType().Name}으로 변경되었습니다.");
}
}
public void Request()
{
_state.Handle(this);
}
}
3.4 상태 패턴 사용
class Program
{
static void Main(string[] args)
{
// 초기 상태를 설정
Context context = new Context(new StateA());
// 상태 변경을 발생시킴
context.Request(); // State A -> State B
context.Request(); // State B -> State A
}
}
출력 결과:
상태가 StateA으로 변경되었습니다.
State A: 행동을 수행 중입니다.
상태가 StateB으로 변경되었습니다.
State B: 행동을 수행 중입니다.
상태가 StateA으로 변경되었습니다.
4. 상태 패턴의 장점
- 상태 별 행동의 분리: 각 상태를 별도의 클래스로 분리하여, 상태별 행동을 명확하게 정의할 수 있습니다. 이를 통해 코드의 복잡도를 줄일 수 있습니다.
- 조건문 제거: 상태 전환을 조건문으로 관리하는 대신, 상태 객체로 분리하여 유지보수성을 높입니다.
- 확장성: 새로운 상태를 추가할 때 기존 코드를 수정하지 않고, 새로운 상태 클래스를 추가하기만 하면 됩니다.
5. 상태 패턴의 단점
- 클래스 증가: 상태마다 클래스를 별도로 정의해야 하므로 클래스의 개수가 많아질 수 있습니다.
- 단순한 상황에선 불필요: 상태 전환이 매우 간단한 경우에는 오히려 복잡성을 더할 수 있습니다. 작은 프로젝트나 단순한 상태 전환에는 사용하지 않는 것이 좋습니다.
6. 상태 패턴의 활용 사례
- 게임 개발: 캐릭터의 상태(Idle, Run, Jump 등)에 따라 다른 동작을 처리할 때 사용됩니다.
- UI 상태 관리: 애플리케이션의 UI 상태를 변경하거나 관리할 때 상태 패턴을 사용하여 효율적으로 관리할 수 있습니다.
- 비즈니스 로직: 상태에 따라 비즈니스 로직을 다르게 처리해야 하는 상황에서 활용됩니다. 예를 들어, 주문 처리 시스템에서 주문 상태에 따라 다른 동작을 수행할 수 있습니다.
7. 상태 패턴과 유사한 패턴
- 전략 패턴(Strategy Pattern): 상태 패턴과 유사하지만, 상태를 나타내는 것이 아니라 행동(알고리즘)을 캡슐화하여 교체하는 데 사용됩니다.
- 템플릿 메서드 패턴(Template Method Pattern): 알고리즘의 구조를 정의하고, 서브클래스에서 특정 단계를 오버라이드하여 구현하는 패턴입니다. 상태 패턴과 달리 알고리즘 구조는 고정되어 있습니다.
상태 패턴은 객체의 상태에 따라 행동을 다르게 처리할 수 있는 강력한 디자인 패턴입니다.
이를 통해 복잡한 조건문을 제거하고, 상태별 동작을 명확하게 정의할 수 있어 코드의 유지보수성과 가독성을 크게 향상시킬 수 있습니다.
'Design Pattern' 카테고리의 다른 글
MVC (Model-View-Controller) 패턴 (1) | 2024.10.14 |
---|---|
전략(Strategy) 패턴 (0) | 2024.10.14 |
퍼사드(Facade) 패턴 (0) | 2024.10.14 |
데코레이터(Decorator) 패턴 (1) | 2024.10.14 |
어댑터(Adapter) 패턴 (1) | 2024.10.12 |