상태 패턴의 정의
- 상태 패턴(State Pattern)을 사용하면 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있습니다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있습니다.
- 이 패턴은 상태를 별도의 클래스로 캡슐화한 다음 현재 상태를 나타내는 객체에게 행동을 위임하므로 내부 상태가 바뀔 때 행동이 달라지게 된다는 사실을 쉽게 알 수 있습니다.
- 전략 패턴과 유사하지만 용도가다 다름.
- 상태 패턴을 사용할 때는 상태 객체의 일련의 행동이 캡슐화됩니다. 상황에 따라 Context 객체에서 여러 상태 객체 중 한 객체에게 모든 행동을 맡기게 되죠. 그 객체의 내부 상태에 따라 현재 상태를 나타내는 객체가 바뀌게 되고, 그 결과로 Context 객체의 행동도 자연스럽게 바뀌게 됩니다. 클라이언트는 상태 객체를 몰라도 됩니다.
- 하지만 전략 패턴을 사용할 때는 일반적으로 클라이언트가 Context 객체에게 어떤 전략 객체를 사용할지를 지정해 줍니다. 전략 패턴은 주로 실행 시에 전략 객체를 변경할 수 있는 유연성을 제공하는 용도로 쓰이죠. 보통 가장 적합한 전략 객체를 선택해서 사용하게 됩니다.
- 일반적으로 전략 패턴은 서브클래스를 만드는 방법을 대신해서 유연성을 극대화하는 용도로 쓰입니다. 상속을 변경해서 클래스의 행동을 정의하다 보면 행동을 변경해야 할 때 마음대로 변경하기가 힘들죠. 하지만 전략 패턴을 사용하면 구성으로 행동을 정의하는 객체를 유연하게 바꿀 수 있습니다.
- Context 객체에 수많은 조건문을 넣는 대신에 상태 패턴을 사용한다고 생각하면 됩니다. 행동을 상태 객체 내에 캡슐화하면 Context 내의 상태 객체를 바꾸는 것만으로도 Context 객체의 행동을 바꿀 수 있으니까요.
정상성 점검하기
- 정상성 점검(sanity check) - 최종판은 납품하기 전에 마지막으로 체크해야 할 몇 가지 사항과 관련
정리
- 상태 패턴
- 상태를 기반으로 하는 행동을 캡슐화하고 행동을 현재 상태에게 위임합니다
- 전략 패턴
- 바꿔 쓸 수 있는 행동을 캡슐화한 다음, 실제 행동은 다른 객체에 위임합니다.
- 템플릿 메소드 패턴
- 알고리즘의 각 단계를 구현하는 방법을 서브클래스에서 구현합니다
summary
- 상태 패턴을 사용하면 내부 상태를 바탕으로 여러 가지 서로 다른 행동을 사용할 수 있습니다.
- 상태 패턴을 사용하면 프로시저 형 상태 기계를 쓸 때와는 달리 각 상태를 클래스로 표현합니다.
- Context 객체는 현재 상태에게 행동을 위임합니다.