2024.07.12 객체지향 디자인 패턴

디자인 패턴
개념
소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제에 대해 자주 쓰이는 설계 방법을 정리한 패턴
디자인 패턴을 참고하여 개발할 경우 개발의 효율성과 유지보수성, 운용성 등의 품질이 높아지며, 프로그램의 최적화에 도움이 된다.
디자인 패턴 구성요소
- 이름, 문제 및 배경, 솔루션, 사례, 결과, 샘플 코드로 구성되어 있다.
디자인 패턴 유형
| 유형 | 설명 |
| 생성 | 객체 인스턴스 생성에 관여, 클래스 정의와 객체 생성 방식을 구조화, 캡슐화를 수행하는 패턴 |
| 구조 | 더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴 |
| 행위 | 클래스나 객체들이 상호 작용하는 방법과 역할 분담을 다루는 패턴 |
디자인 패턴 종류
생성 패턴
| 패턴 | 설명 |
| builder | 복잡한 인스턴스를 조립하여 만드는 구조 |
| 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있는 디자인 패턴 | |
| 생성과 표기를 분리해서 복잡한 객체를 생성 | |
| Prototype | 처음부터 일반적인 원형을 만들어 놓고, 그것을 복사한 후 필요한 부분만 수정하여 사용하는 패턴, 객체의 원형을 제공하는 인스턴스에서 생성할 객체들의 타입이 결정되도록 설정하며 객체를 생성할 때 갖추어야 할 기본 형태가 있을 때 사용되는 디자인 패턴 |
| 기존 객체를 복제함으로써 객체를 생성 | |
| Factory Method | 상위 클래스에서 객체를 생성하는 인터페이스를 정의하고, 하위 클래스에서 인스턴스를 생성하도록 하는 방식, 인터페이스와 실제 객체를 생성하는 클래스를 분리할 수 있는 특성을 갖는 디자인 패턴, 생성할 객체의 클래스를 국한하지 않고 객체를 생성 |
| Abstract Factory | 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴, 사용자에게 인터페이스를 제공하고, 구체적인 구현은 Concrete Product 클래스에서 이루어지는 특징을 갖는다, 동일한 주제의 다른 팩토리를 묶음 |
| Singleton | 전역 변수를 사용하지 않고 객체를 하나만 생성하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 디자인 패턴, 한 클래스에 한 객체만 존재하도록 제한 |
구조 패턴
| 패턴 | 설명 |
| Bridge | 구현뿐 아니라 추상화된 부분까지 변경해야 하는 경우 활용, 기능의 클래스 계층과 구현의 클래스 계층을 연결하고, 구현부에서 추상 계층을 분리하여 추상화된 부분과 실제 구현 부분을 독립적으로 확장할 수 있는 디자인 패턴 |
| Decorator | 기존에 구성되어 있는 클래스에 필요한 기능을 추가해 나가는 설계 패턴, 상속의 대안으로 사용한다, 객체의 결합을 통해 기능을 동적으로 유연하게 확장 가능 |
| Facade | 복잡한 시스템에 대하여 단순한 인터페이스를 제공함, 사용자와 시스템 간 여타 시스템과의 결합도를 낮추어 시스템 구조에 대한 파악을 쉽게 하는 패턴, 오류에 대해서 단위별 확인 가능, 접근성을 높일 수 있음, 통합된 인터페이스 제공 |
| Flyweight | 클래스의 경량화를 목적으로 하는 디자인 패턴 , 여러 개의 가상 인스턴스를 제공하여 메모리 절감 |
| Proxy | 실제 객체에 대한 대리 객체로 실제 객체에 대한 접근 이전에 필요한 행동을 취할 수 있게 만들며, 이 점을 이용해서 미리 할당하지 않아도 상관없는 것들을 실제 이용할 때 할당하게 하여 메모리 용량을 아낄 수 있다, 실제 객체를 드러나지 않게 하여 정보 은닉의 역할도 수행하는 디자인 패턴<br> 특정 객체로의 접근을 제어하기 위한 용도로 사용 |
| Composite | 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 하는 패턴<br> 복잡 객체와 단일 객체를 동일하게 취급 |
| Adapter | 기존에 생성된 클래스를 재사용할 수 있도록 중간에서 맞춰주는 역할을 하는 인터페이스를 만드는 패턴, 상속을 이용하는 클래스 패턴과 위임을 이용하는 인스턴스 패턴의 두 가지 형태로 사용되는 디자인 패턴<br> 인터페이스가 호환되지 않는 클래스들을 함꼐 이용할 수 있도록 타 클래스의 인터페이스를 기존 인터페이스에 덧씌움 |
디자인 패턴의 장단점
장점:
요구사항 변경에 따른 소스 코드 변경을 최소화할 수 있게 해줌
소프트웨어 코드의 품질을 향상시킬 수 있음
설계 변경 요청에 대한 유연한 대처가 가능
범용적인 코딩 스타일 적용 가능
개발자 간의 원할한 의사소통 가능
재사용을 통한 개발 시간 단축 가능
소프트웨어 구조 파악이 용이
객체 지향 설계 및 구현의 생산성을 높이는 데 적합
소프트웨어의 품질과 생산성을 향상시킬 수 있음
단점:
객체 지향 설계/구현 위주로 사용
초기 투자 비용의 부담



