커맨드 패턴은 요청을 객체로 캡슐화하여 서로 다른 요청, 큐잉, 로깅, 취소 등의 기능을 제공할 수 있는 디자인 패턴이다.
**요청을 보낸 사람(Invoker)과 요청을 수행할 대상(Receiver)를 분리시켜, 실행 요청을 커맨드 객체로 전달한다.
대표적인 구조는 다음과 같다:
ICommand: 커맨드 인터페이스, Execute() 메서드 정의
ConcreteCommand: 실제 실행 로직을 가진 커맨드 클래스
Receiver: 실제 작업을 수행하는 클래스
Invoker: 커맨드를 실행하는 주체 (예: 버튼, 메뉴 등)
public interface ICommand
{
void Execute();
}
public class MoveCommand : ICommand
{
private Player player;
public MoveCommand(Player player)
{
this.player = player;
}
public void Execute()
{
player.MoveForward();
}
}
public class Player
{
public void MoveForward()
{
Debug.Log("플레이어 전진!");
}
}
public class InputHandler
{
private ICommand moveCommand;
public InputHandler(ICommand moveCommand)
{
this.moveCommand = moveCommand;
}
public void HandleInput()
{
if (Input.GetKeyDown(KeyCode.W))
{
moveCommand.Execute();
}
}
}
✅ 장점
요청의 캡슐화로 유연하고 확장성 있는 구조를 만들 수 있다.
요청을 큐에 저장하거나, 실행 취소 기능(Undo)을 추가하기 쉽다.
실행 로직과 호출 로직을 분리하여 결합도를 낮출 수 있다.
💡 활용 예
유니티에서 입력 시스템 처리 (키 입력 → 커맨드 등록 → 실행)
네트워크 명령 처리 (커맨드 직렬화 → 전송 → 서버에서 실행)
Undo/Redo 기능 구현 등
🤔 느낀점
평소에 직접 호출하던 동작들을 커맨드로 분리함으로써 구조가 훨씬 깔끔해졌고, 동작을 스택에 저장하거나 지연 실행할 수 있는 기반이 생겼다.
특히 네트워크나 입력 시스템처럼 변화가 잦고 확장성이 중요한 시스템에 매우 유용하다는 점을 알게 되었다.