✅ 디자인 패턴(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):
동일 계열의 알고리즘들을 정리하고, 각각 캡슐화하며 이들을 상호 교환 가능하도록 만드는 것으로, 알고리즘을 사용하는 사용자로부터 독립적으로 알고리즘이 변경될 수 있도록 하는 패턴
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
'Computer Science' 카테고리의 다른 글
TCP 프로토콜 연결 / 종료 과정 (0) | 2023.01.10 |
---|---|
[네트워크] 웹 사이트에 접속하는 과정 (0) | 2023.01.09 |
컴파일러란? (feat. 인터프리터) (0) | 2023.01.06 |
세션 vs 토큰(JWT) 인증의 차이 (0) | 2023.01.06 |
GPU(그래픽 처리 장치) 개념 및 CPU와의 차이점 (0) | 2023.01.05 |