개요

State 패턴은 객체의 상태에 따라 행동이 달라지는 시스템을 설계하는 방법입니다. 상태를 Enum(열거형)으로 정의하고, 상태에 따라 각기 다른 로직이나 동작을 수행하도록 구성합니다. 이는 코드의 가독성과 유지보수를 높이고, 상태 변화가 명확하게 드러나도록 설계하는 데 매우 유용합니다.

문제점 및 필요성

  1. Boolean의 한계
    이전 방식에서는 상태를 Boolean 변수로 관리했습니다. 하지만 상태가 많아질수록 Boolean 변수의 개수가 증가하고, 복잡성이 크게 높아집니다. 예를 들어, Attack, Jump, Move와 같은 상태를 각각 Boolean으로 표현하면 상태 간 충돌 가능성이 커지고, 상태를 관리하기 어려워집니다.

  2. 독립적인 상태 관리
    상태들은 서로 독립적인 존재로 유지되어야 하지만, Boolean 변수로 관리하면 상태 간 의존성이 발생하기 쉽습니다. 예를 들어, Attack 상태일 때 이동을 제한하려면 여러 Boolean 값을 조건문으로 확인해야 하며, 이는 코드의 유지보수를 어렵게 만듭니다.

State 패턴 설계

State 패턴은 Enum 타입을 사용하여 명확한 상태 전환을 제공합니다.

1. Enum 타입 정의

상태를 열거형(Enum)으로 정의합니다.

Idle, Move, Skill

각 상태는 특정 행동을 나타냅니다. 예를 들어, Idle은 움직이지 않는 상태, Move는 이동 중인 상태, Skill은 스킬을 사용하는 상태를 의미합니다.

2. State 변수 추가

상태를 저장하기 위한 변수를 생성합니다. 이는 Enum 타입으로 선언되며, 현재 객체가 어떤 상태에 있는지를 나타냅니다.

3. State 설정 및 갱신

키 입력, 조건문 등을 통해 상태를 변경합니다.

  • 방향키 입력 시 Move 상태로 전환.
  • 공격 키 입력 시 Skill 상태로 전환.
  • 아무 입력도 없으면 Idle 상태로 전환.

4. 상태 기반 동작 수행

상태에 따라 특정 Flipbook(애니메이션) 또는 동작을 설정합니다.

  • Switch on Enum 노드를 사용해 각 상태에 따라 다른 Flipbook을 적용합니다.
  • Select 노드를 사용해 코드의 중복을 최소화하고 효율성을 높입니다.

5. 갱신 루프

상태 변경은 Event Tick 또는 명시적인 함수 호출을 통해 지속적으로 감지되고 업데이트됩니다. 예를 들어:

  • 이동 중 방향이 바뀌거나
  • 공격 애니메이션이 끝날 경우 상태를 자동으로 갱신합니다.

코드 개선 및 최적화

  1. Switch on Enum
    상태를 Switch로 처리하여 각 상태에 맞는 행동을 쉽게 정의합니다.
    예를 들어, Idle 상태에서는 기본 애니메이션을 재생하고, Move 상태에서는 방향키에 따라 다른 애니메이션을 재생합니다.

  2. Select 노드 활용
    중복된 Set Flipbook 코드를 최소화하기 위해 Select 노드를 사용합니다. 이는 상태와 매핑된 Flipbook을 반환하도록 설정되며, 코드의 길이를 줄이고 가독성을 높입니다.

  3. Enum 확장성
    새로운 상태(예: Jump, Dash)가 추가되어도 Enum과 Switch 문만 확장하면 됩니다. Boolean 방식보다 훨씬 유연합니다.

장점

  • 가독성 증가: 상태가 명확하게 정의되고, 상태 전환 로직이 간결합니다.
  • 유지보수성 향상: 새로운 상태 추가 시 코드의 영향을 최소화할 수 있습니다.
  • 확장성 증가: Enum 타입을 확장하는 것만으로 새로운 상태를 추가할 수 있습니다.

단점

  • 복잡성 증가: 간단한 프로젝트에서는 오히려 불필요한 복잡성을 도입할 수 있습니다.
  • 초기 설계 부담: 상태와 동작을 명확히 정의해야 하므로 초기 설계 시간이 소요됩니다.

profile
李家네_공부방

0개의 댓글