학습
Lua 상태 머신 구현
Lua 상태 머신 구현 — 중급
상태 머신 구현
1. 도입 (왜 배워야 하는가)
상태 머신은 프로그램이 다양한 상태를 관리하고 전환하는 데 매우 유용한 패턴입니다. 게임 개발, UI 애플리케이션, 네트워크 프로토콜 등에서 상태 전환을 명확하고 간결하게 처리할 수 있습니다. 예를 들어, 게임 캐릭터의 행동 상태(걷기, 뛰기, 점프하기 등)를 관리할 때, 상태 머신을 사용하면 각 상태에서 수행할 행동을 쉽게 정의하고 전환할 수 있습니다.
반면, 상태 머신을 모르면 복잡한 조건문과 플래그를 사용하여 상태 전환을 처리해야 하므로 코드가 복잡해지고 유지보수가 어려워집니다. 이는 버그를 유발하고, 코드의 가독성을 떨어뜨려 팀워크에 악영향을 미칠 수 있습니다.
2. 핵심 개념 설명
상태 머신(State Machine)은 프로그램의 상태와 상태 전환을 모델링하는 구조입니다. 주요 개념은 다음과 같습니다.
- 상태(State): 시스템의 특정한 상황을 나타냅니다. 예를 들어, 게임 캐릭터의 상태는 '대기', '이동', '공격' 등이 될 수 있습니다.
- 전이(Transition): 한 상태에서 다른 상태로의 변화입니다. 예를 들어, '대기' 상태에서 '이동' 상태로 전이할 수 있습니다.
- 이벤트(Event): 상태 전이를 유발하는 외부 요인입니다. 사용자의 입력이나 시간 경과 등이 이벤트가 될 수 있습니다.
| 용어 | 설명 |
|---|---|
| 상태 | 시스템의 특정한 상황 |
| 전이 | 한 상태에서 다른 상태로의 변화 |
| 이벤트 | 상태 전이를 유발하는 외부 요인 |
3. 기본 코드 예제
다음은 간단한 상태 머신의 기본 구조를 구현한 Lua 코드입니다.
-- 상태 머신 구현
StateMachine = {}
StateMachine.__index = StateMachine
function StateMachine:new()
local sm = {
currentState = nil,
states = {}
}
setmetatable(sm, StateMachine)
return sm
end
function StateMachine:addState(name, state)
self.states[name] = state
end
function StateMachine:setState(name)
if self.states[name] then
self.currentState = self.states[name]
self.currentState:enter()
end
end
-- 상태 정의
IdleState = {}
IdleState.__index = IdleState
function IdleState:enter()
print("대기 상태에 들어갔습니다.")
end
function IdleState:exit()
print("대기 상태를 떠났습니다.")
end
-- 상태 머신 사용
local sm = StateMachine:new()
sm:addState("idle", IdleState)
sm:setState("idle")
실행 결과:
대기 상태에 들어갔습니다.
코드 한 줄씩 동작 설명:
StateMachine클래스를 정의합니다.StateMachine:new()함수는 새로운 상태 머신 객체를 생성합니다.StateMachine:addState()는 상태를 추가하는 메서드입니다.StateMachine:setState()는 현재 상태를 변경하고, 해당 상태의enter()메서드를 호출합니다.IdleState클래스를 정의하고,enter()메서드에서 대기 상태에 진입했음을 출력합니다.- 마지막으로 상태 머신을 생성하고 'idle' 상태를 설정합니다.
- 게임 캐릭터의 상태 관리:
- UI 애플리케이션의 상태 관리:
- 네트워크 프로토콜 관리:
- 상태를 올바르게 초기화하지 않음:
- 전이를 위한 이벤트 처리를 누락함:
- 상태 머신은 복잡한 상태 전환을 효율적으로 관리할 수 있는 구조입니다.
- 각 상태와 전이를 명확히 정의하면 코드의 가독성과 유지보수성이 향상됩니다.
- 실전에서는 게임, UI, 네트워크 프로토콜 등 다양한 분야에서 활용됩니다.
4. 실전 활용 예제
게임 캐릭터는 여러 상태(대기, 이동, 공격)를 가질 수 있습니다. 각 상태마다 수행해야 할 행동을 정의하여 상태 머신을 통해 상태를 전환하면, 코드가 간결해지고 유지보수가 쉬워집니다.
복잡한 UI 애플리케이션에서 화면 전환이나 버튼 클릭에 따라 여러 UI 상태를 관리할 수 있습니다. 각 상태에 따른 UI 요소를 상태 머신으로 관리하면, 사용자 경험이 개선됩니다.
네트워크 통신에서 연결, 데이터 전송, 종료 등의 상태를 정의하고, 각 상태에서 수행할 작업을 명확히 하여 안정적인 통신을 구현할 수 있습니다.
5. 흔한 실수와 주의사항
잘못된 코드:
sm:setState("unknown")
올바른 코드:
sm:setState("idle")
잘못된 코드:
function IdleState:exit() end
올바른 코드:
function IdleState:exit()
print("대기 상태에서 나갑니다.")
end
6. 정리
다음에 학습하면 좋은 주제는 이벤트 처리와 콜백입니다. 상태 머신과 결합하여 더욱 유연한 프로그램을 만들 수 있습니다.