본문 바로가기

디자인 패턴

[디자인 패턴_Again] Composite Pattern. 컴포지트 패턴을 이용하면 객체들을 트리구조로 구성하여 계층구조로 나타낼 수 있습니다. 중요한 것은 트리구조에서 자식이 있는 노드와 자식이 없는 노드를 구분하지 않고 마치 하나처럼 사용 할 수 있다는 것입니다. 자식이 있는 것을 노드라고 부르고, 없는 것을 리프(leaf)라고 부르겠습니다. 컴포지트 패턴에서는 노드와 리프가 하나의 추상 클래스를 상속받습니다. 노드와 리프를 하나처럼(똑같은 방법) 다루기 위함이죠.. 이 말은 뒤에서 다시 언급해보겠습니다. 쇼핑몰을 위해서 카테고리를 만들려고 합니다. 일단 제일 상위에 "전체 카테고리"가 존재하고 그 밑으로 "의류"와 "전자제품" 카테고리가 있습니다. 그리고 "의류" 밑에는 "점퍼" 라는 하위 카테고리가 존재합니다. public abstract class Ca.. 더보기
[디자인 패턴_Again] Iterator Pattern. 각각의 콜렉션 객체에 대해서 for문이나 뭐 이런식으로 콜렉션안에 들어가 있는 객체들을 참조 할 수 있지만, Iterator를 사용하면 소스의 구분없이 컬렉션안의 객체들을 참조 할 수 있습니다. 예를 들어서 ArrayList를 사용해서 객체를 관리하는 프로그램과 (혹은 클래스) 배열을 사용해서 객체를 관리하는 프로그램(혹은 클래스) 두개가 있는데.. 이 두개를 합치는 경우를 생각해 보면 ArrayList와 배열에 대해서 각각 참조하고 있는 객체의 리스트를 얻기 위해서는 각 클래스에 맞는 형식으로 순환문을 돌려야 합니다. ArrayList라면.. for(int i = 0; i < list.size(); i++) { ... list.get(i); ... } 배열이라면 for(int i = 0; i < 배열... 더보기
[디자인 패턴_Again] Template Method Pattern. 이번에 정리 할 패턴은 템플릿 메소드 패턴입니다. 이 패턴은 팩토리패턴이나 싱글턴 패턴과 함께 일반적으로 상당히 많이 사용되는 패턴입니다. 템플릿이라는 그 이름 그대로 상위 클래스에서 알고리즘을 규약하고 일부 공통된 메소드를 직접 구현하여 가지고 있으며, 하위 클래스에서 처리 해야 할 메소드를 추상 메소드로 가지고 있습니다. 한번 예제를 들어보겠습니다. 검색 엔진에서는 검색을 할 수 있도록 데이터 소스에 접근하여 데이터를 읽어오고, 이를 색인하고 최적화의 단계를 거쳐 색인 파일을 완성합니다. 그런데 이 데이터 소스라는 것이 DB일수도 있고, 파일들 일 수도 있을 것입니다. 아무튼, 데이터 소스가 다르고 파일을 읽어오는 것이 다르다는 것만 제외하면 아래와 같은 절차를 가질 것 입니다. 1. 데이터소스에 접.. 더보기
[디자인 패턴_Again] Adapter and Facade Pattern. 이번에 정리 해 볼 패턴은 어댑터 패턴과 퍼사드 패턴입니다. 어댑터 패턴은 하나의 클래스를 다른 클래스로 변경해주는 역할을 합니다. 이게 무슨 말인고하니.. 플러그를 생각해보겠습니다. 구멍이 두개짜리가 우리가 쓰는 것이고, 유럽에서는 동그란 구멍두개와 네모 모양의 구멍이 하나있는 플러그를 사용합니다. 여기서 중간에 어댑터를 사용하여 국산 전자 제품도 유럽에서 사용 할 수 있습니다. (물론 정격전압이 같아야 합니다 -_-) 이런 역할을 해주는 것이 어댑터 패턴입니다. 바로 예제 코드를 보겠습니다. import java.util.Enumeration; import java.util.Iterator; public class EnumAdapter implements Iterator { Enumeration en.. 더보기
[디자인 패턴_Again] Command Pattern. 이 패턴은 요청을 한 녀석과 요청을 처리하는 녀석을 완전히 분리시키는 패턴입니다. 즉, 명령어 그 자체를 하나의 클래스로 만들어서 요청을 처리하는 녀석과 요청을 하는 녀석의 중간 고리를 느슨하게 만드는 역할을 하는겁니다. 실생활에서 비슷하게 예를 들만한 것이 멀티리모컨이 있을 것 같습니다. 요즘 리모컨은 하나의 리모컨에 TV, DVD, 케이블, 비디오등 여러개의 장치들을 하나의 리모컨에서 작동 시킬 수 있도록 만들어져 나옵니다. 물론, DVD나 TV등 각각의 고유한 동작들도 있겠지만 전원 on, off와 같은 장치의 종류에 상관없이 공통적으로 동작하는 명령도 있습니다. 이런 것을 명령어 자체를 하나의 인터페이스로 규약을 정해 놓고 (실행해야 하는 메소드가 어떤 것인지만 알고 있으면..) 요청측과 처리측을.. 더보기
[디자인 패턴_Again] Singleton Pattern. 너무나 잘 알려진 패턴입니다. 단 하나의 인스턴스를 유지하는 것입니다. 아마 현장에서도 가장 많이 쓰이고 있는 패턴 중 하나가 아닐까 싶습니다. 생성자를 private으로 선언하여 다른 클래스에서 이 클래스의 객체를 직접 생성시키지 못 하게 하고, static 으로 선언 된 자기 자신의 객체를 넘겨주는 메소드를 만들어 이미 생성되어 있는 자기 자신의 객체를 넘겨주는 방식입니다. public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return i.. 더보기
[디자인 패턴_Again] Factory Pattern. - (3) - Abstract Factory Pattern 추상 팩토리 패턴입니다. 이것은 팩토리를 추상화하여 사용하는 방법입니다. 여기서는 각 나라의 햄버거와 샌드위치를 모두 함께 판매하는 total-store를 만들기로 했습니다. 컨셉은 각나라의 햄버거/샌드위치 공장에서 햄버거와 샌드위치를 만들어서 가져와 파는 것입니다. 이것을 전체적인 패턴을 추상 팩토리 패턴으로 구현해보겠습니다. 일단 샌드위치와 햄버거를 생산 할 공장의 인터페이스를 정의하겠습니다. public interface ProductFactory { public Hamburger createHamburger(); public Sandwich createSandwich(); } 추상 팩토리 패턴에서는 추상화된 공장과 추상화된 상품이 존재합니다. 위의 코드.. 더보기
[디자인 패턴_Again] Factory Pattern. - (2) - Factory Method Pattern. 이번에 정리 할 내용은 팩토리 메소드 패턴이네요.. 여기서 중요한 것도 역시 변화되는 부분을 따로 캡슐화 시킨다는 것입니다. 전 세계적으로 프랜차이즈를 하고 있는 햄버거집이 있습니다. 햄버거를 만드는데는 절차가 필요합니다. 재료를 준비하고 - 패티를 굽고 - 패티,빵,야채를 조합하고 - 포장을 합니다. 이 순서는 전세계 어디서나 똑같이 적용됩니다. 하지만 나라별로 그 나라 사람들의 기호에 따라서 햄버거의 재료에 조금씩 차이가 있습니다. 예를들어 중국은 돼지고기와 밀빵 케첩을 사용하고 한국은 한우와 쌀빵 머스터드소스를 사용합니다. 미국은 닭고기와 밀가루빵 마요네즈를 사용합니다. (물론 실제로 저렇지는 않죠.. -_-) 하지만, 햄버거를 만드는 절차 자체는 모든 프.. 더보기
[디자인 패턴_Again] Factory Pattern. - (1) - 팩토리 패턴은 싱글턴 패턴과 함께 이미 상당히 널리 쓰이고 있는 디자인 패턴입니다. 이 팩토리 메소드 패턴에는 3가지 유형이 있습니다. 헤드퍼스트 디자인 패턴의 글을 인용해보면 심플팩토리와 추상 팩토리 패턴 그리고 팩토리 메소드 패턴입니다. 이 책에서는 엄격히 얘기하면 심플 팩토리는 패턴은 아니라고 합니다.. 하지만 아마 가장 많이 쓰이는 방식이 이 심플 팩토리가 아닐까 싶습니다. 그래서 팩토리 패턴은 3번에 나눠서 내용을 정리하려고 합니다. 하나에 전부 정리하려니 은근 빡세서요 -_-; 일단 심플 팩토리 먼저 정리해보겠습니다. 이 패턴은 추상화를 이용합니다. 그래서 하나의 구현 클래스에 집중되어 있는 의존도를 끊어버리는 것이죠. 결국 "나는 상세 구현 클래스가 무엇인지는 관심없다." 입니다. 아래와 같.. 더보기
[디자인 패턴_Again] Decorator Pattern. 데코레이터 패턴은 상속과 위임을 이용한 패턴입니다. 하나의 객체를 장식하듯이 감싸고, 자신이 장식하고 있는 객체에게 행동을 위임합니다. 우선은 다시 와우로 돌아가서, 임의로 캐릭터를 하나 생성한다고 가정해보겠습니다. 직업을 고르고, 그 캐릭터에게 입힐 기본적인 방어구셋을 정합니다. 그러면 그 방어구에 따라서 캐릭터의 방어도가 결정되지요.. 물론 이 캐릭터도 기본적인 방어도는 가지고 있습니다. 이것을 단순히 상속만을 이용해서 구현하려고 해보겠습니다. public abstract class Character { String desc; public String getDesc() { return desc; } public abstract int def(); } ----------------------------.. 더보기