Computer Science

디자인 패턴(Design Pattern)이란?

emhaki 2023. 1. 8. 22:53
728x90
반응형
SMALL

디자인 패턴(Design Pattern)이란?

소프트웨어 개발 방법으로 사용되는 디자인 패턴(Desigin Pattern)은 과거의 소트프웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 그 방법에 이름을 붙여서 재사용하기 좋은 형태로 특정 규약을 만들어서 정리한 것이다. 즉 효율적인 코드를 만들기 위한 방법론이다.

 

- SW 개발 방법 중에서도 구조적인 문제 해결에 목적을 둔다.

- 특정 문제를 해결하는 Logic 형태보다는 특정 상황에 적용할 수 있는 방법론

- 자주 반복되는 문제에 해결책 -> 재사용과 팀원과의 의사소통

- 23가지 디자인 패턴이 존재

- 연관되는 개념으로는 SOLID 원칙과 클린 코드(Clean Code) 

디자인 패턴 종류

디자인 패턴은 목적에 따라 3가지로 구분할 수 있다.

- 생성 패턴 (Creational Patterns) 5가지

- 구조 패턴 (Structural Patterns) 7가지

- 행위 패턴 (Behavioral Patterns) 11가지

생성 패턴 (Creational Patterns)

객체 생성에 관련된 패턴으로, 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.

종류

1. 싱글톤 패턴(Singleton):

싱글턴은 클래스에 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대한 전역 접근​(액세스) 지점을 제공하는 생성 디자인 패턴으로,  디자인 패턴의 가장 많이 알려진 패턴

 

2. 추상팩토리 패턴(Abstract Factory):

구체적인 클래스를 지정하지 않고 관련성이 있거나, 독립적인 객체들을 생성하기 위한 인터페이스를 제공하는 패턴

 

3. 빌더 패턴(Builder):

빌더는 복잡한 객체들을 단계별로 생성할 수 있도록 하는 생성 디자인 패턴. 이 패턴을 사용하면 같은 제작 코드를 사용하여 객체의 다양한 유형들과 표현을 제작할 수 있음.

 

4. 팩토리 메서드 패턴(Factory Method):

객체를 생성하는 인터페이스를 정의하지만, 인스턴스를 만드는 클래스는 서브클래스에서 결정하도록 하는 패턴.

 

5. 원형 패턴(Prototype):

생성할 객체의 종류를 명시하는 데 원형이 되는 예시물을 이용하고 새로운 객체를 이 원형들을 복사함으로써 생성하는 패턴. 프로토타입은 코드를 그들의 클래스들에 의존시키지 않고 기존 객체들을 복사할 수 있도록 하는 생성 디자인 패턴

구조 패턴(Structural Patterns)

클래스나 객체를 조합해 더 큰 구조를 만드는 패턴. 예를 들어 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 서로 다른 객체들을 묶어 새로운 기능을 제공하는 패턴. 복잡한 시스템을 개발하기 쉽도록 클래스나 객체들을 조합해 더 큰 구조로 만든다.

종류

1. 적응자 패턴(Adapter or Wrapper):

클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해주는 패턴.

 

2. 브리지 패턴(Bridge):

브리지는 큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조​(추상화 및 구현)​로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴

 

3. 데코레이터 패턴(Decorator):

여러 벌의 옷을 입으면 여러 효과를 얻을 수 있음

주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능확장이 필요할 때 서브클래스 대신 쓸 수 있는 대안이 됨

 

4. 퍼사드 패턴(Facade): 서브시스템에 있는 인터페이스 집합에 통합된 하나의 인터페이스를 제공. 서브시스템을 좀 더 쉽게 사용하기 위해 고수준의 인터페이스를 정의

 

5. 프록시 패턴(Proxy): 어떤 다른 객체로 접근하는 것을 통제하기 위해 그 객체의 매니저 또는 자리채움자를 제공하는 패턴

 

6. 플라이웨이트(Flyweight): 인스턴스가 필요할 때마다 매번 생성하는 것이 아니고 가능한 한 공유해서 사용함으로써 메모리를 절약하는 패턴. 다수의 유사 객체를 생성하거나 조작할 때 유용하게 사용할 수 있음

 

7. 컴포지트(Composite): 여러 객체를 가진 복합 객체와 단일 객체를 구분 없이 다루고자 할 때 사용하는 패턴. 객체들을 트리 구조로 구성하여 디렉터리 안에 디렉터리가 있듯이 복합 객체 안에 복합 객체가 포함되는 구조를 구현할 수 있음

