Part 3 행동 패턴

  • 반복자 패턴
  • 명령 패턴
  • 방문자 패턴
  • 체인 패턴
  • 감시자 패턴
  • 중재자 패턴
  • 상태 패턴
  • 메멘토 패턴
  • 템플릿 메서드 패턴
  • 전략 패턴
  • 인터프리터 패턴

디자인 패턴은 크게 3개의 파트로 나뉘어 있습니다. 세 번째로 알아볼 패턴은 행동 패턴입니다. 행동 패턴은 객체의 행위가 어떻게 목적을 수행하는지에 대해 알아봅니다.

책임

객체는 상태state와 행위behavior라는 두 개의 특징을 갖고 있습니다. 객체지향은 목적을 수행하기 위해 관련 있는 상태와 행위를 하나로 묶어서 처리합니다. 그리고 이를 객체라고 합니다.

상태는 객체가 갖고 있는 속성을 말하며 행위는 객체가 갖고 있는 기능을 의미합니다. 또 객체는 하나의 목적을 해결하기 위해서 다수의 객체로 분리되고 서로 유기적인 연관 관계를 가집니다.

행동 처리

객체는 어떤 처리를 해야 하는 책임을 갖고 있으며 그 책임을 객체에 할당합니다. 정확한 책임 할당과 설계는 프로그램을 보다 효율적으로 동작하고 유지할 수 있게 하므로 객체에 책임을 할당하고 정의하는 것은 중요합니다.

객체에 행동이 할당될 경우 객체 간 상호 교류가 발생합니다. 객체지향에서 유기적으로 서로 연관된 객체를 제어하는 것은 쉽지 않습니다. 객체들은 상호 작용을 위해 객체의 정보가 포함된 데이터 구조를 필요로 합니다. 행동 패턴은 객체의 상호작용을 위해 연결하는 방법을 규정하는 것이며, 객체의 제어 구조를 패턴화해 객체 간 상호 작용을 해결합니다.

행동 분리

절차적 방식과 달리 객체지향은 책임이 여러 객체로 분산돼 있습니다. 규모가 있는 프로그램을 단 하나의 객체로 설계하지는 않습니다. 만일 하나의 객체로 프로그램이 설계된다면 절차적 방식의 프로그램과 다르지 않습니다.

객체지향은 분산을 통해 하나의 객체에 역할을 집중하지 않고, 다수의 객체들과 함께 책임을 분담합니다. 예전에는 객체지향이 상속을 통해 분산을 처리했습니다만, 행동 패턴에서는 상속보다 복합 구조를 통해 객체의 책임을 분산합니다.

객체의 행동이 분산됐을 때 어떻게 서로 연결하고 제어해야 하는가가 문제입니다. 각각의 객체는 분산된 행위를 호출하기 위해 서로 참조 가능한 참조자를 갖고 있는데, 객체는 참조자를 통해 서로 의존 관계를 유지하고, 객체 간 관계를 같이 관리합니다.

추상화

객체 행위는 크게 공통된 연산operation과 공통되지 않은 연산으로 구별할 수 있습니다. 행동 패턴은 객체에서 변화 가능한 부분이 어디인지 찾아냅니다. 그리고 변화되는 부분과 변화되지 않는 부분을 추상화로 분리합니다.

추상화를 통해 행위를 분리하는 목적은 객체의 다형성을 부여하기 위해서입니다. 다형성은 계속 변경되고 유사한 행동들에 대해 쉽게 객체를 정의할 수 있습니다. 공통된 연산은 추상 클래스에 정의하고, 공통되지 않은 연산은 하위 클래스로 구현을 요청합니다.

알고리즘

행동 패턴은 추상화로 객체의 책임을 분리합니다. 또한 추상화는 다형성을 적용해 유사한 행위들을 독립적인 객체로 캡슐화합니다.

추상화를 통해 하위 클래스로 분리하는 것과 달리 별도의 객체로 책임을 캡슐화합니다. 행위를 별도의 객체로 분리할 때 기존 객체는 복합 객체로 변경됩니다. 복합 객체는 분리된 객체의 참조값을 가지며 참조를 통해 객체의 의존 관계를 형성합니다. 이렇게 분리되는 객체는 알고리즘 형태로 대체됩니다.

분리된 객체의 참조값은 매개변수를 통해 전달하거나 별도의 setter 메서드를 통해 설정할 수 있습니다. 이때 기존 객체에는 의존 관계인 외부 객체를 제어하는 로직이 필요합니다.

패턴

행동 패턴은 다른 패턴보다 종류가 많은데, 행위를 추상화하는 방법에 따라 10가지로 분류됩니다.

반복자 패턴

학습하기

반복자 패턴은 집합체를 통해 객체의 원소를 순회하여 처리합니다. 또한 객체의 반복 접근을 위해 인터페이스를 제공하고 순회 방법을 캡슐화합니다.

명령 패턴

학습하기

명령 패턴은 객체의 행위를 직접 요청하지 않으며 캡슐화된 행위 객체를 전달하여 동작을 수행합니다.

방문자 패턴

학습하기

방문자 패턴은 객체의 데이터 구조와 처리를 분리합니다. 양방향 참조를 통해 분리된 객체 행위를 수행합니다.

체인 패턴

학습하기

체인 패턴은 객체의 요청을 사슬 고리 형태로 연결합니다. 객체는 자신의 동작이 완료될 때 내부적으로 연결된 객체에 다음 행위를 위임합니다. 한 번의 객체 호출로 여러 객체의 행위를 수행할 수 있습니다.

감시자 패턴

학습하기

감시자 패턴은 상태 변화가 있을 때 직접 처리하지 않습니다. 변화에 대한 행위를 독립된 객체로 분리하고 상태를 통보합니다. 수신자는 전달 받은 상태의 객체를 호출합니다.

중재자 패턴

학습하기

중재자 패턴은 상호 연결된 객체를 그룹화하고 객체 사이의 프로토콜을 캡슐화하는 등 분산된 객체의 역할을 조정합니다.

상태 패턴

학습하기

상태 패턴은 조건에 따른 행동을 독립 객체로 캡슐화하고, 상태값에 따라 의존된 객체의 행동을 호출하는 형태로 제어 구조를 개선합니다.

메멘토 패턴

학습하기

메멘토 패턴은 스냅숏을 활용해 객체 상태를 스택에 저장하고, 스택에 저장된 객체는 복구를 통해 이전 상태로 되돌릴 수 있습니다.

템플릿 메서드 패턴

학습하기

템플릿 메서드 패턴은 객체의 행위를 단계적으로 분리합니다. 추상화를 통해 공통된 단계와 공통되지 않은 단계를 분리함으로써 다양한 로직을 처리합니다.

전략 패턴

학습하기

전략 패턴은 객체의 행위를 독립적인 알고리즘 객체로 분리합니다. 분리된 객체를 전달함으로써 내부의 행위를 다양하게 변경하여 처리합니다.

인터프리터 패턴

인터프리터 패턴은 언어의 문법 규칙을 나타내는 클래스들을 정의하고, 이들을 사용하여 언어로 표현된 문장을 해석하고 실행하는 패턴입니다.

학습하기

서브목차