1. 상태 패턴이란? 🤔
상태 패턴(State Pattern)은 객체가 상태에 따라 다른 동작을 하도록 설계하는 디자인 패턴입니다. 객체의 내부 상태를 캡슐화하고, 상태 전환 시 행동이 달라지도록 구현할 수 있습니다. 이를 통해 코드의 복잡도를 줄이고 유지보수성을 높일 수 있습니다.
2. 상태 패턴의 구성 요소
상태 패턴은 다음 세 가지 주요 구성 요소로 이루어져 있습니다:
- Context: 상태를 관리하는 주체로, 상태 변경에 따라 동작을 위임합니다.
- State: 상태를 나타내는 인터페이스로, 구체적인 행동을 정의하는 메서드가 포함됩니다.
- 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. 상태 패턴의 사용 시 고려할 점 📌
- 상태 추가 용이성: 새로운 상태를 추가할 때 기존 코드를 수정하지 않고 새로운 클래스만 추가하면 됩니다.
- 상태 전환 관리: 상태 간 전환이 많아질 경우 복잡도가 증가할 수 있으므로 설계를 잘해야 합니다.
- 적용 범위: 상태 패턴은 상태가 명확히 구분되고, 행동이 상태에 따라 크게 달라질 때 적합합니다.
5. 결론 ✅
상태 패턴은 객체의 행동을 상태에 따라 다르게 구현할 때 유용합니다. Unity3D와 같은 게임 개발에서는 캐릭터의 무기 상태 관리, AI 상태 전환 등에 자주 사용됩니다. 적절히 활용하면 코드의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.
6. 관련 링크 🔗
반응형
'Workspace > Design Pattern' 카테고리의 다른 글
브리지 패턴 (Bridge Pattern): 구조를 분리해 유연성을 극대화하기 (0) | 2025.01.22 |
---|---|
컴포지트 패턴 (Composite Pattern): 객체를 트리 구조로 구성하여 복잡성을 줄이기 (0) | 2025.01.22 |
플라이웨이트 패턴 (Flyweight Pattern): 메모리 절약을 위한 객체 재사용 설계 (0) | 2025.01.22 |
템플릿 메서드 패턴 (Template Method): 알고리즘 뼈대를 정의하는 패턴 (0) | 2025.01.22 |
미디에이터 패턴 (Mediator Pattern): 객체 간의 복잡한 상호작용을 단순화하기 (0) | 2025.01.22 |