행위 패턴(Behavioral Patterns)

객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴. 한 객체가 혼자 수행할 수 없는 작업을 여러개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는것에 중점을 두는 방식

종류

1. 옵저버 패턴(Observer):

객체들 사이에 1:N의 의존관계를 정의하여 어떤 객체의 상태가 변할 때, 의존관계에 있는 모든 객체들이 통지받고 자동으로 갱신될 수 있게 만드는 패턴.

 

2. 상태 패턴(State):

객체의 내부 상태가 변경될 때 행동을 변경하도록 허락. 객체는 자신의 클래스가 변경되는 것처럼 보이게 됨.

 

3. 스트레이트지 패턴(Strategy):

공항에 도착하기 위한 다양한 Strategy

동일 계열의 알고리즘들을 정리하고, 각각 캡슐화하며 이들을 상호 교환 가능하도록 만드는 것으로, 알고리즘을 사용하는 사용자로부터 독립적으로 알고리즘이 변경될 수 있도록 하는 패턴

 

4. 템플릿 패턴(Template):

건축 계획에서 고객의 니즈에 더 부합하도록 변경 가능

객체의 연산에서 알고리즘의 뼈대만 정의하고, 나머지는 서브클래스에서 이루어지게 하는 패턴. 템플릿패턴은 알고리즘의 구조는 변경하지 않고 알고리즘의 각 단계를 서브클래스에서 재정의하게 됨

 

5. 비지터 패턴(Visitor):

다양한 상황에 적절한 보험 상품을 파는 보험 대리인

객체구조를 이루는 원소에 대해 수행할 연산을 표현. 방문자는 연산에 적용할 원소의 클래스를 변경하지 않고 새로운 연산을 재정의 할 수 있음.

 

6. 역할 사슬 패턴(Chain of Responsibility):

요청을 처리하는 기회를 하나 이상의 객체에 부여하여 요청을 보내는 쪽과 받는 쪽의 결합을 피하는 패턴. 요청을 처리할 수 있는 객체가 둘 이상 존재하여 한 객체가 처리하지 못하면 다음 객체로 넘어가는 형태의 패턴

 

7. 커맨드 패턴(Commend):

커맨드는 요청을 요청에 대한 모든 정보가 포함된 독립실행형 객체로 변환하는 행동 디자인 패턴. 이 변환은 다양한 요청들이 있는 메서드들을 인수화 할 수 있도록 하며, 요청의 실행을 지연 또는 대기열에 넣을 수 있도록 하고, 또 실행 취소할 수 있는 작업을 지원할 수 있도록 한다.

 

8. 인터프리터 패턴(Interpreter): 주어진 언어에 대해서 문법을 위한 표현수단을 정의하고, 해당 언어로 된 문장을 해석하는 해석기를 사용하는 패턴

 

9. 이터레이터 패턴(Iterator): 자료 구조와 같이 접근이 잦은 객체에 대해 동일한 인터페이스를 사용하도록 하는 패턴. 내부 표현부를 노출하지 않고 어떤 객체 집합의 원소들을 순차적으로 접근할 수 있는 방법을 제공하는 패턴

 

10. 미디에이터 패턴(Mediator):

모든 통신이 관제탑을 통해 이루어짐

모든 클래스간의 복잡한 로직(상호작용)을 캡슐화하여 하나의 클래스에 위임하여 처리하는 패턴. 즉, M:N의 관계에서 M:1의 관계로 복잡도를 떨어뜨려 유지 보수 및 재사용의 확장성에 유리한 패턴

 

10.미디에이터 패턴(Mediator): 수많은 객체들 간의 복잡한 상호작용(Interface)을 캡슐화하여 객체로 정의하는 패턴. 객체 사이의 의존성을 줄여 결합도를 감소시킬 수 있음

 

11.메멘토 패턴(Memento): 특정 시점에서의 객체 내부 상태를 객체화함으로써 이후 요청에 따라 객체를 해당 시점의 상태로 돌릴 수 있는 기능을 제공하는 패턴. Ctrl + Z와 같은 되돌리기 기능을 개발할 때 주로 이용함

 

참고

https://refactoring.guru/ko/design-patterns
https://www.crocus.co.kr/1542

https://coding-factory.tistory.com/708

https://zoosso.tistory.com/1149

728x90
반응형