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

[C++/디자인패턴] 커맨드 패턴 (Command Pattern) 본문

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

[C++/디자인패턴] 커맨드 패턴 (Command Pattern)

파워꽃게맨 2024. 1. 29. 15:01

1. 개요

커맨드 패턴은 행동 디자인 패턴 중 하나로, 행동을 객체화 하는 것이 목표입니다.

 

명령을 인터페이스로 하여 하위에 구체적인 명령을 재정의합니다.

명령들을 객체로 캡슐화해서 사용할 수 있도록 하는 패턴을 뜻합니다.

 

2. 기본 구조

커맨드 패턴은 이벤트가 발생했을 때 실행될 기능이 다양하면서도 변경이 필요한 경우 유용합니다.

예를들어 게임에서 캐릭터에게 단축키 설정을 할 수 있는 경우가 있죠.

 

WASD로 기본적으로 이동할 수 있지만,

사용자에 따라서 IJKL 로 이동하고 싶은 사람도 있을테니 말이죠.

 

또, 여러 커맨드를 조합하여 하나의 커맨드처럼 사용해야할 때, 커맨드 실행 취소 및 재실행 등의 기능을 구현해야 할 때 유용합니다.

 

 

이런 식으로 코딩하는 것을 막는 디자인 패턴이죠.

 

3. 예제

 

이렇게 최상위 PlayerCommand 인터페이스를 만들고

 

 

하위 클래스를 이런 방식으로 정의합니다.

 

 

그리고 플레이어는 해쉬맵을 이용해서

어떤 키를 누르면 어떤 함수를 호출할지만 정의해주면 됩니다.

 

Update에서는 계속 command 를 탐색하면서 키가 눌렸는지 안눌렸는지 체크하기 때문에

키를 바꾸고 싶으면 플레이어 내부에서 키를 바꿔주고

특정 커맨드를 추가하려면

커맨드 인터페이스를 상속받아서 커맨드를 만들고

플레이어 단에 추가해주시면 되겠습니다.

 

 

4. 장점과 단점

장점)

클래스 간의 결합도를 낮춰준다.

새로운 커맨드를 쉽게 추가하거나 수정할 수 있다.

 

5. 커맨드 패턴 vs 전략 패턴

이 2개의 패턴이 어느정도 비슷해보입니다.

 

커맨드 패턴은 명령을 객체로 다뤄

기능 실행을 요구하는 호출자와 실제 기능을 실행하는 수신자 클래스 사이의 의존성을 제거하는 패턴이고

 

전략패턴은 행위의 수정이 필요할 경우

전략을 바꾸는 것으로 행위의 수정이 가능하게 만드는 패턴입니다.

 

사실 이 둘의 쓰임새는 매우 비슷하며, 사실 거의 차이가 없다고 보시면 됩니다.

차이는 사용법에서 나타납니다.

 

커맨드 패턴은 다양한 명령 중 무엇을 골라서 사용할 것이냐,

전략 패턴은 하나의 명령을 실행하는 데 어떤 알고리즘(전략)으로 실행할 것이냐

라고 생각하고 사용하시면 될 것 같습니다.