본문 바로가기

기타/객체지향의 탄생(2013)

객체지향의 탄생- Façade pattern

 

  1. 퍼사드 패턴(Façade)

1. 사람은 모든지 행복한 일을 추구한다. 사람이 느끼는 행복에는 편리함도 있다. 사람은 편리할때 행복을 느낀다. 사람을 상대로 하는 모든 사업은 사람의 편리함을 지속적으로 추구해왔다.

 

최근의 첨단 문명에서는 사람을 편리하게 해주는 한계를 넘어서 계속 발전하고 있다. 예를들어 컴퓨터와 비행기와 인터넷과 휴대폰의 발명과 진화는 사람간의 교류와 지식 관리의 편리함을 극한까지 지원한다.

 

그런데 무엇보다 고대에도 중요했고 현재에도 중요한 사람의 편리함은 사람의 기본적인 욕구를 편리하게 해주는 것이다.

 

그중에서도 으뜸이 바로 사람의 생존의 관문인 먹거리와 관련된 서비스업이다. 고대부터 사람이 혼자서 모든 자신의 밥거리를 혼자 해결할 수 없다. 우리 들의 식사 요구사항을 편리하게 해결해줄 식당은 고대로부터 내려와 지금의 온갖 다양한 먹거리 서비스업으로 진화하고 있다.

 

퍼사드 패턴은 마치 복잡한 음식재료가 요구되는 음식을 이미 만들어서 제공하는 서비스업 식당과 같다.

 

2. 처음 혼자서 자취할때 밥먹는 일은 항상 고역이었다. 밥을 해먹자니 만사가 귀찮고 안 먹자니 배가 고파서 아무것도 하지 못했다. 그때는 대부분 자장면, 볶음밥을 시켜먹었다. 돈이 많이 나갔다. 두번째 자취할때는 이제 돈을 아껴쓰는것에 눈이 떠져서 요리를 직접 해먹으면 식비를 많이 아낄수 있다는 것을 알았다.

 

요리를 직접 해먹어보니 식비를 많이 아낄수는 있었는데 알아야 할것도 많고 손가야 할것도 많았다. 예를 들어 내가 제일 좋아하는 김찌찌개를 해먹으려면 돼지고기, 두부, 김치, 김치국물, 대파, 맛술, 다진마늘, 국간장, 생강가루, 설탕, 고추가루등 알아야 하고 준비해야 할것이 너무 많았다.

 

3. 친구집에서 술한잔 먹고 다음날 김치찌개 전문점을 찾아갔다. 김치찌개 2인분을 시켰더니 5분만에 완성된 김치찌개가 나온다. 맛있게 김치찌개를 먹을때 문득 직접 요리해 먹을때가 생각났다. 그때는 많은 요리재료를 알아야되고 요리재료를 황금비율로 섞어야 되고 몇십분을 끓이는 많은 노력을 해야 겨우 김치찌개가 완성된다. 그런데 이곳에서는 5분에서는 김치찌개가 뚝딱나온다. 이래서 사람의 서비스업이 발달하는구나 라고 생각했다.

 

퍼사드 패턴은 완성된 김치찌개를 파는 식당과 같다.

 

4. 요리를 직접 해먹는 경우는 다음과 같다.

[김치찌개를 직접 요리하려면 요리법과 여러 양념과 식품을 알아야 한다.]

 

클라이언트가 돼지고기, 두부, 김치, 김치국물, 대파, 맛술, 다진마늘, 국간장, 생강가루, 설탕, 고추가루등 알아야할 재료가 너무도 많다.

 

그러나 김치찌개 전문 식당 객체가 등장하면 상황은 다음과 같이 달라진다. 클라이언트는 오직 김치찌개 전문 식당에만 의존하여 맛있는 김치찌개를 먹을 수 있다.

 

 

[김치찌개 잘하는 전문식당을 알고 돈이 있으면 쉽고 편하게 먹을 수 있다.]

 

[퍼사드 예제 코드 UML]

 

public class Dubu {

    public void cook() {

System.out.println("두부 요리");

    }

}

[김치찌개를 요리하려면 두부도 있어야 한다.]

 

public class Kimchi {

    public void cook() {

        System.out.println("김치");

    }

} 

[김치가 있어야 한다.]

 

public class Onion {

 

