본문 바로가기
Design Pattern

[Design Pattern] 상태 패턴(State Pattern)에 대해 알아보자

by 개발자J의일상 2022. 7. 19.
반응형

Definition

상태 패턴(State Pattern)을 사용하면 객체의 내부 상태가 바뀜에 따라 객체의 행동을 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.

실제로 다른 클래스로 변신하는게 아니라 구성으로 여러 상태 객체를 바꿔 가면서 사용하기 때문

Behavioral Patterns

State pattern은 Finite-State Machine의 개념과 밀접하게 관련되어 있다.

 

Situation

- 객체의 behavior는 state의 영향을 받아야 한다.

- 복잡한 조건은 객체 동작을 해당 state에 연결한다.

- state 간의 전환은 명시적이어야 한다.

- 객체의 behavior는 state에 따라 달라지며 해당 state에 따라 런타임에 behavior를 변경해야 한다.

- 작업에는 객체의 state에 따라 달라지는 크고 여러 부분으로 구성된 조건문이 있다. State 패턴은 조건문의 각 분기를 별도의 클래스에 넣는다.

- 상태 패턴은 현재 상태에 따라 다르게 동작하는 객체가 있고 상태의 수가 많이 있고 상태별 코드가 자주 변경될 때

- 클래스 필드의 현재 값에 따라 클래스가 동작하는 방식을 변경하는 대규모 조건으로 클래스가 오염된 경우

- 조건 기반 상태 머신의 유사한 상태 및 전환에 걸쳐 중복 코드가 많은 경우

 

Structure

https://refactoring.guru/design-patterns/state

Pros

- Single Responsibility Principle. 특정 state와 관련된 코드를 별도의 클래스로 구성한다.

- Open/Closed Principle. 기존 State 클래스나 컨텍스트를 변경하지 않고 새 State를 도입할 수 있다.

- 부피가 큰 상태 머신 조건을 제거하여 컨텍스트의 코드를 단순화 한다.

- State와 관련된 모든 동작을 하나의 객체에 넣는다.

- State 전환 논리를 모놀리식 if문 또는 switch 문 대신 State 객체에 통합할 수 있다.

- 여러 객체나 속성이 아닌 하나의 상태 객체만 사용하여 상태 변경이 발생하므로 일관성 없는 state를 방지하는데 도움이 된다.

 

Cons

- 객체 수 증가

- 상태 개수가 많고 상태 변경 규칙이 자주 바뀐다면 Context의 상태 변경 코드가 복잡해지게 된다. 

- State machine에 몇 가지 state만 있거나 거의 변경되지 않는 경우 패턴을 적용하는 것이 과도할 수 있다.

 

비슷한 패턴

상태 패턴과 전략 패턴은 똑같은 다이어그램을 갖지만 상태 패턴과 전략 패턴의 용도는 다르다. 

상태 패턴을 사용할 때는 상태 객체에 일련의 행동이 캡슐화된다. 상황에 따라 Context 객체에서 여러 상태 객체 중 한 객체에게 모든 행동을 맡기게 된다. 그 객체의 내부 상태에 따라 현재 상태를 나타내는 객체가 바뀌게 되고, 그 결과로 Context 객체의 행동도 자연스럽게 바뀌게 된다. 클라이언트는 상태 객체를 몰라도된다.

하지만 전략 패턴을 사용할 때는 일반적으로 클라이언트가 Context 객체에게 어떤 전략 객체를 사용할지를 지정해 준다. 전략 패턴은 주로 실행 시에 전략 객체를 변경할 수 있는 유연성을 제공하는 용도로 쓰인다. 보통 가장 적합한 전략 객체를 선택해서 사용하게 된다. 전략 패턴은 서브 클래스를 만드는 방법을 대신해서 유연성을 극대화하는 용도로 쓰인다. 상속을 사용해서 클래스의 행동을 정의하다 보면 행동을 변경해야 할 때 마음대로 변경하기 힘들다. 하지만 전략 패턴을 사용하면 구성으로 행동을 정의하는 객체를 유연하게 바꿀 수 있다.

Bridge, State, Strategy (어느 정도 Adapter)는 매우 유사한 구조를 가지고 있다. 실제로 이러한 모든 패턴은 작업을 다른 객체에 위임하는 구성을 기반으로 한다. 그러나 이것들은 모두 다른 문제를 해결한다. 

 

StateStrategy의 확장으로 간주될 수 있다. 두 패턴 모두 구성을 기반으로 한다. 일부 작업을 도우미 개체에 위임하여 컨텍스트의 동작을 변경한다. Strategy는 이러한 객체를 완전히 독립적으로 만들고 서로를 인식하지 못하게 한다. 그러나 State는 구체적인 상태 간의 종속성을 제한하지 않고 컨텍스트의 상태를 마음대로 변경할 수 있다.

 

https://refactoring.guru/design-patterns/state
헤드 퍼스트 디자인 패턴 개정판 - 에릭 프리먼, 엘리자베스 롭슨

 

300x250

댓글