디자인 패턴

    CHAPTER 13.실전 디자인 패턴

    이번 글에서는해당 챕터에서는 실제 디자인 패턴을 적용하는 방법에 대해서 학습합니다.패턴 카탈로그에 대해 학습한뒤 가장 훌륭한 패턴 카탈로그 저서인 GoF 디자인 패턴의 서술 방식을 살펴봅니다.디자인 패턴에서 사용되는 전문 용어를 살펴봅니다.디자인 패턴을 분류하는 방법들에 대해서 학습합니다.안티 패턴에 대해서 알아봅니다.패턴 카탈로그(GoF 템플릿) 살펴보기패턴 카탈로그는 아래와 같이 이루어져 있습니다.title(제목)Intent(용도)Motivation(동기)Applicablity(적용 대상)Strcture(구조)Participants(구성 요소)Collaboartions(협동)Consequences(결과)Implementation/SampleCode(구현 및 샘플 코드)Know Uses(사용 예)Rel..

    CHAPTER 12.복합 패턴

    복합 패턴이란?문제를 해결하기 위해 개발할 때는 효율적인 코드를 작성하기 위해 디자인 패턴을 고민하고 적용합니다.이때 하나의 디자인 패턴만을 사용하지 않고 여러 패턴을 복합적으로 사용하여 문제에 대한 해결을 시도 하는 것을 복합 패턴이라고 합니다. 복합 패턴 적용하기전략 패턴에서 사용했던 오리 예제를 다시 한 번 사용하여 예제를 진행하겠습니다.이전에는 오리 문제를 전략패턴만 사용해서 적용했지만 이번에는 새로운 문제를 예제 중간에 지속적으로 제안하고 문제 해결을 위한 디자인 패턴을 적용하도록 해보겠습니다.public interface Quackable { public void quack(); }오리가 소리를 내는 행동을 정의하는 Quackable 인터페이스입니다.public class MallardDuck..

    CHAPTER 11.프록시 패턴

    프록시 패턴이란?프록시 패턴의 특정 객체로의 접근을 제어하는 대리인을 제공하는 디자인패턴입니다.프록시 패턴을 사용하면 생성하기 힘든 객체 또는 보안이 중요한 객체와 같이 접근을 제어하는 대리인 객체를 만들 수 있습니다.프록시 패턴을 사용하게 되면 가상 프록시를 사용해서 생성하기 힘든 자원으로의 접근을 제어할 수 있으며 보호 프록시를 사용해서 접근 권한이 필요한 자원의 접근을 제어할 수 있습니다.프록시 패턴의 종류1. 원격 프록시원격 프록시는 원격 개체의 로컬 대변자 역할을 수행하는것을 의미합니다.로컬 대변자란 어떤 메소드를 호출하면 다른 원격 객체에게 그 메소드 호출을 전달해주는 객체를 로컬 대변자라고 합니다.클라이언트 객체는 원격 객체가 가지고 있는 메소드를 호출 하는것처럼 행동합니다. 하지만 실제로로..

    CHAPTER 10.상태 패턴

    상태 패턴 이해를 위한 간단한 문제 제안어릴때 문방구에서 위와 같은 뽑기 기계를 보신 경험이 있을것입니다.뽑기 기계를 만드는 CEO가 작은 컴퓨터 칩을 넣을건데 작은 칩에서 뽑기 기계가 동작할 수 있는 SW시스템을 구성하고 싶다고 의뢰가 들어왔습니다.CEO는 위의 그림과 같은 플로우로 SW를 만들어달라고 요청했습니다.상태를 확인해보면 아래 처럼 4가지의 상태로 구분할 수 있습니다.public class GumballMachine { final static int SOLD_OUT = 0; //알맹이 품절 final static int NO_QUARTER = 1; //동전미 보유 상태 final static int HAS_QUARTER = 2; //동전 보유 상태 final static int SOLD = ..

    CHAPTER 09.반복자 패턴과 컴포지트 패턴

    반복자 패턴 이해를 위한 간단한 문제 제안PancakeHouseMenu라는 식당과 DinerMenu라는 식당이 있습니다. 두 식당은 별개의 식당입니다.우연히 두 식당은 식당을 합치기로 했고 이 과정에서 서로 메뉴를 수정하기 싫어하는 신경전이 펼쳐지게 됩니다. 메뉴 수정이 다른 이유는 아래처럼 PancakeHouseMenu식당과 DinerMenu 식당의 구현 방법이 다르기 때문입니다.public class PancakeHouseMenu implements Menu { ArrayList menuItems; // DinerMenu와 달리 PancakeHouseMenu는 배열을 통해 메뉴를 구현 public PancakeHouseMenu() { menuItems = new ArrayList(); addItem(..

    CHAPTER 08.템플릿 메소드 패턴

    템플릿 메소드 패턴 이해를 위한 간단한 문제 제안우리는 개발을 하다보면 비슷한 메소드에 비슷한 로직을 작성할 때가 있습니다.특히 아래와 같은 상황은 개발자들에게 최적화에 대한 욕망과 갈증을 뿜뿜하게 됩니다.스타버즈 커피 만드는 법물을 끓인다.끓는 물에 커피를 우려낸다.커피를 컵에 따른다.설탕과 우유를 추가한다.스타버즈 홍차 만드는 법물을 끓인다.끓는 물에 찻잎를 우려낸다.홍차를 컵에 따른다.레몬을 추가한다. 두 개의 레시피를 살펴보면 재료만 다르지 행동은 비슷한다는걸 알 수 있습니다.따라서 위의 레시피를 문맥 그대로 코드로 녹여낼 경우 반복적인 코드가 탄생할 것입니다.템플릿 메소드 패턴은 예시처럼 비슷한 로직을 템플릿화 하여 코드의 퀄리티를 높여주는 디자인 패턴입니다. 템플릿 메소드 패턴을 적용해보기위 ..

    CHAPTER 07.어댑터 패턴과 퍼사드 패턴

    어댑터 패턴 이해를 위한 간단한 문제 제안해외 직구를 통해 전자 제품을 구매했다고 가정하겠습니다.각 나라별로 사용되는 어뎁터 소켓이 다르기 때문에 변환기가 필요할 것입니다.일본은 110V를 사용하고 우리나라는 220V를 사용하는것이 예시가 될 수 있습니다.객체지향 코드에서도 위와 같은 비슷한 문제가 발생할 때가 있습니다.객체 인터페이스가 달라서 사용하지 못하는 경우가 예시가 될 수 있습니다.오리 인터페이스에 비슷한 칠면조 객체를 동작하도록 하고 싶은 문제 상황이라 가정해보겠습니다.이럴 경우 어댑터 패턴을 사용해 어떻게 해결하는지 살펴보겠습니다.어댑터 패턴을 사용하여 문제 해결해보기public interface Duck { public void quack(); public void fly(); }먼저 오리..

    CHAPTER 06.커멘드 패턴

    커멘드 패턴 이해를 위한 간단한 문제 제안필자는 고객의 요구사항에 의해서 만능 IOT 리모컨을 만들려고 합니다.리모컨에는 아래와 같은 방식으로 만들려고 해요!그림을 보면 7개의 기능들이 각 슬롯마다 매핑되어야 하는것을 알 수 있습니다.문제는 각 기능들의 공통된 인터페이스가 없다라는 상황입니다.예를 들어 ON의 첫 번째 버튼은 TV의 관련 기능이고 두 번째는 선풍기 전원이라고 가정하겠습니다.TV의 기능 ON에는 TV가 켜진순간 볼륨도 켜져야하고 채널의 최초 번호수도 결정되어야 합니다.선풍기는 ON 되는 순간 방향의 세기가 결정되어야 합니다.이처럼 공통 인터페이스가 없는 경우 위의 사진처럼 여러 클래스가 난잡해지는 문제가 발생합니다.하물며 고객은 나중에 다른 제품이 추가될 수 있게 확장성 있는 개발을 원합니..

    CHAPTER 05.싱글톤 패턴

    1.싱글톤 패턴이란싱글톤 패턴은 클래스 인스턴스를 하나만 만들고, 하나만 만든 인스턴스로의 전역 접근을 제공하는 패턴입니다.싱글톤 패턴 구현public class Singleton { private static Singleton uniqueInstance; // other useful instance variables here private Singleton() {} public static Singleton getInstance() { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } // other useful methods here }코드를 살펴보겠습니다.먼저 Singleton 클래스의 ..

    CHAPTER 04.팩토리 패턴

    팩토리 패턴 이해를 위한 간단한 문제 제안피자를 만드는 아래와 같은 코드가 있다고 가정해보겠습니다.public class PizzaStore { public Pizza orderPizza(String type) { Pizza pizza; if (type.equals("cheese")) { pizza = new CheesePizza(); } else if (type.equals("pepperoni")) { pizza = new PepperoniPizza(); } else if (type.equals("clam")) { pizza = new ClamPizza(); } else if (type.equals("veggie")) { pizza = new VeggiePizza(); } pizza.prepare();..

    CHAPTER 03.데코레이터 패턴

    데코레이터 패턴 이해를 위한 간단한 문제 제안 2022년 스타버즈 커피는 커피 브랜드를 대표하는 브랜드로 성장해있습니다. 1971년 스타버즈는 지금처럼 회사가 커질줄 몰랐고 메뉴도 지금처럼 많지 않았습니다. 사업을 시작할 무렵에는 아래와 같은 설계 구조로 이뤄져 있습니다. Beverage는 음료를 나타내는 추상클래스입니다. 매장에서 판매되는 모든 음료는 이 클래스의 서브클래스가 됩니다. Beverage의 cost()메소드는 추상 메소드입니다. 서브클레스에서는 이 메소드를 구현해야합니다. Beverage의 description이라는 인스턴스변수는 각 서브클래스에서 설정되며 커피에 대한 설명 정보가 문자열로 저장됩니다. description이라는 변수 정보는 getDescription() 메소드를 통해 정보..

    CHAPTER 02.옵저버 패턴

    옵저버 패턴 이해를 위한 간단한 문제 제안 독자에게 기상 조건인 온도, 습도, 기압 3가지의 변화를 감지하는 시스템을 만들라는 요구사항이 들어옵니다. 위의 3가지 항목들은 실시간으로 갱신되야 합니다. 디스플레이를 손쉽게 추가할 수 있어야 합니다.이 기기는 다른 추가사항 또한 바로 넣을 수 있도록 확장 가능해야 합니다. 요구 사항을 좀 더 자세히 설명해보겠습니다. 저희들이 구현해야하는 것은 WeatherData 객체입니다. 가상 스테이션은 습도, 온도, 기압 센서로부터 데이터를 받습니다. 이때 변경되는 데이터는 실시간으로 받기 때문에 WeatherData객체는 실시간으로 데이터를 변경해줘야합니다. WeatherData객체는 가상 스테이션과 통신해서 기상 데이터를 가져옵니다. WeatherData객체는 디스..

    CHAPTER 01.디자인 패턴 소개와 전략 패턴

    전략 패턴 이해를 위한 간단한 문제 제안 전략패턴을 이해하기 위해 간단한 문제를 먼저 제시해보도록 하겟습니다. “SIMUDuck”이라는 오리 게임을 만들기 위해 오리라는 객체를 정의하고 오리를 상속받아 도메인에 맞는 오리를 생성하는 설계 구조입니다. 이런 설계 상황에서 기획자의 요구에 의해 Duck이라는 객체에 Fly()라는 메소드를 추가 받아야 하는 요구사항이 들어온것입니다. 개발자는 상속을 사용하여 구현한 상태에서 모든 오리는 날수 있다고 생각하여 Fly()라는 메소드를 추가하게 됩니다. 근데 이런 상황에서 만약 모형 오리라는 클래스를 추가하게 되면 날지 못하는 오리들도 날게 되는 기이한? 오류가 발생하게 됩니다. 이처럼 전략패턴은 상속에 대한 부정적인 관점으로 인터페이스 기반 설계와 구현을 지향합니..

    CHATER 00.이 책을 읽는 방법

    이 책을 읽는 이유와 포스팅 하는 이유 이 책은 디자인 패턴에 대해 설명하는 책들입니다. 개인적으로 많은 멘토분들과 동료들이 이 책을 읽으라고 추천을 해주셨습니다. 이 카테고리의 포스팅된 글들은 제가 까먹고 기억하기 위해서 작성하는 목적도 가지고 있지만 구글링을 통해 들어와서 정보를 빠르게 필요로 하신 분들을 위해서이기도 합니다. 이 책의 저자는 에릭 프리먼과 엘리자베스 롭슨입니다. 에릭 프리먼은 월트 디즈니 온라인 CTO를 역임하고 현재는 WickedlySmart에서 책과 동영상 콘텐츠를 창작하는 일을 하는 프로입니다. 또한 헤드 퍼스트 시리즈를 만든 사람 중 한명입니다. 엘리자베스 롭슨은 소프트웨어 엔지니어 저자로서 WickedlySmart의 공동창업자로 예일대학교에서부터 기술적인 분야에 열정을 품고..