디자인 패턴 - 상태 머신

in #kr-dev6 years ago (edited)

코드를 작성하다가

상태 머신을 구현해야할 필요가 있었다.

언젠가 수업에서 배운적이 있지만, 제대로 기억이 안나

정리를 하게 됐다.

상태 머신 (State machine)

image.png
<위키 백과>

유한 상태 기계(finite-state machine, FSM) 또는 유한 오토마톤(finite automaton, FA; 복수형: 유한 오토마타 finite automata)는 컴퓨터 프로그램과 전자 논리 회로를 설계하는데에 쓰이는 수학적 모델이다. 간단히 상태 기계라고 부르기도 한다. 유한 상태 기계는 유한한 개수의 상태를 가질 수 있는 오토마타, 즉 추상 기계라고 할 수 있다. 이러한 기계는 한 번에 오로지 하나의 상태만을 가지게 되며, 현재 상태(Current State)란 임의의 주어진 시간의 상태를 칭한다. 이러한 기계는 어떠한 사건(Event)에 의해 한 상태에서 다른 상태로 변화할 수 있으며, 이를 전이(Transition)이라 한다. 특정한 유한 오토마톤은 현재 상태로부터 가능한 전이 상태와, 이러한 전이를 유발하는 조건들의 집합으로서 정의된다. - 위키백과


다시 한번 정의

상태 기계는 상태 머신이라고도 부른다.

상태 머신에서 사용하는 용어들에 대한 설명을 먼저 한다.

상태 머신을 이루는 중요한 요소 현재 상태, 사건, 전이이다.

현재 상태(Current State)란 임의의 주어진 시간의 상태를 칭한다.

머신의 상태는 어떠한 사건(Event)에 의해

한 상태에서 다른 상태로 변화할 수 있으며,

이를 전이(Transition)이라 한다.


장점

상태 머신은 복잡한 문제를 단순화시킬 수 있다.

즉, 큰 문제들을 여러 개의 작은 문제들로 나눈다.

그래서 작은 문제에 집중할 수 있고,

프로그램이 동작하는 프로세스를 한 눈에 볼 수 있었다.


예시

나같은 경우, 로봇에 상태머신을 적용하였다.

상위 레벨에서 로봇의 상태를 체크, 관리, 상태에 따른 동작을 수행하도록 하였다.

로봇이 목적지 A까지 이동을 하여야한다.

보통 정상적으로 목적지에 도착하지만,

여러 이유로 멈춘다.

목적지에 장애물이 있다던가

벽에 부딛혔다던가

배터리가 떨어졌다던가

여러 가지 상태에 따라 특정한 동작을 수행하도록 하였다.

이렇게 상태에 따른 동작을 하게 해서

큰 문제를 작게 나눠서 풀 수 있었다.

즉,

상태 A에서 상태 B로 가는 event를 정의한다.

그 이벤트가 발생했을 때, 상태를 A에서 B로 바꾸고,

그에 따른 특정 함수를 실행한다.

그래서, 초기 상태에서 목적 상태로 갈 수 있도록 한다.


코드 작성을 위한 참고 링크

참고한 블로그가 있든데

http://boycoding.tistory.com/110
http://icecola89.blogspot.kr/2016/05/c.html

디자인 패턴 중에 상태 머신 패턴이 있다.
(디자인 패턴이란 자주 나오는 문제들을 보다 쉽게/효율적으로 해결할 수 있는 코드/아키텍쳐 디자인을 말한다.)

상황에 맞는 적절한 디자인패턴을 활용하여 코드를 작성하는 것은 코드를 보기좋고 유지관리하기에 좋다.

상태 머신 패턴을

단순히 하나의 쓰레드에서 동작시킬 것인지,

멀티 스레드 환경에서 동작하는지에 따라

고려할 것도 많고 구현할게 많아 귀찮을수있다.

나 같은 경우는 하나의 쓰레드에서만 해도 충분했다.

추후 멀티스레드 환경에서 구현하는 것도 해봐야겠다.

Sort:  

역시 이론은 어려운거 같습니다.
이론을 들으면 저게 왜 필요하나 싶은데 사실 현상을 풀이하는데 이론이 꼭 필요하지요.
그렇지 않으면 늘 땜빵식 일처리만 하게 됩니다.

저도 이론을 안좋아하는데
그냥 생각댜로 하다가
아! 여기선 이걸쓰는게 좀더 좋겠다 싶을때
찾아서 보는편이에요 ㅋㅋ

키워드만 알 수 있으면 되죠
그리고 찾고 읽고 이해하고

잘 읽었습니다. 방법론은 알겠는데 몰랐던 이론이네요 ㅎㅎ 마구리 개발자라 --;;

읽어주셔서 감사합니다 ㅎㅎ

짱짱맨 호출로 왔습니다!
한주 수고하세요
코인거래소인 고팍스에서 멋진 이벤트중이네요!
https://steemit.com/kr/@gopaxkr/100-1-1

Coin Marketplace

STEEM 0.29
TRX 0.12
JST 0.032
BTC 63042.11
ETH 3047.49
USDT 1.00
SBD 3.91