본문 바로가기
C++ Practice

C++ 디자인 패턴 - 상태 패턴(State Pattern)

by Srff5123 2024. 8. 9.
728x90

1. 상태 패턴

1. 상태(State)

            정의 : 객체의 상태를 나타내는 인터페이스 또는 추상 클래스이다. 상태에 따라 객체의 행동이 달라진다.

            특징 : 상태에 따라 행동을 다르게 구현하고, 객체의 상태 전환을 관리한다.

 

2. 상태를 구현한 서브 클래스

            정의 : State 인터페이스를 구현하여 구체적인 상태를 정의한다.

            특징 : 각 서브클래스는 상태에 따라 다르게 행동

 

3. 컨텍스트(Context)

            정의 : 현재 상태를 관리하고, 상태 객체에 위임하여 행동을 수행한다.

            특징 : 상태 객체를 보유하고 상태에 따라 동작을 위임

 

 

2. 코드 구현 예제

 

게임 개발에서는 다양한 상태가 있는 객체를 다룬다. 게임 캥릭터는 여러 가지 상태를 가질 수 있다,

예를 들어 Idle, Running, Attacking, Jumping 등. 각 상태에 따라 캐릭터의 행동이 달라지므로 상태

패턴을 사용하여 이를 효과적으로 관리가 가능하다.

 

   1. 상태 인터페이스 정의

                         State : 상태를 정의하는 인터페이스로, hadleInput() 메서드는 상태에 따른 입력 처리를 정

 

    2. 구체적인 상태 클래스 정의

                        IdleState, RunningState, AttackingState, Jumping : State 인터페이스를 구현하여

                        캐릭터의 각각의 상태를 정의한다. 각 상태는 handleInput() 메서드를 구현하여 상태에 따른

                        입력 처리를 수행한다.

                             

3. 컨텍스트 클래스 정의

                      

                         Character : 현재 상태를 유지하고, 상태에 따라 handleInput() 메서드를 호출하여 동작을 수행

                         상태 전환은 SetState() 메서드를 통해 이루어진다.

 

4. 사용 예제

                       Main() : Character 객체를 생성하고 다양한 상태 객체를 설정하여 handleInput() 메서드를

                       호출한다. 상태에 따라 캐릭터의 동작이 다르게 나타납니다.

 

5. 상태 패턴의 장점

 

              1. 유연한 상태 관리

                       상태를 객체로 캡슐화하여 상태에 따른 행동을 유연하게 관리할 수 있습니다. 새로운 상태를 추가하거나                             기존 상태를 변경할 때, 기존 코드에 영향을 미치지 않고 상태 객체만 수정할 수 있다.

            

              2. 코드의 응집성 향상

                       상태와 관련된 동작을 상태 객체 내부에 구현하여 코드의 응집성을 높입니다. 상태 객체가 자신의 행동을

                       책임지므로, 상태 변경 로직이 컨텍스트 클래스에서 분리된다.

 

              3. 상태 전환의 용이성

                       상태 전환을 객체 간의 전환으로 구현하여, 상태 전환이 간단하고 명확하게 처리 된다. 상태 변경 로직을 

                       클라이언트 코드에서 분리하여 관리가 가능하다.

              4. 확장 용이

                       새로운 상태를 추가하거나 기존 상태를 변경하는 것이 쉬워진다. 새로운 상태를 추가할 때 단순히 새로운

                       상태 클래스를 추가하고, 필요한 동작을 구현한다.  

 

6. 상태 패턴의 단점

              1. 코드 복잡성 증가

                       상태 패턴을 사용할 때, 상태가 많아지면 그에 따라 많은 상태 클래스가 필요하기에  코드의 복잡성을 증가                           시킬 수 있다. 이는 프로젝트의 유지보수와 이해를 어렵게 만들 가능성이 있다.

 

              2. 상태 전환의 복잡성 

                       상태 간의 전환 로직이 복잡해질 수 있다. 특히, 상태 전환의 조건에 따라 복잡하게 얽혀 있을 경우,

                       이를 관리하고 이해하기 어려울 수 있다.

 

              3. 상태 객체의 생성 비용 증가

                       상태 객체를 동적으로 생성하고 관리해야 하므로, 객체 생성 비용이 발생할 수 있다. 특히, 상태 전환이

                       빈번하게 일어나는 경우 성능에 영향을 주어 시스템의 성능이 저하 될 수있고, 메모리의 사용량이 증가한다.

     

              4. 상태 관리의 분산

                       상태 관리 로직이 여러 상태 클래스에 분산될 수 있으며, 이로 인해 코드의 응집성이 떨어질 수 있다.

                       또한 상태에 따라 행동을 수정할 경우 여러 클래스에서 변경을 해야 할  수 있다.

 

              5. 상태 객체 간의 의존성

                        상태 객체 간에 의존성이 생길 수 있으며, 상태 객체가 서로 참조하거나 의존하는 경우 문제가 발생한다.

                        상태 전환 시 복잡한 의존성 문제를 초래하며, 이로 인해 코드의 이해와 유지보수가 어려워진다.

728x90