FSM 을 State Design Pattern 으로!

FSM (Finite State Machine) : 유한 상태 기계

  • 특징
    • 유한한 개수의 상태를 가짐.
    • 그 중 하나의 상태만 취함.
    • 특정 조건이 되면 다른 상태로 변함.
    • 가능한 상태 집합과 각 상태들의 전이 조건으로 정의됨.
  • 왜 쓸까?
    • 가능한 상태들을 명확히 규정할 수 있음.
    • 상태 중복을 피하고 전이들읠 명확하게 규정할 수 있음.
    • 기계의 동작이 명확히 규정됨.

이러한 FSM 을 구현하려면 각 상황에 대한 수많은 분기문들을 통해서 구현이 되어야 한다.

또한 기능이 하나 추가가 될 때 고려해야 할 상황과 추가해야할 코드들이 굉장히 많아진다.

State Design Pattern 상태 디자인 패턴

언제 사용할까?

  • 객체가 상태를 가져야 할 때

  • 특정한 조건을 판단하여 해당하는 상태로 변환해야 하는 로직이 있을 때

  • 각 상태마다 전이 조건이 있어 상황이 달라질 때

    예를 들어보자.. 
    어떤 캐릭터가 있다고 가정해보자. 이 캐릭터는 휴식, 이동, 배고픔, 싸움 상태가 있다. 
    할 수 있는 행동은 휴식, 이동, 먹기, 싸우기 행동이 있다. 
    
    캐릭터 상태가 이동일 때, 휴식을 하면 휴식 상태로 전환된다. 
    캐릭터 상태가 휴식일 때, 싸우면 싸움 상태로 전환된다. 
    캐릭터 상태가 싸움일 때, 싸우면 이기고 배고픈 상태로 전환된다.
    
    이런 전이 조건에 따른 상태 변화가 이루어지는 경우에 상태 패턴이 적합하다. 

State Pattern 을 사용한다면?

  • State Pattern 을 사용하지 않을 때 객체 자신이 상태를 체크하고 행위에 따라서 상태를 바꾼다.
    • 이 때 수많은 분기문이 생긴다.
  • State Pattern 을 사용한다면 객체가 아니라 상태가 직접 행동하고 변환된 새로운 상태를 반환하도록 위힘이하는 패턴이다.

어떻게 사용하지?

  • 객체의 상태들을 클래스로 선언한다.
  • 각 클래스에서 각 상태들이 할 수 있는 행위를 메서드로 정의한다.
  • 이 모든 상태 클래스들을 인터페이스로 캡슐화 해서 Client 에서는 이 인터페이스를 호출하고 저장한다.

출처