본문 바로가기

PROGRAMMING/Design Pattern

[GoF] 방문자 (Visitor) 패턴 방문자 (Visitor) 패턴 행동 패턴객체 구조에 대한 알고리즘을 외부에서 정의합니다. 방문자 패턴을 통해 객체 구조를 수정하지 않고 새로운 알고리즘을 추가할 수 있습니다. 일반적으로 객체에 대한 알고리즘은 객체 안에서 구현되어 객체의 구조와 같이 정의될 수 있다. 하지만, 객체 구조와 큰 관련이 없는 알고리즘을 객체 내에서 구현한다면 객체 지향 프로그래밍에서의 단일 책임 원칙과 개방-폐쇄 원칙을 위배할 수도 있다. 그래서, 이에 대해 동일한 계열의 알고리즘군을 객체 구조 밖으로 빼내어 캡슐화할 수 있도록 방문자 패턴을 사용할 수가 있다.방문자 (Visitor) 패턴은 객체에 대한 알고리즘을 객체의 구조로부터 분리하여 방문자 객체에 구현하는 패턴이다. 방문자 패턴에서 객체는 방문자 객체에 '방문하여' ..
[GoF] 중재자 (Mediator) 패턴 중재자 (Mediator) 패턴 행동 패턴한 집합에 속하는 여러 객체들 간의 상호 작용을 중재합니다. 객체들은 대상을 직접 알지 않고도 상호 작용을 할 수 있게 됩니다. 객체 지향 프로그래밍에서의 단일 책임 원칙에 의하면, 프로그램은 책임에 따라 여러 객체로 나뉘어지고 그 객체들 간의 상호 작용을 통해 프로그램의 실질적인 구현을 수행할 수 있게 된다. 하지만, 이 객체 구조가 복잡해질 경우 그들의 참조 관계는 기하급수적으로 늘어나 관리가 매우 어려워질 것이다. 이 때, 객체 구조가 복잡해지더라도 참조 관계를 하나의 객체로 정리할 수 있도록 하는 중재자 패턴을 사용할 수 있다.중재자 (Mediator) 패턴은 상호 작용에 관련된 내용을 객체화함으로써 중재자 객체가 여러 객체들 간의 상호작용을 중재하게 된다..
[GoF] 템플릿 메서드 (Template Method) 패턴 템플릿 메서드 (Template Method) 패턴 행동 패턴알고리즘의 일부 단계를 서브 클래스로 위임하여, 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계를 재정의 할 수 있도록 합니다. 객체 지향 프로그래밍에서의 클래스는 상속을 통해 메소드를 재정의할 수 있다. 이를 통해 클래스를 상속함으로써 다른 알고리즘을 구현할 수 있는데, 이 알고리즘이 서로 비슷하다 하더라도 다시 재정의 해야만 한다. 이런 클래스의 상속에 대한 한계적인 부분을 템플릿 메서드 패턴을 통해 해결할 수 있다.템플릿 메서드 (Template Method) 패턴은 알고리즘을 템플릿화 하여, 상위 클래스에서 알고리즘의 뼈대만 정의하고 구체적인 처리는 추상화하여 상속을 통해 구현할 수 있도록 하는 패턴이다. 상위 클래스의 메서드에선 ..
[GoF] 반복자 (Iterator) 패턴 반복자 (Iterator) 패턴 행동 패턴컨테이너를 가로지르는 객체를 통해 컨테이너의 요소들을 순회할 수 있도록 해 줍니다. 일련의 데이터 집합을 저장하기 위해 사용되는 컨테이너는 크게 두가지 용도로 사용되어진다. 첫 번째는 컨테이너의 특정 요소를 검색하는 것이고, 두 번째는 컨테이너 안의 모든 요소를 순회하는 것이다. 이 순회의 방법으로는 컨테이너의 종류에 따라 다양하다.예를 들어, 일반적인 배열의 모든 요소를 순회하려 한다면 색인을 위한 정수를 하나 선언하고 반복문을 통해 값을 늘려가며 배열의 끝까지 차례대로 접근할 수 있고, 연결 리스트의 모든 요소를 순회하려 한다면 첫번째 노드에 접근하여 그 노드가 참조하는 다음 노드를 계속 접근해서 마지막 노드까지 접근하는 것으로 연결 리스트의 모든 요소를 접근..
[GoF] 전략 (Strategy) 패턴 전략 (Strategy) 패턴 행동 패턴특정한 계열의 알고리즘을 캡슐화하여 동적인 교체가 가능하도록 합니다. 전략이란 어떤 목적을 달성하기 위해 행동하는 방식을 일컫는다. 전략이란 단어를 프로그래밍적으로 해석하면 알고리즘이라 할 수도 있는데, 알고리즘은 프로그래밍에서 작업을 수행하기 위한 필수적인 요소이다.객체지향 프로그래밍에서의 객체는 요구하는 작업을 수행하기 위해 알고리즘을 사용하게 되는데, 알고리즘을 수행할 객체 안에 직접 알고리즘을 구현한다면 객체는 해당 알고리즘과 강한 결합이 생겨 알고리즘을 추가하거나 변경해야 할 경우 해당 객체를 직접 수정해야 하고, 객체가 사용하고 있는 알고리즘을 전환하기 어려우며, 다른 객체에서 동일한 알고리즘을 중복적으로 구현하게 되는 상황이 발생할 수도 있다. 그래서,..
[GoF] 해석자 (Interpreter) 패턴 해석자 (Interpreter) 패턴 행동 패턴문법을 해석할 수 있는 객체를 조합하여 구문을 특정한 문법으로 해석할 수 있도록 합니다. 윈도우 운영체제에서의 명령 프롬프트(Command Prompt)는 명령어를 입력함으로써 윈도우의 여러 작업을 수행할 수 있게 해준다. 여기서 명령어는 일련의 문자열로 구성되어진 명령 프롬프트에서 약속된 문법이다. 명령 프롬프트에 명령어를 입력하면 명령 프롬프트가 이를 해석하고 명령어에 명시된 일련의 처리 과정을 수행하게 된다. 명령어와 같이 약속된 문법을 해석하게 할 수 있는 해석자 패턴을 사용하면 클라이언트가 전달하는 구문을 해석하여 이에 대응되는 처리를 수행할 수 있도록 해 준다.해석자 (Interpreter) 패턴은 여러 객체들을 조합하여 문법을 정의할 수 있게 한..
[GoF] 상태 (State) 패턴 상태 (State) 패턴 행동 패턴객체의 다양한 상태를 객체화하여 객체가 상태에 따라 다른 행동을 할 수 있게 합니다. 어떤 객체는 조건에 따라 하나의 상태를 가져 상태에 따라 다른 행동을 할 수가 있다. 예를 들어, 어떤 게임 속 플레이어는 서 있거나, 걷거나 뛸 수 있다. 그러므로 플레이어는 이동에 대한 상태를 가질 수 있다. 그리고 플레이어가 서 있으면서 뛸 수 없듯이, 객체는 하나의 상태만 가질 수 있고, 서 있던 플레이어가 외부 입력을 통해 달리게 되듯이 객체는 상태를 바꿀 수 있다(상태 전이). 이런 객체의 형태를 유한 상태 기계(Finite-State Machine, FSM)라고 하는데, 이는 소프트웨어를 설계하는 데에 쓰이는 추상적인 모델이다.그렇다면, 이제 유한 상태 기계를 구현한 객체를..
[GoF] 명령 (Command) 패턴 명령 (Command) 패턴 행동 패턴명령을 객체의 형태로 캡슐화하여 동적으로 명령을 수행할 수 있고, 명령을 저장함으로써 명령을 지연시키거나 되돌릴 수 있게 합니다. 게임 속 플레이어를 키보드나 조이스틱을 통해 조종해 본 경험이 있을 것이다. 유저가 WASD 키를 누르거나 조이스틱을 어느 방향으로 당긴다면, 게임 속 지정된 규칙에 따라 플레이어는 움직이게 된다. 게임을 프로그래밍적인 관점으로 본다면, 외부 입력을 제어하는 부분과 플레이어를 조종하는 부분은 분명히 따로 분리되어 있을 것이다.하지만 단순히 외부 입력에서 함수를 호출함으로써 플레이어를 조종하게 하려면, 외부 입력을 제어하는 부분에선 게임 속의 특정한 플레이어(대상)를 알아야만 할 것이다. 서로 둘은 연관이 거의 없는데도 강하게 결합되어 있는..
[GoF] 관찰자 (Observer) 패턴 [GoF] 관찰자 (Observer) 패턴 행동 패턴객체가 다른 객체의 상태 변화를 구독할 수 있게 하며, 구독한 객체의 상태가 갱신될 경우 객체에게 통지하여 갱신된 상태를 활용할 수 있도록 합니다. 요즈음 다양한 게임의 유저 인터페이스(UI)를 들여다보면, 게임 내부의 상태가 변함에 따라 유저 인터페이스도 자동으로 변하는 모습을 볼 수 있다. 예를 들어, 게임이 시작된다면 게임 진행을 위한 메뉴가 보여진다던가, 플레이어의 체력이 감소하면 HP 바가 덩달아 줄어드는 등. 이 두 개념은 서로 거리가 멀어 보이는데, 유저 인터페이스는 어떻게 상태 변화를 감지하고 대응하는것인가? 대부분의 경우 관찰자 패턴을 사용하여 구현할 수 있다.관찰자 (Observer) 패턴은 관찰하고자 하는 객체에 상태가 변경 될 경우..