분류 전체보기 42

[Design Patterns] Chain of Responsibility

목차 개요 내용 요약 요청을 처리할 수 있는 기회를 여러 객체에게 줌으로써 요청을 받은 객체와 처리하는 객체를 분리하자. 예시 GUI 프로그램을 생각해봅시다. 이 프로그램에서 사용자는 버튼 등의 컴포넌트를 클릭하면 도움말을 볼 수 있습니다. 프로그램은 도움말을 어떻게 보여줘야 할까요? 예를 들어 사용자가 버튼을 클릭했다면, 프로그램은 먼저 해당 버튼에 맞는 도움말이 있는지 확인하고 없다면 버튼을 가지고 있는 컨테이너에 도움말이 있는지 확인하는 작업을 연속적으로 취해 도움말이 있다면 도움말을 표시하고 도움말이 없다면 프로그램 최상위에 있는 도움말을 보여줘야 할 것입니다. 이 때 사용할 수 있는 패턴이 책임 연쇄 패턴입니다. 책임 연쇄 패턴은 객체들을 체인으로 묶어 요청이 오면 체인을 따라 진행하면서 요청을..

Design Patterns 2024.03.31

[Design Patterns] Proxy

목차 개요 내용 요약 어떤 객체의 접근을 제어하기 위한 객체를 제공하자. 예시 어떤 객체는 생성을 하기 위한 리소스가 매우 클 수 있습니다. 예를 들어, GUI 툴에서 모든 그림들을 프로그램 실행 시에 다 로딩한다면 실행 시간이 매우 오래 걸리겠죠. 이럴 때 쓸 수있는 것이 프록시 패턴입니다. 프록시 패턴은 기존 객체의 자리를 프록시라는 객체로 대체하는 패턴입니다. 이 프록시 객체는 기존 객체를 바로 가지지 않고 사용하는 쪽에서 필요로 할 때 비로소 객체를 생성합니다. 구조 이야깃거리 언제 써야 할까? 프록시 패턴은 기존 객체를 감싸면서 새로운 동작을 추가하는데에도 쓰일 수 있습니다. 아래의 다양한 프록시 종류를 참고해주세요. Remote Proxy - 다른 곳에 있는 객체를 대체하는 로컬 객체입니다. ..

Design Patterns 2024.03.31

[Design Patterns] Flyweight

목차 개요 내용 요약 수많은 객체들을 효율적으로 관리하기 위해서 객체를 공유하자 예시 악보를 그려주는 프로그램을 생각해봅시다. 악보엔 음표가 있을 것이고 프로그램은 악보를 그리기 위해 음표들을 메모리에 저장하겠죠. 가장 단순하면서도 세밀한 컨트롤이 가능한 방법은 모든 음표를 객체화하는 것입니다. 하지만 이 방식은 악보가 많아졌을 때 수많은 객체를 만들어낼 수 있습니다. 즉, 저장공간에 대한 비용이 매우 높을 수 있습니다. 이 때 플라이웨이트 패턴이 사용됩니다. 플라이웨이트는 동시에 여러 곳에서 사용될 수 있는 공유되는 객체입니다. 플리웨이트는 공유되어야하기 때문에 그들이 쓰이는 문맥(context)에 대한 정보를 가질 수 없습니다. 이 패턴에서 쓰이는 핵심 개념을 참고해주세요. Intrinsic stat..

Design Patterns 2024.03.27

[Design Patterns] Facade

목차 개요 내용 요약 하위 시스템들의 인터페이스를 묶은 통합 인터페이스를 제공하자. 퍼사드는 하위 시스템을 이용하기 쉽게 하기 위한 고수준 인터페이스를 제공합니다. 예시 컴파일러 프로그램을 만든다고 생각합시다. 프로그램 내에는 Scanner, Parser, Stream, ProgramNode 등등의 클래스가 있을 것입니다. 이 프로그램을 사용하는 사용자가 위 클래스들을 모두 공부한 다음 써야할 필요가 있을까요? 이 때 Compiler라는 퍼사드 클래스를 만들면 문제가 해결될 수 있습니다. 구조 이야깃거리 언제 써야 할까? 복잡한 하위 시스템에 대한 간단한 인터페이스를 제공하고 싶을 때 대부분의 패턴들은 적용되었을 때 더 많고 작은 클래스들을 만들면서 유지보수를 용이하게 하지만 한편으로 시스템을 사용하기 ..

Design Patterns 2024.03.24

[Design Patterns] Decorator

목차 개요 이번 글에선 Object Structural Pattern인 데코레이터 패턴에 대해 알아보겠습니다 내용 요약 객체에 역할을 동적으로 부여하자. 기능을 확장함으로써 상속을 대체할 수 있다. 예시 이번에도 디자인 패턴 예시의 국룰인 GUI 프레임워크를 생각해봅시다. 사용자가 어떤 도형을 생성했을 때, 그 도형엔 외곽선이나 스크롤 등을 추가해줄 수 있으면 좋을 것입니다. 이런 요구사항을 해결하기위한 방법 중 하나는 상속인데요. 상속은 유연하지 않습니다. 도형이라는 객체가 생성된 이후에 해당 객체에 상속을 동적으로 추가할 순 없기 때문입니다. 이럴 때 사용할 수 있는 더 유연한 방법은 도형 객체 바깥으로 외곽선을 추가해주는 다른 객체를 두르는 것입니다. 둘러싸는 객체를 데코레이터라고 합니다. 일반적으..

