본문 바로가기

카테고리 없음

Chapter 06 커맨드 패턴

1. 커맨드 패턴의 정의

 

- 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화화 할 수 있다. 이러면 요청을 큐에 저장하거나  로그로 기록하거나 작업 취소 기능을 사용할 수 있다.

 

객체 마을하니 또 오브젝트, 객체지향의 사실과 오해가 생각난다. 협력을 잘하려면 메시지를 잘 전달하기만 하면 각 객체들은 그들의 역할에 따라, 책임을 완수하면 된다. 메시지를 보내는 객체는 받는 객체가 어떻게 책임을 수행하는지 신경쓸 필요가 없다.

 

2. 커맨드 패턴의 구성

 

커맨드 패턴은 Invoker, Receiver, Command(인터페이스), Command 구현체(예를 들면 "컴퓨터를 켠다" 같은) 로 이뤄져 있다.

 

  Client는 Invoker와 Receiver, Command 구현체에 의존성을 가지고 있고,  Invoker를 통해 어떤 "Command 구현체"를 실행(excute())할 것인지 정하고 (setCommand()) Receiver를 통해 실행(action() , 컴퓨터에는 켠다, 끝다 같은 것들이 있다.)한다.

 

 

3. 커멘드 패턴에서 undo 기능 추가

 

커멘트 패턴에 undo 기능 추가는 매우 쉽다. Command 구현체에 이전 실행 command를 담는 변수를 하나 만들어주고, execute() 메서드를 실행할 때, 어떤 명령이 실행됐는지 저장한다.

 

 

4. 매크로 커맨드 만들기

 

매크로(한번에 많은 명령) 커맨드를 만드는 것도 매우 쉽다. Command 배열을 만들어서 동작시킬 Command 구현체들을 넣어놓고 순회하며 실행시키면 된다.

예를 들면 Command[] macroAction = { command1, command2 ...};

 

 

5. 요청을 큐에 저장하기

"커맨드로 컴퓨테이션(computaion)의 한 부분(리시버와 일련의 행동)을 패키지로 묶어서 일급객체 형태로 전달할 수도 있습니다."

 

나는 이 문장이 이해가 되지 않았다.

 

첫번째, 컴퓨테이션의 뜻을 몰랐다.

두번째, 일급객체가 생소하게 다가왔다.

 

그래서 채찍pt에게 물어봤습니다.

 

 

더보기

=======================================================================================

1. 커맨드(Command)라는 개념

  • 커맨드 패턴에서 커맨드 객체는 "요청을 객체 안에 캡슐화"합니다.
  • 즉, 어떤 행동(메서드 호출)과 그것을 수행할 대상(리시버, Receiver)을 하나의 객체 안에 담는 것이죠.

2. computation의 한 부분

  • "computation"은 말 그대로 계산, 처리 과정이라는 뜻인데, 여기서는 "프로그램이 실행하는 동작의 일부"라고 보면 됩니다.
  • 예를 들어 "전등 켜기"라는 동작이 있다면:
    • 리시버(Receiver): 실제 전등 객체
    • 일련의 행동: turnOn() 메서드를 실행하는 것

즉, 어떤 동작을 실행하기 위해 필요한 요소(누구한테, 어떤 동작을 할지)를 묶어서 말하는 거예요.


3. 패키지로 묶는다

  • 커맨드 패턴에서는 리시버와 그 동작을 하나의 커맨드 객체 안에 넣습니다.
  • 예:여기서 LightOnCommand가 바로 "리시버(light) + 행동(turnOn)"을 묶은 패키지입니다.
     
     
public class LightOnCommand implements Command {
    private Light light; // 리시버 
    
    public LightOnCommand(Light light) {
    	this.light = light; 
    }
    
    @Override
    public void execute() {
    	light.turnOn(); // 일련의 행동 
    } 
}
더보기

4. 일급 객체(First-class Object)

  • 일급 객체란: 변수에 담을 수 있고, 메서드의 인자로 넘길 수 있고, 메서드에서 반환할 수 있는 객체를 말합니다.
  • 커맨드 객체는 단순한 데이터가 아니라 "동작(실행 방법)"까지 들고 있으므로, 행동 자체를 값처럼 전달할 수 있게 해줍니다.

즉, "버튼에 행동을 붙인다", "리스트에 행동들을 모아둔다", "나중에 실행할 행동을 큐에 담아둔다" 같은 게 가능해집니다.


5. 정리

결국 이 문장은:
👉 "커맨드 패턴을 쓰면, 어떤 행동을 할 객체(리시버)와 그 행동을 하나의 객체로 감싸서 값처럼 전달할 수 있다. 즉, '행동' 자체를 일급 객체로 다룰 수 있다."

 

 

6. 마치며

커멘드 패턴은 어디에 쓸 수 있을까? 바로 생각나지 않는다. 하지만 공부해두면 언젠간 써먹을 수 있을 것 같다.