"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

★철학으로 보는 코딩

유한상태머신의 확장성 제한과 한계

허민영 2025. 4. 14. 23:17

유한 상태 기계(Finite State Machine, 이하 FSM)는 게임 및 인터랙티브 시스템에서 오랜 시간 동안 널리 사용되어 온 구조이다. 상태(State)와 전이(Transition)의 개념이 단순하고 명확하기 때문에 설계와 디버깅이 직관적이며, 특히 캐릭터의 이동, 공격, 피격, 사망 등의 고정된 행위 순서를 제어하는 데에 효과적이다. 그러나 이러한 간결함은 일정 규모 이상의 시스템에서 확장성과 구조적 유연성 측면에서 뚜렷한 한계를 드러낸다.


1. 상태의 폭발적 증가

FSM은 시스템의 모든 상태를 명시적으로 정의해야 하므로, 제어해야 할 요소가 늘어날수록 상태의 개수는 기하급수적으로 증가한다. 예를 들어, 캐릭터가 ‘점프’, ‘공격’, ‘피격’ 상태를 동시에 가질 수 있다면, FSM은 이 조합을 하나의 단일 상태로 정의해야 하며, 다음과 같은 조합이 필요하게 된다:

  • Idle
  • Jumping
  • Attacking
  • JumpingAndAttacking
  • AttackingWhileHit
  • JumpingWhileHit
  • JumpingAttackingWhileHit
    ...

이처럼 상태 조합이 복합적일 경우, 이를 명시적으로 관리하는 방식은 비효율적일 뿐만 아니라 유지보수도 어렵다. 이는 FSM의 구조적 약점 중 하나이며, 보통 상태의 *직렬성(serialization)*에 의존한 설계는 다중 행위의 병렬성을 다루는 데에 적합하지 않다.


2. 전이 조건의 분산화

FSM에서는 상태 간 전이를 명시적으로 정의하고, 각 전이는 특정 조건을 기준으로 트리거된다. 이때 전이 조건이 복잡해질수록 해당 로직은 각 상태 객체나 전이 정의 내에 분산되기 쉽다. 결과적으로 상태 간의 의존 관계가 많아지고, 전이 로직을 변경하거나 확장하려면 다수의 상태 정의를 수정해야 하는 경우가 생긴다. 이는 다음과 같은 문제를 야기한다:

  • 캡슐화 실패: 상태별 전이 조건이 외부 로직에 의해 과도하게 침범될 수 있다.
  • 조건 재사용 불가: 동일한 조건이 여러 상태 전이에 사용될 경우에도 이를 공유하기 어렵다.
  • 상태 그래프의 난해함: 조건이 퍼져 있는 전이 그래프는 시각적으로나 논리적으로 파악하기 어려워진다.

3. 동적 상태 처리의 한계

게임 내에서는 플레이 도중에 새로운 상태가 등장하거나, 일시적으로 비정형적인 상태가 필요한 경우가 발생한다. 예를 들어, 캐릭터가 특정 보스를 만났을 때만 사용할 수 있는 ‘공포 상태’가 존재한다면, FSM의 구조상 이를 사전에 정의하지 않으면 대응이 불가능하다. 이처럼 런타임 상태 추가나 조건 기반 활성화 같은 유연한 처리가 FSM에서는 구조적으로 제한된다.

또한 FSM은 상태를 *단일 활성 상태(single active state)*로 가정하는 경우가 많다. 다중 상태 동시 활성화가 필요한 경우에는 FSM 본연의 모델을 벗어나 복잡한 커스텀 구조를 덧붙여야 하며, 이는 결국 FSM의 장점이었던 단순성과 예측 가능성을 상실하게 만든다.


4. 상태 의존성과 테스트 복잡도 증가

FSM 기반 설계에서는 상태가 행위의 기준점이 되기 때문에, 특정 기능이나 반응을 테스트하기 위해서는 해당 상태로의 진입 조건부터 모두 충족시켜야 한다. 즉, 테스트 코드 또는 디버깅 중 상태를 인위적으로 변경하기 어려우며, 각 테스트는 종종 이전 상태로부터의 정확한 전이 흐름을 필요로 한다. 이는 다음과 같은 문제로 연결된다:

  • 테스트 자동화의 복잡성 증가
  • 디버깅 중 임의 상태 설정이 불안정
  • 유닛 테스트보다 통합 테스트에 의존

결론: FSM의 적합성과 한계

FSM은 단순하고 고정된 상태 전이가 중심인 시스템에 적합하다. 예를 들어, 게임의 초기화 흐름, 메뉴 UI 상태 전환 등에서는 여전히 훌륭한 구조다. 그러나 다음과 같은 경우에는 FSM의 사용을 지양하거나, 보완이 필요하다:

  • 복수 상태가 병렬적으로 작동해야 하는 경우
  • 상태가 조건 기반으로 유동적으로 결정되어야 하는 경우
  • 런타임 확장이 자주 요구되는 경우
  • 전이 조건의 재사용성과 조합이 필요한 경우

이러한 한계를 극복하기 위한 대안으로는 비트플래그 기반의 상태 시스템, 컴포넌트 기반의 행위 모듈화 등이 있다. 특히 최근에는 Utility AI, StateStack, Condition Graph 등의 방식이 FSM의 한계를 보완하거나 대체하기 위한 구조로 각광받고 있으며, 실시간 게임 로직에서의 상태 표현 방식은 점점 더 선언적이고 조건 중심적인 방식으로 진화하고 있다.