State 패턴


[네이버 지식백과]state 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 한빛아카데미(주))


스테이트 패턴은 좀 헷갈리는 부분이 있습니다. 대부분의 패턴은 if 문과 같이 버그를 유지보수나 버그를 양산하기 쉬운 코드를 없애고 확장하기 쉽게 하도록 구조를 가져갑니다. 이중 스테이트 패턴은 각 상태가 바뀔 때 마다 늘어나는 if문을 없애는 패턴입니다. 즉 상태들 끼리 서로의 상태를 바꿔가며 동작하기 때문에 유지보수도 쉽고 확장도 용이합니다. 그러나 상태변화에 대한 명확한 이해와 구조를 어떻게 가져가야 할지에 대한 고민이 필요합니다. 

다소 생소하게 보일지 모르지만 한번 구현해 보도록 하겠습니다.

예제는 아주 단순한 불을 끄고 켜고하는 기능을 스테이트 패턴으로 구현해 보았습니다. 실제로 구동해 본 코드는 아니기 때문에 이해만 하시고 직접 구현하실 때는 반드시 테스트를 거친 후 적용 바랍니다. 

먼제 헤더입니다. 불완전 선언(구조체 전방선언)으로 되어있습니다. 구조체 두개가 서로를 참조하기 때문입니다. 우선 상태 구조체와 콘크리트 구조체 두가지가 있습니다.

light는 두가지의 상태를 가지고 있습니다. on/off 상태에 따라 처리하는 부분이 달라지게 됩니다. 아울러 on ->off 상태로 변해야 하고 off -> on 상태로도 변해야 합니다. 상태가 두가지 이기 때문에 if문으로 구현해도 쉽지만 상태가 더 많은 경우에는 if문이 더 많아 지겠지요? 

다음 코드는 light.c 코드 입니다. 아래 코드에서는 먼저 light 를 만들어 주고 현재 상태를 assign해줍니다. 그리고 명령에 따라 현재 assign되어 있는 상태의 on/off를 실행 시키게 됩니다. 현재 default는 light off 네요.


헷갈리지 않게 먼저 main function 부터 볼까요? 단순 합니다. light를 assign 해주고 켰다 껐다를 반복해 줍니다. 예를 들어 light->on(); 을 해주면 결과적으로 현재 state의 on function을 실행하게 됩니다. 


이제 on/off가 어떻게 스위칭 되는지 state 쪽 코드들을 보도록 하겠습니다. 먼저 state_on.c 파일입니다. 

get_state_on() 은 현재 on state를 리턴합니다. 그리고 light->on을 하면 결과적으로 state_on 함수가 실행됩니다. 실제로 불빛을 끄고 싶으시면 GPIO를 내리든가 올리든가 해서 끄면 되겠지요? 만약 light->off 하면 불빛을 끄고 light의 상태를 off로 바꿔줍니다. 

어느정도 state_off.c가 예상됐으리라 생각됩니다. 아래 코드를 보시겠습니다.

state on 과 거의 비슷하지요? 마찬가지로 state off상태에서 state on을 해주면 light의 state를 on으로 변경해주게 됩니다. 

상태는 상태 function에서 알아서 바꿔주기 때문에 if문이 필요없게 됩니다. 지금의 예제는 두개의 상태로 되어있는 경우로 되어 있지만 오히려 상태가 많은 경우나 늘어나는 경우에 위의 패턴은 힘을 발휘하게 됩니다.















'▶ 이전글 > C Pattern' 카테고리의 다른 글

Strategy 패턴  (0) 2014.10.02
Observer 패턴  (0) 2014.10.02
C로 Class 억지로 만들기  (1) 2014.10.02
typedef의 활용 함수포인터  (0) 2014.10.02
자바의 객체와 C의 구조체  (0) 2014.10.02