개발하는 리프터 꽃게맨입니다.

[C++/디자인패턴] 상태 패턴 (State Pattern) 본문

기타 개발 지식/디자인패턴

[C++/디자인패턴] 상태 패턴 (State Pattern)

파워꽃게맨 2024. 1. 28. 23:07

상태 패턴

1) 개요

스테이트 패턴은 객체가 특정 상태에 따라 다른 기능을 구현할 때,

객체가 자기 상태에 따라 행위를 호출하는 것이 아니라,

상태를 객체화하여 상태가 행동을 할 수 있도록하는 패턴을 말합니다.

 

2) 기본 구조

예를들어 게임 캐릭터가 있다고 상상해봅시다.

게임캐릭터는 대기, 점프, 달리기, 웅크리기 총 4개의 상태를 가지고 있다고 하고

각각 상태에 따라 공격을 구현해봅시다.

 

 

그런데 이 코드에는 단점이 있습니다.

만약 캐릭터가 공격뿐만 아니라

공격, 방어, 스킬 총 3개의 동작이 존재한다고 하면

 

case처리만 12개로 늘어나 버립니다.

여기서 상태도 늘어나버린다면, 코드가 더욱 복잡해지겠죠?

그래서 이 때 사용하는 것이 스테이트 패턴입니다.

 

3) 예시

 

이런 식으로 상태를 객체화해서 상태가 행동을 할 수 있도록 역할을 위임합니다.

 

이런 식으로 구성하면 코어 플레이어 클래스는 CallAttack 이란 함수를 호출하여

간단하게 상태에 따라 다른 공격 함수 호출할 수 있게 됩니다.

 

4) 기타

상태 변화가 적은 경우에는 그냥 Switch 문으로 처리하는게 오히려 더 좋을 수 있습니다.

 

5) 장단점

 

장점

(1) 단일 책임의 원칙에 부합한다.

하나의 클래스는 하나의 책임을 가질수록 OOP 지향적인 프로그래밍입니다.

위 코드를 보면 상태에 따라 코드의 분기를 Player단에서 하지 않고,

한 상태가 자신에 대한 처리만 할 수 있도록 구분해두고 있습니다.

 

이럴 경우 각 상태 로직에 대한 수정이 용의하고 가독성이 높아지죠.

 

(2) 개방-폐쇄의 원칙에 부합한다.

상태를 확장하기 위해서는 새로운 추가 상태 클래스를 만들기만하면 됩니다.

확장에 용이하고 굳이 Player 코드는 건들일필요가 없습니다.

 

(3) 유지 보수, 테스트 디버깅에 있어서 유리하다.