목차
유한 상태 기계 (Finite-State Machine)
State 패턴은 FSM을 구현하는 방법 중 하나입니다. 주요 개념은 모든 주어진 순간에 프로그램이 속하는 상태의 수가 유한하다는 점입니다.
유한 상태 기계는 유한한 개수의 상태를 가질 수 있는 추상 기계를 뜻합니다. 한 번에 오로지 하나의 상태만을 가지며, 각각의 상태에서 프로그램은 다르게 행동하고, 한 상태에서 연결된 다른 상태로 전환할 수 있습니다.
State
상태 패턴은 객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게 허가하는 패턴으로, 객체가 마치 자신의 클래스를 바꾸는 것처럼 보입니다. (GoF의 디자인 패턴, 395p)
간단히 생각하면 상태를 객체화해 현재 상태에 따라 상태 객체를 사용하는 디자인 패턴입니다.
상태를 클래스로 캡슐화하고, 상태 전환을 클래스 간의 참조 변경으로 처리할 수 있습니다.
캐릭터 애니메이션 상태, 네트워크 연결 상태, 툴 상태 등, 현재 상태에 따라 다르게 행동하거나, 상태 수가 많거나, 상태별 코드가 자주변경되는 경우, 거대한 조건문으로 오염된 경우 쓸 수 있습니다.
장점
- 참조를 변경하는 걸로 상태를 유연하게 전환할 수 있습니다.
- 상태 전환 로직이 각 상태 클래스에 분리되어 있어 가독성이 좋습니다.
- 단일 책임, 개방 폐쇄 원칙을 따릅니다
단점
- 몇 가지 상태, 머신이 거의 변하지 않으면 과할 수 있습니다.
- 클래스, 복잡성 증
Unity 3D Game Kit
Unity 에셋 중 3D Game Kit에서 예시를 볼 수 있습니다. Unity에서 FSM 기반으로 애니메이션의 상태 기계를 StateMachineBehaviour🔗 를 사용해 넣을 수 있다고 합니다.
내부를 보면 ChomperBehavior와 애니메이터 내 상태별로 적절한 StateMachineBehaviour가 연결된 상태로,
ChomperBehavior(CB)는 Chomper에 상태를 바꿀 메서드와 필요한 기능들이 있고, 각 상태 클래스에는 상태에 따른 작업과 작업 결과에 따라 CB 참조로 Animator 상태를 바꿉니다.
예를들어 Idle 상태에서 CB에 적을 찾는 함수를 실행하고 적을 찾았다면 Animator 상태를 추격 상태로 변경합니다.
추격 상태에 가서 사거리 내에 있다면 공격을 아니라면 추격종료 등을 합니다.
State vs Strategy
전략 패턴과 상태 패턴이 하는 일이 비슷해 비교될 때가 많습니다.
전략 패턴 : 상속을 대체합니다. interface로 구체적인 클래스와 구현을 분리, 독립적입니다.
상태 패턴 : 조건문을 대체합니다. interface로 몸을 바꾸며 동시에 State 들의 하위 클래스가 상태를 쓰는 context 클래스에 대한 참조를 가져, context의 상태를 변경 가능합니다. 의존관계 제한 X, 전략의 확장
*참고
https://refactoring.guru/ko/design-patterns/state
상태 패턴
/ 디자인 패턴들 / 행동 패턴 상태 패턴 다음 이름으로도 불립니다: State 의도 상태 패턴은 객체의 내부 상태가 변경될 때 해당 객체가 그의 행동을 변경할 수 있도록 하는 행동 디자인 패턴입니
refactoring.guru
https://www.youtube.com/watch?v=uFKd7JbI5QY
https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%95%9C_%EC%83%81%ED%83%9C_%EA%B8%B0%EA%B3%84
유한 상태 기계 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 오토마타 벤 다이어그램 (각 레이어를 클릭하면 해당 글로 이동합니다.) 유한 상태 기계(finite-state machine, FSM) 또는 유한 오토마톤(finite automaton, FA; 복수형: 유한
ko.wikipedia.org
'디자인패턴' 카테고리의 다른 글
Unity MVVM 패턴 (0) | 2024.08.24 |
---|---|
의존성 주입 (Dependency Injection) (0) | 2024.06.27 |
싱글톤(Singleton) (0) | 2024.06.26 |
Unity MVP 패턴 (0) | 2024.06.24 |
MVVM 패턴 (0) | 2024.06.20 |