CS/개발상식

[개발상식] 디자인 패턴

bu119 2023. 7. 1. 22:50
728x90
반응형

소프트웨어 디자인 패턴이란?

소프트웨어 개발 방법으로 사용되는 디자인패턴(Desigin Pattern)은 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 그 방법에 이름을 붙여서 이후에 재사용하기 좋은 형태로 특정 규약을 만들어서 정리한 것이다. 디자인 패턴은 소프트웨어 설계에 있어 공통적인 문제들에 대한 표준적인 해법과 작명법을 제안하며, 알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만, 특정한 상황에서 구조적인 문제를 해결하는 방식입니다. 즉 "효율적인 코드를 만들기 위한 방법론"이라고 생각하시면 된다.

 

디자인 패턴은 외우기보다는 어떠한 패턴이 있는지 알고 수많은 디자인 패턴에서 다양한 코딩 노하우를 습득하는것이 중요하다고 생각한다. "이 코드에는 무조건 이 패턴을 적용시킬거야!" 이것이 아니라 여러가지 패턴이 자연스럽게 내 코드에 녹아드는것이 좋다고 생각한다.

 

디자인 패턴의 종류

디자인 패턴의 카테고리를 "생성 패턴(Creational Pattern)", "구조 패턴(Structural Pattern)", "행동 패턴(Behavioral Pattern)" 3가지로 구분하고 다음과 같이 23개로 나누어져 있다. 이는 GoF(Gang of Four) 디자인 패턴이라 불리며, 4명의 유명한 개발자들에 의해 고안되었다.

 

생성 패턴 (Creational Patterns)

  • 객체 생성에 관련된 패턴
  • 객체가 생성되는 방식을 중시한다.
  • 객체 생성 관련 상세 로직을 숨긴다.
  • 코드는 생성하려는 객체형과는 독립적이다.
  • 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다.

 

구조 패턴 (Structural Patterns)

  • 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
  • 구조를 간결화하고 클래스와 객체 간의 상호관계를 파악할 수 있다.
  • 클래스 상속과 컴포지션을 중시한다.
  • ex) 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.

 

행동 패턴 (Behavioral Patterns)

  • 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴
  • 객체 간의 상호작용과 책임을 중시한다
  • 객체는 상호작요하지만 느슨하게 결합돼야 한다.
  • 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.

 

 

생성 패턴 (Creational Patterns)

객체 인스턴스를 생성하는 패턴으로, 클라이언트와 그 클라이언트가 생성해야 하는 객체 인스턴스 사이의 연결을 끊어 주는 패턴이다.

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

 

1. 싱글턴 패턴 (Singleton Pattern)

특정 클래스에 객체 인스턴스가 하나만 만들어지도록 해주는 패턴이다. 전역 변수를 사용할 때와 마찬가지로 객체 인스턴스를 어디서든지 액세스 할 수 있게 만들 수 있다. 클래스 인스턴스를 하나만 만들고 그 인스턴스로의 전역 접근을 제공한다. 디자인 패턴의 가장 많이 알려진 패턴이다.

 

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

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

 

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

객체를 생성할 때 필요한 인터페이스를 만듭니다. 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정한다.

팩토리 메소드 패턴을 사용하면 클래스 인스턴스 만드는 일을 서브클래스에게 맡기게 된다.

 

구조 패턴 (Structural Patterns)

클래스나 객체를 조합해 더 큰 구조를 만드는 패턴이다.

예를 들어 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 서로 다른 객체들을 묶어 새로운 기능을 제공하는 패턴이다.

 

1. 데코레이터 패턴 (Decorator Pattern)

주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴이다. 데코레이터를 사용하면 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있습니다.

 

 

 

 

2. 프록시 패턴 (Proxy Pattern)

특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)을 제공한다.

프록시 패턴은 어떤 객체에 대한 접근을 제어하기 위한 용도로, 실제 객체의 메서드를 호출하면 그 호출을 중간에 가로채는 패턴입니다. 즉, 제어 흐름을 조정하기 위해 중간에 대리자를 두는 패턴

 

 

3. 컴포지트 패턴 (Composite Pattern)

객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴이다. 사용자는 컴퍼지트패턴을 통해 단일 객체와 복합 객체 모두 동일하게 다룰 수 있다.

 

 

4. 어댑터 패턴 (Adapter pattern)

특정 틀래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다.

 

 

5. 퍼사드 패턴 (facade pattern)

서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어준다. 또한 고수준 인터페이스도 정의하므로 서브시스템을 더 편리하게 사용할 수 있다.

 

 

행동 패턴 (Behavioral Patterns)

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

즉, 클래스와 객체들이 상호작용하는 방법과 역할을 분담하는 방법을 다루는 패턴입니다.

 

1. 템플릿 메소드 패턴 (Template Method Pattern)

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

 

 

2. 상태 패턴 (State Pattern)

상태 패턴을 사용하면 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다. 마치 객체는 자신의 클래스가 변경되는 것처럼 보인다.

 

 

3. 반복자 패턴 (iterator pattern)

컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 방법을 제공한다.

 

 

4. 전략 패턴 (Strategy Pattern)

알고리즘군(동일 계열의 알고리즘들)을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해 줍니다. 전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다.

 

5. 옵저버 패턴 (observer pattern)

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

 

6. 커맨드 패턴 (Command pattern)

실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴이다.


참고자료

https://gmlwjd9405.github.io/2018/07/06/design-pattern.html

https://blog.naver.com/PostView.naver?blogId=hj\_kim97&logNo=222286815808

https://m.hanbit.co.kr/channel/category/category\_view.html?cms\_code=CMS8616098823

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

728x90
반응형