본문 바로가기

Knowledge/Design Pattern

스테이트 패턴 (State Pattern)

스테이트 패턴 (State Pattern)

객체 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다.

마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다.


》》 상태 객체를 따로 생성하고, 상태 객체에게 위임하여 동작



스테이트 패턴의 예제

천원짜리 지폐를 넣으면 100원짜리 동전 10개로 교환해주는 동전교환기가 있다.

이 동전교환기를 어떻게 구현하는 것이 좋을까? 우선 동전교환기의 상태들을 모은다.

이것을 상태에 따라 if문으로 구현한다면?

  • 디자인원칙 OCP를 지키지 못한다.
  • 객체지향 디자인이라고 보기엔 무리가 있다.
  • 지저분한 조건문으로 인한 가독성이 저하된다.
  • 무엇보다 추후에 발생하는 유지보수와 코드 확장의 어려움을 겪는다.

그렇다면 어떻게 구현하는 것이 좋을까?

  • 먼저 동전교환기에 관련된 모든 행동의 메소드가 들어있는 State인터페이스를 정의해야한다.
  • 그 다음으로 교환기의 모든 상태에 대해서 클래스를 구현해야한다.
  • 마지막으로 조건문 코드를 모두 없애고 상태 클래스에 모든 작업을 위임한다.




스테이트 패턴 vs 스트래티지 패턴

스테이트패턴은 스트래티지(전략) 패턴과 별반 다를게 없어보인다.

이 두가지 패턴은 용도에 있어서 차이를 보인다 !


※ State Pattern

  • 상황에 따라 컨텍스트 객체에서 여러 상태 객체 중 한 객체에게 모든 행동을 맡긴다

  • 클라이언트는 상태 객체에 대해서 거의 몰라도 된다.

  • 수많은 조건문을 집어넣는 대신에 사용할 수 있는 패턴


※ Strategy Pattern

  • 클라이언트에서 컨텍스트 객체에게 어떤 전략 객체를 사용할 지를 지정해준다.

  • 실행 시에 전략 객체를 변경할 수 있는 유연성을 제공한다.