1. 상태 패턴이란? 🤔

상태 패턴(State Pattern)은 객체가 상태에 따라 다른 동작을 하도록 설계하는 디자인 패턴입니다. 객체의 내부 상태를 캡슐화하고, 상태 전환 시 행동이 달라지도록 구현할 수 있습니다. 이를 통해 코드의 복잡도를 줄이고 유지보수성을 높일 수 있습니다.

출처: 위키


2. 상태 패턴의 구성 요소

상태 패턴은 다음 세 가지 주요 구성 요소로 이루어져 있습니다:

  1. Context: 상태를 관리하는 주체로, 상태 변경에 따라 동작을 위임합니다.
  2. State: 상태를 나타내는 인터페이스로, 구체적인 행동을 정의하는 메서드가 포함됩니다.
  3. ConcreteState: 특정 상태를 구현한 클래스입니다. 각 상태마다 서로 다른 동작을 제공합니다.

3. 상태 패턴 예제 💻

Unity3D에서 게임 캐릭터의 무기 상태(예: 기본 무기, 활, 마법지팡이)를 상태에 따라 다르게 처리하는 예제를 만들어 보겠습니다.

// State 인터페이스 정의
public interface IWeaponState
{
    void Attack();
}

// ConcreteState: 기본 무기 상태
public class DefaultWeaponState : IWeaponState
{
    public void Attack()
    {
        Debug.Log("기본 무기로 공격합니다.");
    }
}

// ConcreteState: 활 상태
public class BowState : IWeaponState
{
    public void Attack()
    {
        Debug.Log("활로 원거리 공격을 합니다.");
    }
}

// ConcreteState: 마법지팡이 상태
public class MagicWandState : IWeaponState
{
    public void Attack()
    {
        Debug.Log("마법지팡이로 마법 공격을 합니다.");
    }
}

// Context 클래스 정의
public class Character
{
    private IWeaponState _currentWeaponState;

    public Character()
    {
        _currentWeaponState = new DefaultWeaponState(); // 초기 상태 설정
    }

    public void SetWeaponState(IWeaponState newWeaponState)
    {
        _currentWeaponState = newWeaponState;
        Debug.Log("무기가 변경되었습니다.");
    }

    public void Attack()
    {
        _currentWeaponState.Attack();
    }
}

// Unity에서 사용 예
public class CharacterController : MonoBehaviour
{
    private Character _character;

    void Start()
    {
        _character = new Character();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            _character.SetWeaponState(new DefaultWeaponState());
        }
        else if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            _character.SetWeaponState(new BowState());
        }
        else if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            _character.SetWeaponState(new MagicWandState());
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            _character.Attack();
        }
    }
}

4. 상태 패턴의 사용 시 고려할 점 📌

  1. 상태 추가 용이성: 새로운 상태를 추가할 때 기존 코드를 수정하지 않고 새로운 클래스만 추가하면 됩니다.
  2. 상태 전환 관리: 상태 간 전환이 많아질 경우 복잡도가 증가할 수 있으므로 설계를 잘해야 합니다.
  3. 적용 범위: 상태 패턴은 상태가 명확히 구분되고, 행동이 상태에 따라 크게 달라질 때 적합합니다.

5. 결론 ✅

상태 패턴은 객체의 행동을 상태에 따라 다르게 구현할 때 유용합니다. Unity3D와 같은 게임 개발에서는 캐릭터의 무기 상태 관리, AI 상태 전환 등에 자주 사용됩니다. 적절히 활용하면 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.


6. 관련 링크 🔗

반응형

+ Recent posts