캐릭터의 움직임 기능을 개발 하던 중 앉기 걷기 공격대기중 달리기 등의 여러 상황에서 상황에 따라 움직이는 속도, 회전할때 몸의 기울기, 회전속도 등 각기 다른 디테일한 움직임을 주기로 결정했습니다.
각 기능들에서 걷기가 아닐때 공격대기중이 아닐때 등으로 처리하면 당장은 쉽지만
기능들이 커지고 다양해지면 각각 상태에 따른 조건이 얽히고 설켜서 ifelse 지옥이 펼쳐질 수 있습니다..
이때 상태 패턴(State Pattern)을 적용하면 이런 문제점을 어느정도 미연에 방지할 수 있습니다.
상태 패턴 ( State Pattern )


상태 패턴 적용
간단하게 적용해보면 현재 상태에 따라 각기 다른 기능을 사용하도록 분리시킬 수 있습니다
class Player(){
State PlayerState;
void Move() {
switch(State)
{
case Idle : IdleMove();
break;
case Run : RunMove();
break;
}
}
}
하지만 본래 취지에 맞게 사용자가 if나 switch문 없이 직관적으로 동작하도록 상속에 따른 기능 캡슐화를 도입할 수 있습니다
class Player(){
State* pPlayerState;
void Move() {
pPlayerState->Move();
}
}
이런 경우 인터페이스 혹은 추상클래스로 State를 만들어두고 그 클래스를 상속받는 형태의 기능들을 만들어서 구현할 수 있습니다

class State(){
virtual void Move() = 0;
}
class IdleState() : public State {
void Move() override { IdleMove기능 }
}
class RunState() : public State {
void Move() override { RunMove기능;}
}

해당 상태들은 소유권을 여러명이 갖고 있을 필요가 없으니 관리할 컨트롤러에서 unique_ptr을 사용하여 생성하면 자원 관리에 도움이 될 수 있습니다.
상태 변경 시 상태 진입, 탈출 함수를 만들어두고 탈출->변경->진입 하도록 작성하면 상태 변경마다 작동하는 기능을 도입할 수 있습니다.