[Design Pattern] 상태 패턴 (State Pattern)

2025. 4. 17. 23:51·Design Pattern

1. 상태 패턴

상태 패턴은 상태가 하나의 클래스가 되어

해당 상태일 때 각 동작들을 어떻게 처리할지 정의하고

다른 클래스는 상태에 의존하여 각 행동(격발, 스왑, 재장전)의 역할을 위임하는 패턴을 의미한다.

 

2. 상태 패턴은 언제 사용될까?

switch(CurrentState)
{
    case Idle: // ...
    case Attacking: // ...
    case Reloading: // ...
    case Stunned: // ...
    case Rolling: // ...
    case Aiming: // ...
}

위는 상태 분기 방식의 코드이다.

상태가 적을 경우 코드가 간단하여 빠르게 구현 가능하며

디버깅 시 상태별 분기가 한 곳에 모여 있어 추적하기 쉽다.

 

그러나 상태가 많아질수록 switch나 if-else 블록이 커지고 가독성이 저하될 수 있다.

 

상태가 많아지고

상태별 처리해야할 로직들이 많아진다면 상태 패턴을 고려해 볼 수 있다.

 

3. 상태 패턴 구조

class DoorState
{
public:
     virtual void Open(Door& door) = 0;
     virtual void Close(Door& door) = 0;
}
class OpenState : public DoorState
{
public:
    virtual void Open(Door& door) override
    {
    	// "이미 문이 열려 있습니다."
    }
    
    virtual void close(Door& door) override
    {
    	// "문을 닫았습니다."
        door.setState(new CloseState());
    }
}
class CloseState : public DoorState
{
public:
    virtual void Open(Door& door) override
    {
    	// "문을 열었습니다."
        door.setState(new OpenState());
    }
    
    virtual void close(Door& door) override
    {
    	// "이미 문이 닫혀 있습니다."
    }
}
class Door
{
public:
    Door()
    { 
        State = new CloseState();
    }

    void SetState(DoorState NewState)
    {
        State = NewState;
    }
    
    void Open() 
    {
        State->Open();
    }
    
    void Close() 
    {
        State ->Close();
    }

private:
	UDoorState*  State;
}
{
	...
    Door door;
    
    door.Open(); // 문을 열었습니다.
    door.Open(); // 이미 문이 열려있습니다.
    door.Close(); // 문을 닫았습니다.
    door.Close(); // 이미 문을 닫았습니다.
}

 

  • 상태가 주체가 되어 (클래스가 되어) 상태의 따른 행동을 정의한다.
  • 각 상태별 행동에 따른 로직을 구분할 수 있다
  • 다른 클래스(Door)는 상태 클래스(DoorState)에 의존하여 각 행동을 처리한다.

'Design Pattern' 카테고리의 다른 글

[Design Pattern] 옵저버 패턴  (0) 2025.04.15
[Design Pattern] 커맨드 패턴 (Command Pattern)  (0) 2025.04.14
[Design Pattern] 퍼사드 패턴 (Facade)  (0) 2025.04.11
[Design Pattern] 프록시 패턴 (Proxy Pattern)  (0) 2025.04.10
[Design Pattern] 어댑터 패턴 (Adapter Pattern)  (0) 2025.04.09
'Design Pattern' 카테고리의 다른 글
  • [Design Pattern] 옵저버 패턴
  • [Design Pattern] 커맨드 패턴 (Command Pattern)
  • [Design Pattern] 퍼사드 패턴 (Facade)
  • [Design Pattern] 프록시 패턴 (Proxy Pattern)
DevColIn
DevColIn
복잡함을 단순하게
  • DevColIn
    심플한 코딩생활
    복잡함을 단순하게
  • 전체
    오늘
    어제
    • 전체보기 (223)
      • Unreal 부트캠프 (49)
        • TIL (34)
        • 사전캠프 (7)
        • 본캠프 (8)
      • Unrael (10)
        • 환경설정 (0)
        • Basic (19)
        • Component (5)
        • GAS (GameplayAbilitySystem) (3)
        • AI (2)
        • Implement (10)
        • UI (1)
        • Error (1)
        • Network (2)
        • Tip (1)
      • Level Design (5)
      • Math (1)
      • Design Pattern (16)
      • Computer Science (2)
        • Network (1)
        • Database (1)
      • Algorithm (79)
        • Basic (4)
        • Practice (74)
      • C++ (4)
        • Basic (4)
      • Tool (0)
      • Game (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    게임동기화
    DesignPattern
    Design Pattern
    Animation
    Algorithm
    본캠프
    gas
    소프트 레퍼런신
    basic
    KPT회고
    unreal
    component
    Til
    디자인패턴
    내일배움캠프
    사전캠프
    c++
    퀘스트
    하드 레퍼런싱
    레벨디자인
    AI
    액터
    actor
    tsoftobjectptr
    Implement
    unrealengine
    GameplayEffect
    알고리즘
    assetmanager
    디자인 패턴
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
DevColIn
[Design Pattern] 상태 패턴 (State Pattern)
상단으로

티스토리툴바