    public void cook() {

        System.out.println("대파 요리");

    }

} 

[대파도 있어야 한다.]

 

public class Pork {

    public void cook() {

        System.out.println("돼지고기 굽기");

    }

} 

[돼지고기는 필수다.]

 

public class Seasoning {

 

    public void cook() {

        System.out.println("각종 양념");

    }

} 

[각종 양념이 필요하다.]

 

public class KimchichikeRestaurant {

    Dubu dubu = new Dubu();

    Kimchi kimchi = new Kimchi();

    Onion onion = new Onion();

    Pork pork = new Pork();

    Seasoning seasoning = new Seasoning();

    

    public void getKimchichike() {

        dubu.cook();

        kimchi.cook();

        onion.cook();

        pork.cook();

        seasoning.cook();

        System.out.println("하여 김치찌개를 내놓다.");

    }

} 

[김치찌개 레스토랑은 김치찌개 요리에 필요한 식품 양념들을 바탕으로 김치찌개를 내놓는 하나의 메소드를 가지고 있다.]

 

public class Main {

public static void main(String[] args) {

        // 직접 요리를 하려면 다음의 객체를 알고 직접 요리해야 한다.

        Dubu dubu = new Dubu();

        Kimchi kimchi = new Kimchi();

        Onion onion = new Onion();

        Pork pork = new Pork();

        Seasoning seasoning = new Seasoning();

        

        // facade 패턴으로 여러 객체 들에게 의존하지 않고 한번에 김치찌개를 얻기

        KimchichikeRestaurant kimchiChike = new KimchichikeRestaurant();

        kimchiChike.getKimchichike();

    }

}

 

두부 요리

김치

대파 요리

돼지고기 굽기

각종 양념

하여 김치찌개를 내놓다.

[실행 결과]

 

달리 코드 설명을 하지 않아도 직관적으로 이해할 있다. Main클래스를 직접 요리를 하면 여러 클래스를 클라이언트 클래스가 알아야 한다.

 

퍼사드 패턴을 구현한 김치찌개 레스토랑 클래스(KimchichikeRestaurant) 클래스를 이용하면 클라이언트 클래스는 김치찌개 레스토랑 클래스만 알아도 원하는 기능(요리) 얻을 있다.

 

5. 퍼사드 패턴은 하나 이상의 클래스로부터 복잡하게 의존해야 하는 인터페이스를 하나의 클래스로 깔끔하게 정리해주는 패턴이다.

 

클라이언트는 복잡한 의존도를 정리한 김치찌개 전문 식당 객체를 써도 되고 직접 요리하고 싶으면 기존 인터페이스를 그대로 써도 된다. 보통 여러 클래스를 조합하여 쓰이는 용도가 정해져 있으면 간단하고 편리하게 퍼사드 패턴을 쓰면 된다.

 

퍼사드 패턴은 복잡하게 쓰이는 객체 구성요소에 대하여 간단한 인터페이스를 제공하기 위해 쓰인다.

 

퍼사드 패턴의 장점은 만약 복잡하게 쓰이는 객체 구성요소들의 인터페이스가 대대적으로 변경되더라도 클라이언트는 퍼사드 클래스에만 의존되어 있기 때문에 퍼사드 클래스만 수정하면 된다. 예를들어 김치찌개를 더 맛있게 먹는 요리 재료가 추가되었더라도 클라이언트는 김치찌개 전문 식당에서 그냥 시켜먹으면 된다. 물론 직접 요리해 먹는것도 좋기 때문에 직접 요리해도 된다.

 

[퍼사드 패턴 원본]

 

덧 ) 이 객체지향의 탄생 원고는 제가 책으로 내려다가 일단 잘 안되었는데요. 이유는 비문이 많다. 단락내 주제가 중복된다. 어떤 상황 설명을 과장한다.등 입니다. 그래도 원고를 일단 블로그에 몽땅 풀어보고 언젠가 제대로 교정해서 다시 도전할 생각입니다. 이점을 감안해서 읽고 객체지향을 이해하는데 도움이 되셨으면 좋겠습니다. 의견도 주셨으면 좋겠습니다. 원고 조금만 교정하면 괜찮을것 같은 출판사 관계자분의 피드백도 환영합니다. 매주 월요일 발행 예정입니다.