티스토리 뷰
Today I Learned - Day 43 [유한 상태 머신(Finite State Machine)]
불면증 도사 2024. 11. 13. 21:18오늘은 개인 제작 보다는 협업에 유용한, 디자인 패턴 중 하나를 정리해 볼까 한다.
다만, 개인 제작에도 도움이 되는 게, 디자인 패턴은 기본적으로 코드의 정리 및 분화에 특화되어 있다 보니 가독성이나 기능 제한 등, 개인적인 작업에 유용한 점도 확실하게 있는 편이다.
특히, 이번에 정리할 유한 상태 머신은 '다른 클래스에서 확실하게 '이거다'하는 방식으로 행동 제어가 가능하다'라는 점에서 익숙해진다면 상당히 유용한 내용이다.
그렇다면, 한번 정리 해 보자.
'상태 머신(State Machine)'이란?
유한 상태 머신에 대해서 정리하기 전에, '상태 머신'이라는 용어 부터 정리해 보자.
프로그래밍을 배우면서 가장 먼저, 그리고 가장 확실하게 자리잡는 개념은 '모든 프로그램은 입력과 출력이 존재하며, 입력과 출력은 항상 일관적인 관계가 성립한다'는 것이다. 실제로 '코딩'이라는 작업 자체도 이 '일관적인 관계'를 정립하는 과정이라고 보면 옳다.
만약에 이것이 '하나의 목적'으로만 다뤄지는 프로그램이라면 여기에서 끝나도 상관 없을 것이다. 하지만 오늘날의 프로그램은 '같은 입력값에 대해서 다른 결과물도 나올 수 있는' 프로그램들의 수요가 훨씬 많다. 즉, 일관적인 관계가 바뀔 수 있어야 한다는 것이다.
즉. 오늘날의 프로그램들은 하나의 입력값을 특정한 조건에 따라서 다른 절차로 처리하여 상황에 따라서 바라는 값을 도출할 수 있어야 한다. 이것이 오늘날의 프로그램들에게 요구되는 사항이다.
자, 여기서 상태 머신을 정리할 수가 있다. 바로 '상황(State)에 따른 처리 절차(Machine)'다. 즉, 같은 입력값에 대해서 다른 결과가 도출되도록 하는 각각의 처리 절차가 '상태 머신'인 것이다.
여기 까지 정리한 뒤에, 유한 상태 머신을 정리해 보자.
유한 상태 머신(Finite State Machine)?
상기 내용을 통해서 '상태 머신'이 무엇인지는 알게 되었다. 그렇다면 유한 상태 머신은 무엇일까.
결론 부터 말하자면, '유한개로 끝나는 상태 머신의 전체적인 구조'라고 할 수 있다.
즉, 어떠한 조건으로 '상태'가 변화하는지, 그 상태 간의 상호관계는 무엇인지 등을 통하여 기능을 구성하는 방식이라고 보면 된다. 이러한 개념이기 때문에 '기본적으로 연산에는 하나의 상태 머신 만이 적용된다.'는 전제가 필요한 개념이기도 하다.
유한 상태 머신이라고는 하지만, 중요한 것은 저 '단일성'이다. 하나의 상태 머신 만이 적용되기 때문에 각 상황을 명확하게 구분할 수가 있고, 이에 따라서 게임의 상황이나 캐릭터의 동작에 따라서 기능의 적용과 제한을 보다 확실하고 명확하게 구성할 수 있다는 것이 최고의 장점.
이외에도 '상태에 따른 처리 방식'이라는 점 덕분에 분업을 할 때에도 매우 유용한 방식이기도 하다.
다만, 구현법이 익숙하지가 않다면 다소 복잡하다... 기 보다는 이래저래 혼동되기가 쉬운 구성이다.
구현 방법
디자인 패턴이기 때문에 정해진 구현 방법은 없다.
이는 싱글톤도 마찬가지이며, 그저 '자주 쓰는 방법'은 있을 뿐이다.
그러니, 본문에는 '구성하는 기초 형태'를 설명하고자 한다.
유한 상태 머신의 기초적인 형태는 다음과 같다.
- 모든 상태를 아우러서 적용할 수 있는 실행자 역할의 class를 하나 만든다.
[일반적으로 StateMachine이라 명명한다.] - 하나의 부모 클래스로 부터 분화시키는 방식으로 각 상태 별 동작 방식을 작성한다.
- 자식 클래스의 개수는 '프로젝트에서 필요로 하는 상태의 개수'다.
- 이 때, 반드시 포함되어야 하는 내용은 다음과 같다.
- 상태 진입 시 처리 함수
- 상태 전환[퇴장] 시 처리 함수
- 상태 내부에서의 처리 함수 [2번에서는 없어도 되지만 4번에서는 추가되어야 한다.]
- 1번의 자식 클래스로 모든 상태를 변수로 지니고 있는 클래스를 제작한다.
[1번에 작성해도 되기는 하나, 만약 형식만 같은 대상이 2체 이상이라면 이렇게 작성해야 한다.] - 2번에서 작성한 요소들으로 상태 간의 연결관계를 작성한다.
[이 때, 각 요소 간의 전환은 3번에서 작성한 상태 변수로 구성한다.]
기초적인 형태는 위와 같고, 프로젝트의 구성에 따라서 추가로 각 상태에서의 처리 함수를 추가하면 된다.
사실 유한 상태 머신은 이제 막 익혀서 다루고 있는 상황이라서 본인도 다소 난감해 하고 있는 내용이다.
다른 게 아니라, '상태 별로 나눠서 본다'라는 점이 의외로 혼동이 자주 생기기 때문.
그래도 작성하고 나면 알아보기가 참 편하기도 하고, 팀 프로젝트에서 분업을 할 때에도 유용한 디자인 패턴이니, 한번 유의깊게 살펴보는 것도 좋을 것이다.
'스파르타 내일배움캠프 > Today I Learned' 카테고리의 다른 글
Today I Learned - Day 45 [디버그 하는 방법] (0) | 2024.11.15 |
---|---|
Today I Learned - Day 44 [GameObject 라이프 사이클의 난점] (2) | 2024.11.14 |
Today I Learned - Day 42 [3D 환경에서의 픽셀 그래픽] (2) | 2024.11.12 |
Today I Learned - Day 41 [URP] (1) | 2024.11.11 |
Today I Learned - Day 40 [ParticleSystem - Script] (0) | 2024.11.08 |