Design Patterns 2024.03.20

[Design Patterns] Composite

목차 개요 이번 글에선 Object Structural Pattern인 컴포 패턴에 대해 알아보겠습니다 내용 요약 부분-전체 계층구조를 표현하기 위해 객체를 트리 구조로 합치자 예시 디자인 패턴의 단골 예시인 파워포인트, 구글 스라이드같은 GUI 앱을 생각해봅시다. 파워포인트는 큰 요소를 만들기 위해 작은 요소들을 하나의 그룹으로 묶을 수 있습니다. 이러한 GUI 앱을 만들기 위해 가장 처음 생각해볼만한 구조는 Text, Line, Square같은 primitive 클래스를 정의하고 이를 담을 수 있는 container 클래스를 작성하는 것입니다. 하지만 이러한 구조는 단점이 있습니다. 이 클래스를 쓰는 개발자들은 반드시 primitive와 container를 따로 취급해줘야 한다는 것입니다. 컴포짓 패..

Design Patterns 2024.03.17

[Design Patterns] Bridge

목차 개요 이번 글에선 Object Structural Pattern인 브릿지 패턴에 대해 알아보겠습니다 내용 요약 둘이 독립적으로 있을 수 있게 구현과 추상화를 분리하자 예시 디자인 패턴의 예시에서 단골로 나오는 GUI 프레임워크를 다시 생각해봅시다. 사용자의 입력을 받는 Input 컴포넌트를 만들어야 한다고 가정하면, 아래와 같은 구조가 나올 수 있습니다. 위 구조의 문제점은 구현과 추상화가 섞여있다는 것입니다. Input, TextInput은 추상화인 반면에 MacInput, WindowsInput, MacTextInput, WindowsTextInput은 구현체입니다. 이렇게 되면 개발/유지보수시에 몇 가지 치명적인 단점이 있습니다. 새로운 인터페이스(추상화)를 추가하기가 불편합니다. 사용자의 코..

Design Patterns 2024.03.16

[Design Patterns] Adapter

목차 개요 이번 글에선 Class/Object Structural Pattern인 어댑터 패턴에 대해 알아보겠습니다. 내용 요약 한 클래스의 인터페이스를 다른 인터페이스로 바꾸자. 예시 주식시장 데이터를 분석하는 앱을 만든다고 생각해봅시다. 먼저 주식시장 데이터를 어디선가 가져와야 합니다. 그 후, 분석 라이브러리를 사용해서 분석을 합니다. 주식시장 데이터와 분석은 모두 third-party에서 이루어집니다. 이 때, 주식시장 데이터는 CSV 포맷으로 제공되고 분석 라이브러리는 JSON만 받는다면 어떻게 해야 할까요? 이렇게 서로 다른 인터페이스를 가지는 라이브러리들을 호환되게 할 수 있는 패턴이 어댑터 패턴입니다. 구조 위 예제를 적용하면, Target은 AnalyzeService, Adaptee는 S..

Design Patterns 2024.03.16

[Design Patterns] Singleton

목차 개요 이번 글에선 Object Creational Pattern인 싱글톤 패턴에 대해 알아보겠습니다. 내용 요약 클래스가 하나의 객체만 가질 수 있게 하고 이 객체에 대한 글로벌한 접근을 제공하자. 예시 데이터베이스 커넥션을 생성하고 유지하는 것은 값비싼 작업입니다. 매 요청마다 혹은 객체마다 DB 커넥션을 맺으면 어떻게 될까요? 아마 꽤 많은 서버 자원을 DB 커넥션을 맺는데에만 써야 할 것입니다. 이럴 때, 한 객체에서 DB 커넥션을 맺어놓고 항상 이 객체를 통해서만 DB 요청을 하게 되면 문제가 어느정도 완화되지 않을까요? 구조 이야깃거리 언제 써야 할까? 오직 하나의 객체만 가져야 하는 클래스가 있고, 이 객체를 쉽게 가져올 수 있어야 할 때 장단점 (Pros) 유일한 객체에 대한 조절되는 ..

Design Patterns 2024.02.25

[Design Patterns] Prototype

목차 개요 이번 글에선 Object Creational Pattern인 프로토타입 패턴을 알아보겠습니다. 내용 요약 만들고자하는 객체를 우선 생성한 다음, 이 객체(프로토타입)를 복사함으로써 새 객체를 생성하자. 예시 악보를 그려주는 애플리케이션을 작성한다고 생각해봅시다. 사용자가 화면에서 새로운 음표를 생성했을 때, 어떻게 음표를 생성하면 좋을까요? 이 때 프로토타입 패턴을 사용할 수 있습니다. 프로토타입 패턴은 프로토타입으로 불리는 객체를 우선 생성해두고 이 객체를 복사함으로써 새 객체를 생성하는 방식입니다. 이 때의 클래스 다이어그램은 아래와 같습니다. 구조 이야깃거리 언제 써야 할까? 클래스의 계층구조와 동일하게 만들어야 하는 팩토리 간 계층 구조를 피해야할 때 클래스의 객체가 오직 몇몇 상태의 ..

Design Patterns 2024.02.25