본문 바로가기

PROGRAMMING/Design Pattern

[GoF] 데코레이터 (Decorator) 패턴 데코레이터 (Decorator) 패턴 구조 패턴 여러 객체의 참조 관계를 통해 객체의 기능을 동적으로 확장합니다. 블로그를 방문할 때 Powered by ~ 라는 글귀를 본 적이 있을 것이다. 이는 사용자가 작성했던 글이 해당 사이트에 의해 제공되었다는 의미이다. 그러므로, 지금 이 글은 'Powered by Tistory'이다. 만약 이 글이 네이버 블로그에서 작성되었다면 'Powered by NaverBlog'가 될 것이다. 사용자가 작성했던 글은 HTML로 작성된 텍스트 더미이나, 이것이 사이트로부터 제공되어지면 사이트가 가진 스타일시트(CSS)에 의해 글은 꾸며져 방문자에게 보여진다. 따라서 사용자가 작성했던 글은 같은 내용일지라도 서로 다른 사이트에 의해 다르게 꾸며진다. 여기서 사이트라는 개념..
[GoF] 컴포지트 (Composite) 패턴 컴포지트 (Composite) 패턴 구조 패턴복합 객체가 동일하게 취급할 수 있는 복수의 단일 객체에 대한 트리 구조를 형성하며, 단일 객체와 동일한 인터페이스를 클라이언트에게 제공합니다. 컴포지트(Composite)는 합성이라는 개념을 의미하는데, 컴포지트 패턴에서는 여러 객체의 합성을 제어할 수 있도록 하는 객체를 정의한다. 이것은 우리가 운영체제에서 자주 접하는 폴더와 파일의 개념에서 예로 들 수가 있다.파일은 일련의 정보를 저장하기 위한 최소의 단위이고 폴더는 다수의 파일을 관리하기 용이하도록 분류하는 네임스페이스이다. 이와 같이 둘은 서로 다른 개념이지만, 폴더는 파일과 같이 용량을 확인할 수가 있으며 파일과 달리 내부 파일들의 용량의 합을 용량으로 보여준다. 파일의 집합을 관리하는 폴더가 용량..
[GoF] 브릿지 (Bridge) 패턴 브릿지 (Bridge) 패턴 구조 패턴클래스의 구현 계층과 추상 계층을 분리하여 각자의 독립적인 변형을 용이하게 합니다. 객체 지향 프로그래밍에 있어 클래스의 상속이란 다형성의 의미 그 자체를 담는다. 그렇기에 프로그래머는 수 많은 이유로 클래스의 상속을 통해 다형성을 구현하는데, 그 이유를 분류하자면 두 가지 의미로 귀결된다: 상위 클래스의 기능을 확장하기 위해 상속하여 추상 계층을 형성하는 것과, 상위 클래스의 기능을 구현하기 위해 상속하여 구현 계층을 형성할 수가 있다. 그러나, 이 두가지 의도로 클래스를 복합적으로 상속해나갈 경우, 추상 계층과 구현 계층이 뒤섞여 확장하는데에 어려움이 발생할 것이다.그래서 브릿지 패턴은 이 두 계층을 개별적인 클래스로 나누게 되며, 교량이 두 지점을 잇듯이 추상 ..
[GoF] 프록시 (Proxy) 패턴 프록시 (Proxy) 패턴 구조 패턴사용할 객체의 제어권을 위임함으로써, 객체에 대한 클라이언트의 요청을 대신 받아 전달합니다. 프록시(Proxy) 란 대리권을 의미하는 단어로써, 프록시 패턴은 객체에 대한 제어권을 위임받는 별도의 객체를 통해 객체에 대한 클라이언트의 요청을 대리하여 수행한다. 그렇다면, 프록시는 구체적으로 어떻게 클라이언트의 요청을 대리하여 수행하는것인가?대표적으로 레스토랑의 예를 들어보겠다. 레스토랑은 고객이 요청한 음식을 셰프가 제공하는 형태의 업체이다. 하지만, 대부분의 경우에는 셰프가 직접 음식을 고객으로부터 요청받지 않고, 요리된 음식을 고객의 테이블에 가져다놓지도 않는다. 고객과 셰프 사이의 중개인으로써 웨이터가 존재한다. 웨이터는 고객으로부터 요청받은 음식을 셰프에게 전달..
[GoF] 어댑터 (Adapter) 패턴 어댑터 (Adapter) 패턴 구조 패턴클래스의 인터페이스를 클라이언트가 요구하는 인터페이스로 변환합니다. 어댑터를 통해 클라이언트는 직접적으로 호환되지 않는 클래스를 연결해서 사용할 수 있습니다. 우리는 살면서 어댑터라는 개념을 가진 물건을 한번 쯤 사용해본 적이 있을 것이다. 핸드폰을 충전할 때 사용하는 전원 어댑터, 컴퓨터와 모니터 사이에 연결하는 HDMI 어댑터 등등... 이처럼 어댑터는 서로 다른 물체를 간접적으로 연결하게 하는 역할을 가지고 있다. GoF는 이 어댑터의 개념을 소프트웨어 설계에 적용하였다.클라이언트는 클래스가 다양한 인터페이스에 대응하는것을 원하기도 하는데, 그럴 경우에 클래스에 인터페이스를 직접 구현하는것도 방법이지만, 그것은 SOLID의 개방-폐쇄의 원칙에 어긋나기도 하고 ..
GoF 디자인 패턴에 대하여 기술에 대하여 조금이라도 눈여겨보았던 사람은 국제 표준화 기구 (ISO)에 대해 한 번쯤 들어 보았을 것이다. 이는 나라마다 다른 표준을 전 세계적으로 사용하기 적합하게 함으로써 국가 간의 유연한 교환을 하도록 국제적으로 공인된 표준을 정의한다. 표준화는 불협화한 상호 간의 기준을 위하여 공용화된 소통의 수단으로써 활용된다. 소프트웨어를 만드는 프로그래머에게 있어 표준화란 매우 중요한 자리에 서 있을 것이다. 셀 수도 없이 많은 프로그래밍 언어들은 표준화된 규칙을 가지고 있고, 프로그래머는 이를 활용하기만 하면 무궁무진한 가능성을 가진 구조를 설계할 수 있다. 하지만, 소프트웨어 구조의 설계 또한 표준이 없으면 다소 모호해진다. 새로운 구조의 설계에는 수많은 방안이 요구되고, 이를 설명하는 데에도 많은 ..