본문 바로가기

Design/Design Pattern

(24)
[Design Pattern] 정리 지금까지 GoF의 디자인 패턴에 나와있는 23가지의 디자인 패턴들에 대해서 알아보았다. 이번 장에서는 지금까지 알아본 디자인 패턴들을 정리해보도록 한다. GoF 디자인 패턴에서는 총 세개의 유형으로 디자인 패턴들을 정리하였다. 각 패턴에 필자가 작성한 글의 링크를 걸어두었다. 생성 패턴(Creational Pattern): 객체의 생성과 관련있다. 생성 패턴 대부분은 정확히 무엇을 생성하는지에 대한 정보 없이도 객체를 생성할 수 있도록 해준다. Factory Method Pattern Abstract Factory Pattern Builder Pattern Prototype Pattern Singleton Pattern 구조 패턴(Structural Pattern): 프로그램의 구성에 관련있다. 구조 패..
[Design Pattern] Proxy Pattern 이번 장에서는 프록시(Proxy) 패턴에 대해서 알아본다. 샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다. 프록시 패턴이란? 위키백과에 따른 정의는 아래와 같다. 일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다. 프록시는 어떠한 것(이를테면 네트워크 연결, 메모리 안의 커다란 객체, 파일, 또 복제할 수 없거나 수요가 많은 리소스)과도 인터페이스의 역할을 수행할 수 있다. 결국 어떠한 일을 수행하는 A라는 객체가 있을 때 클라이언트가 A 객체를 바로 참조하여 호출하는 것이 아니라 중간에 Proxy 객체를 두고 Proxy 객체를 통해서 참조하는 디자인 패턴이다. 프록시 패턴의 종류로는 아래와 같은 프록시들이 있다. 가상프록시: 객체의 생성을 연기하고 마치 객..
[Design Pattern] Interpreter Pattern 이번 장에서는 인터프리터(Interpreter) 패턴에 대해서 알아본다. 샘플 코드는 여기 (링크)의 프로젝트의 테스트 코드로 정리해두었다. 인터프리터 패턴이란? 위키백과에 따른 정의는 아래와 같다. 한 언어에서 문자열을 평가하는 방법을 규정하는 디자인 패턴. 기본 개념은 특화된 컴퓨터 언어에서 각 기호(종단 또는 비종단)마다 클래스를 갖는 것이다. 언어 내 한 문자열의 구문 트리는 컴포지트 패턴의 인스턴스이며 클라이언트의 문자열을 평가(해석)하기 위해 사용된다. (문이라고 작성되어 있는 부분만 이해를 돕기위해 문자열로 수정하였음) 쉽게 말해서 문자열을 해석하는 클래스를 만들어서 각 클래스들이 문자열을 평가 및 해석하는 디자인 패턴이다. 이번에는 주관식 답안지를 평가하는 프로그램을 예시로 진행해본다. 주..
[Design Pattern] Command Pattern 이번 장에서는 커맨드(Command) 패턴에 대해서 알아본다. 샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다. 커맨드 패턴이란? 위키백과에 따른 정의는 아래와 같다. 요청을 객체 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 메서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅 취소할 수 있게 하는 패턴. 명령(command), 수신자(receiver), 발동자(invoker), 클라이언트(client)의 네 개의 용어가 따른다. 커맨드 객체는 수신자 객체를 가지고 있으며, 수신자의 메서드를 호출하고 이에 수신자는 자신에게 정의된 메서드를 수행한다. 커맨드는 별도로 발동자 객체에 전달되어 명령을 발동하게 한다. 발동자 객체는 필요에 따라 명령 발동에 대한 기..
[Design Pattern] Iterator Pattern 이번 장에서는 이터레이터(Interator) 패턴에 대해서 알아본다. 샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다. 이터레이터 패턴이란? 위키백과에 따른 정의는 아래와 같다. 반복자를 사용하여 컨테이너를 가로지르며 컨테이너의 요소들에 접근하는 디자인 패턴. 반복자 패턴은 컨테이너로부터 알고리즘을 분리시키며, 일부의 경우 알고리즘들은 필수적으로 컨테이너에 특화되어 있기 때문에 불가능하다. 반복자 패턴의 본질은 기반이 되는 표현을 노출시키지 않고 연속적으로 객체 요소에 접근하는 방법을 제공하는 것이다. 다시말해 aggregate 유형에 무관한 동일 순차 접근 방법을 제공하는 것이며, 여기서 aggregate란 반복자 객체를 생성하기 위한 인터페이스를 정의하는 것이고 iterator란 요소..
[Design Pattern] Flyweight Pattern 이번 장에서는 플라이웨이트(Flyweight) 패턴에 대해서 알아본다. 샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다. 플라이웨이트 패턴이란? 위키백과에 따른 정의는 아래와 같다. 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 디자인 패턴이다. 종종 오브젝트의 일부 상태 정보는 공유될 수 있는데, 플라이웨이트 패턴에서는 이와 같은 상태 정보를 외부 자료 구조에 저장하여 플라이웨이트 오브젝트가 잠깐 동안 사용할 수 있도록 전달한다. 결국 무수히 많이 생성되어야하는 객체들(이하 주객체) 간에 공유 가능한 객체(이하 부객체)가 있다면 새로 생성하지 않고 공유하도록 하여 메모리 사용량을 낮추는 디자인 패턴이다. 단, 부객체가 주객..
[Design Pattern] Memento Pattern 이번 장에서는 메멘토(Memento) 패턴에 대해서 알아본다. 샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다. 메멘토 패턴이란? 위키백과에 따른 정의는 아래와 같다. 객체를 이전 상태로 되돌릴 수 있는 기능을 제공하는 디자인 패턴이다.(롤백을 통한 실행 취소) 메멘토 패턴은 3개의 객체로 구현된다. 오리지네이터(originator), 케어테이커(caretaker), 메멘토(memento). 오리지네이터는 내부 상태를 보유하고 있는 일부 객체이다. 케어테이커는 오리지네이터에 대해 무언가를 하지만 변경에 대한 실행 취소를 하기를 원한다. 케어테이커는 먼저 오리지네이터에게 메멘토 객체를 요청한다. 그 뒤 예정된 일련의 명령을 수행한다. 명령 이전의 상태로 되돌리기 위해 메멘토 객체를 오리지네..
[Design Pattern] State Pattern 이번 장에서는 상태(State) 패턴에 대해서 알아본다. 샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다. 상태 패턴이란? 위키백과에 다른 정의는 아래와 같다. 상태 패턴 인터페이스의 파생 클래스로서 각각의 상태를 구현함으로써, 또 패턴의 슈퍼클래스에 의해 정의되는 메소드를 호출하여 상태 변화를 구현함으로써 상태기계를 구현한다. 쉽게 풀어보면 어떠한 객체가 존재하고 객체의 상태가 존재할 때 상태를 관리하는 클래스들을 따로 분리하여 객체의 상태를 관리한다는 의미가 된다. 필자의 경우 아래의 이미지와 같이 버스의 혼잡 상태(이하 혼잡도, CrowdLevel)를 예로 알아보도록 하겠다. 버스의 혼잡도는 임의로 아래와 같이 변한다고 가정한다. 0 ~ 20명은 "여유"(CrowdLevel1), 2..