ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래밍 디자인 패턴 공부 내용 기록
    IT 생활/기타 2021. 1. 11. 01:08

    아주 예전에 사놓은 Head First Design Patterns을 뒤늦게 읽으면서, 책에 있는 디자인 패턴에 대해서 나중에 참고하기 위해서 기록해 놓습니다.


    디자인 원칙

    • 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리 시킨다.
    • 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
    • 상속보다는 구성을 활용한다.
    • 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
    • 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다. (Open-Closed Prinsiple, OCP)
    • 추상화된 것에 의존하도록 만들어라. 구상클래스에 의존하도록 만들지 않도록 한다.
    • 최소 지식 원칙 - 정말 친한 친구하고만 얘기하라.
    • 할리우드 원칙 - 먼저 연락하지 마세요. 저희가 연락 드리겠습니다. (고수준 구성요소에서 저수준 구성요소에 의존)
    • 클래스를 바꾸는 이유는 한 가지 뿐이어야 한다.

    패턴

    특정 컨텍스트 내에서 주어진 문제에 대한 해결책이다

    컨텍스트 : 패턴이 적용되는 상황으로 반복적으로 일어날 수 있는 상황

    문제 : 컨텍스트 내에서 이루고자 하는 목적

    해결책 : 일련의 제약조건 내에서 목적을 달성할 수 있는 일반적인 디자인

     

    디자인 패턴

    스트래티지 패턴 (Strategy pattern)

    책의 설명

    알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.

    스트래티지를 활용하면 알고리즘을 사용하면 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

     

    부연 설명

    클래스의 동작 (behavior)를 인터페이스로 등록하고 동작에 대해서는 인터페이스를 따라 구현하도록 한다.

    즉, 클래스마다 동일한 기능에 대해서 구현이 달라질 때, 달라지는 부분을 빼내고 인터페이스화 한다.

    이렇게 하면 클래스에서 필요에 따라서 구현체를 바꿔서 사용할 수 있게 된다.

     

    옵저버 패턴 (Observer pattern)

    책의 설명

    한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의합니다.

     

    부연 설명

    객체의 상태를 직접 확인하는 pull 방식과 객체가 직접 알려주는 push 방식이 있다.

    객체의 상태에 대해서 이벤트를 받을 다른 객체를 위해서 등록/등록해제 기능이 필요하다.

     

    데코레이터 패턴 (Decorator pattern)

    책의 설명

    객페에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.

     

    부연 설명

    데코레이터는 꾸미고자 하는 객체를 attribute로 가지면서 부수적으로 추가하고자 하는 내용을 구현해 놓은 것이다.

    또한, 데코레이터는 객체 클래스를 서브클래스이므로 데코레이터에 attribute로 데코레이터를 가질 수 있는 구조를 가진다.

    객체를 wraping 할 수 있게 된다. 책의 예제인 스타버즈 커피에서 휘핑, 스팀우유 등을 추가 하는 것을 생각해보면 쉽다.

    커피에 휘핑을 올리더라도 본질은 커피이므로 커피 객체에 추가할 수 있는 데코레이터는 커피+휘핑에도 적용할 수 있다.

     

    팩토리 메소드 패턴 (Factory Method pattern)

    책의 설명

    객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만듭니다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이죠.

     

    부연 설명

    프로그래머들이 흔하게 작성하는 팩토리는 팩토리 메소드 패턴이 아니다.

    팩토리는 클래스가 추가 될 때마다 수정이 이뤄져야 하지만 팩토리 메소드 패턴은 서브클래스에서 직접 생성을 담당하므로 서브클래스 추가만 잘해 놓으면 된다.

     

    추상 팩토리 패턴 (Abstract Factory pattern)

    책의 설명

    인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있습니다.

     

     

    싱글턴 패턴 (Singleton pattern)

    책의 설명

    해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴입니다.

     

    부연 설명

    클래스의 인스턴스가 여러개 존재하면 안되는 경우에 사용한다.

     

    커맨드 패턴 (Command pattern)

    책의 설명

    요구 사항을 객체로 캡슐화 할 수 있으며, 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수도 있습니다. 또한 요청 내역을 큐에 저장하거나 로그로 기록할 수도 있으며, 작업취소 기능도 지원 가능합니다.

     

    부연 설명

    작업을 시키기 위한 인보커와 작업을 처리하는 리시버가 존재한다.

    command 인터페이스를 이용하여 각 명령들을 규격화하고 인보커는 command 인터페이스를 통해서 명령을 수행시키도록 한다.

    이렇게 하면 인보커는 command의 구현에 대해서는 알 필요가 없다.

    command는 실제 작업을 처리할 객체를 멤버로 가지며 작업은 멤버에서 수행하므로 command도 작업 처리에 대한 구현은 알 필요가 없다.

     

    어댑터 패턴 (Adapter pattern)

    책의 설명

    한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다.

     

    부연 설명

    실제 생활에서 사용하는 어댑터와 같은 기능을 하도록 인터페이스를 추가하는 것을 의미한다.

    예를들어서, 클라이언트에서 request()를 사용하는데 사용할 객체서는 req()를 사용한다고 하면 아답터 객체에서는 request()함수 내에서  req()를 사용한다.

     

    퍼사드 패턴 (Facade pattern)

    책의 설명

    어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공합니다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서스시스템을 더 쉽게 사용할 수 있습니다.

     

    부연 설명

    서브시스템을 단순화해서 사용할 수 있도록 해준다.

    책의 홈시어터 예제를 생각하면 이해하기 쉽다. 영화를 보기 위해서는 스피커, 스크린, 플레이어, 전등 등을 조작해야하는 일련의 과정을 거쳐야 하는데, 각 서브시스템을 조작하기 보단 한번에 작업을 해주는 명령(인터페이스)가 있으면 편리하게 사용할 수 있다.

     

    템플릿 메소드 패턴 (Template Method pattern)

    책의 설명

    메소드에서 알고리즘의 골격을 정의합니다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다. 템플릿 메소드를 이용하면 알고리즘의 구조는 그대로 유지하면써 서브클래스에서 특정 단계를 재정의할 수 있습니다.

     

    부연 설명

    알고리즘을 일련의 단계별로 정의해 놓은 메소드를 만들어 놓은 것을 의미한다.

    메소드 내에 각 단계를 메소드 호출로 구현해 놓은 것인데, 추상 메소드를 이용하여 서브클래스에서 구현하도록 한다.

    추상 클래스에 후크(hook) (기본적인 내용만 구현되어 있거나 아무 코드도 없는 메소드)를 이용하여 서브클래스에서 다양하 위치에서 알고리즘에 끼어들을 수 있다.

     

    이터레이터 패턴 (Iterator pattern)

    책의 설명

    컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해 주는 방법을 제공해 줍니다.

     

    컴포지트 패턴 (Composite pattern)

    책의 설명

    객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있습니다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있습니다.

     

    스테이트 패턴 (State pattern)

    책의 설명

    객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있습니다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있습니다.

     

    부연 설명

    클래스에서 상태에 따라서 동작을 다르게 하기 위해서 상태를 클래스로 구현하고 동작을 각 상태 클래스에 위임을 하는 방법이다.

     

    프록시 패턴 (Proxy pattern)

    책의 설명

    어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴

     

    부연 설명

    자바의 RMI (Remote Method Invocation)을 이용하여 원격지에 있는 객체에 대해서 로컬에 있는 객체처럼 사용할 수 있게 해주는 방법이다. 이와 비슷하게 실제 객체 대신에 대변인 객체가 대신해서 동작하는 걸 아울러서 프록시 패턴이라고 한다.

     

    변종 프록시 패턴

    • 방화벽 프록시 : 일련의 네트워크 자원에 대한 접근을 제어
    • 스마트 레퍼런스 프록시 : 주 객체가 참조될 때마다 추가 행동을 제공. 예를 들어 객체에 대한 레퍼런스 개수를 세기
    • 캐싱 프록시 : 비용이 많이 드는 작업의 결과를 임시로 저장하여 계산 시간 또는 네트워크 지연을 줄여주는 효과가 있음
    • 동기화 프록시 : 여러 스레드에서 주 객체에 접근하는 경우에 안전하게 작업을 처리
    • 복잡도 숨김 프록시 : 복잡한 클래스들의 집합에 대한 접근을 제어하고 복잡도를 숨김. 퍼사드 프록시라고 부르기도 함.
    • 지연 복사 프록시 : 클라이언트에서 필요로 할 때까지 객체가 복사되는 것을 지연시킴으로써 객체의 복사를 제어

    컴파운드 패턴 (Compound pattern)

    책의 설명

    두 개 이사으이 패턴을 결합하여 일반적으로 자주 등장하는 문제들에 대한 해법을 제공합니다.

     

    부연 설명

    Model-View-Controller (MVC) 패턴은 컴파운트 패턴으로 옵저버 패턴, 스트래티지 패턴, 컴포지트 패턴으로 이루어져있다.

    댓글

Designed by Tistory.