[OOP] 디자인 패턴에 대해 알아보자

우선 디자인 패턴의 종류에 대해 알아보기 전, 디자인 패턴이라는 게 무슨 말인가? 에 대해 알아보겠습니다.

디자인 패턴?

디자인 용어

Desgin, 한국에서는 예술 쪽의 언어처럼 미학적인 의미로 고착되었지만, 사실 이 단어에는 "설계하다"라는 의미로도 많이 사용되기 때문에 아키텍쳐를 설계하는 개발자가 사용하기 딱 적절한 언어이죠!

그래서 디자인 패턴이 뭐죠?

디자인 패턴은 개발하면서 발생하는 반복적인 문제들을 어떻게 해결할 것인지에 대한 해결 방안으로 현업에서 해결책으로 제시한 많은 시행착오 중
이건 괜찮다! 유용하네! 편리하다!
와 같이 많은 사람들이 인정한 모범 사례라고 볼 수 있습니다.

디자인 패턴을 사용해서 얻을 수 있는 이점을 알려주세요

위에서 디자인 패턴은 '반복적인 문제를 어떻게 해결할 것인지'에 대한 '해결 방안'이라고 했는데요,

해결 방안인 만큼 아래의 이점을 챙길 수 있어야 한다는 '조건'이 붙습니다. (이점인 동시, 디자인 패턴에 대한 조건이라고 볼 수 있겠죠)

  1. 재사용성: 말 그대로 반복적인 문제를 해결하기 위해 제시한 해결책으로, 재사용성이 우수해야 합니다.
  2. 가독성: 일정한 구조로 정리하면서도 명확하게 작성되어 개발자의 코드 리딩이 수월해야 합니다.
  3. 안정성과 신뢰성: 많은 사람들이 사용하는 패턴이기에 안정성과 신뢰성을 독차지해야겠죠.
  4. 확장성: 3번과 같이 많은 사람들이 사용하기에 다양한 프로젝트에 적용될 수 있도록 확정성이 높아야 합니다.
  5. 유지보수성: 14번까지의 조건/이점을 만족한다면 당연히? 유지보수성 또한 충족되게 됩니다.

디자인 패턴의 종류

이제 디자인 패턴에 대해 많이 알아본 것 같으니, 본격적으로 디자인 패턴에는 어떤 것들이 있는지 알아봅시다.

[!faq] 디자인 패턴 종류... 알아놓으면 어떤 도움이 될까?
개발 방식이 다양해지면서 점점 더 다양한 디자인 패턴이 등장하고 있습니다.
모든 디자인 패턴을 알 수는 없지만 다양한 디자인 패턴을 익히면 익힐수록 우리가 진행하는 다양한 종류의 프로젝트에 어떤 디자인 패턴을 적용하면 유리할지 결정할 수 있을 것입니다.

정말 수 많은 디자인 패턴들이 있는데, 그 중 'GoF 디자인 패턴' 이라는 책에 등장하는 몇가지 디자인 패턴을 추려서 소개하겠습니다.

디자인 패턴의 분류

디자인 패턴은 크게 세 가지로 분류됩니다.

  1. 생성 패턴 (Creational Patterns): 객체 생성 메커니즘을 다루는 패턴으로, 객체 생성과 관련된 복잡성을 감추고 객체 생성의 유연성과 재사용성을 제공합니다.
    • 싱글톤 패턴 (Singleton Pattern): 클래스의 인스턴스가 하나만 생성되는 것을 보장합니다.
    • 팩토리 메서드 패턴 (Factory Method Pattern): 객체 생성의 인터페이스를 정의하지만, 실제 인스턴스 생성은 서브클래스에서 처리합니다.
    • 추상 팩토리 패턴 (Abstract Factory Pattern): 관련된 객체들의 집합을 생성하는 인터페이스를 제공합니다.
    • 빌더 패턴 (Builder Pattern): 복잡한 객체의 생성 과정을 단계별로 나누어 처리할 수 있게 합니다.
    • 프로토타입 패턴 (Prototype Pattern): 기존 객체를 복제하여 새로운 객체를 생성합니다.
  2. 구조 패턴 (Structural Patterns): 클래스와 객체의 조합 방법을 다루는 패턴으로, 더 큰 구조를 형성하고 유지보수성을 높이는 데 사용됩니다.
    • 어댑터 패턴 (Adapter Pattern): 인터페이스 호환성이 없는 클래스들이 함께 동작할 수 있도록 변환합니다.
    • 브리지 패턴 (Bridge Pattern): 구현과 추상을 분리하여 독립적으로 변화할 수 있게 합니다.
    • 컴포지트 패턴 (Composite Pattern): 객체들을 트리 구조로 구성하여 부분-전체 계층 구조를 구현합니다.
    • 데코레이터 패턴 (Decorator Pattern): 객체에 추가적인 기능을 동적으로 부여합니다.
    • 퍼사드 패턴 (Facade Pattern): 복잡한 시스템에 대한 단순화된 인터페이스를 제공합니다.
    • 플라이웨이트 패턴 (Flyweight Pattern): 다수의 객체를 공유하여 메모리를 절약합니다.
    • 프록시 패턴 (Proxy Pattern): 실제 객체에 대한 접근을 제어하는 대리 객체를 제공합니다.
  3. 행동 패턴 (Behavioral Patterns): 객체 간의 상호작용을 다루는 패턴으로, 객체 간의 책임 분배와 소통 방법을 정의합니다.
    • 책임 연쇄 패턴 (Chain of Responsibility Pattern): 요청을 처리할 수 있는 여러 객체를 연결하여 처리 책임을 넘깁니다.
    • 커맨드 패턴 (Command Pattern): 요청을 객체로 캡슐화하여 다양한 요청, 큐잉, 로깅 등을 지원합니다.
    • 인터프리터 패턴 (Interpreter Pattern): 언어의 문법을 클래스로 표현하여 해석을 수행합니다.
    • 이터레이터 패턴 (Iterator Pattern): 컬렉션의 요소들에 순차적으로 접근할 수 있는 방법을 제공합니다.
    • 중재자 패턴 (Mediator Pattern): 객체들이 직접 상호작용하지 않고 중재자를 통해 통신하게 합니다.
    • 메멘토 패턴 (Memento Pattern): 객체의 상태를 저장하고 복원할 수 있게 합니다.
    • 옵서버 패턴 (Observer Pattern): 객체의 상태 변화에 따라 다른 객체들이 통보를 받습니다.
    • 상태 패턴 (State Pattern): 객체의 상태에 따라 행동을 달리할 수 있게 합니다.
    • 전략 패턴 (Strategy Pattern): 동일한 문제를 해결하는 다양한 알고리즘을 각각 캡슐화하여 교환 가능하게 합니다.
    • 템플릿 메서드 패턴 (Template Method Pattern): 알고리즘의 골격을 정의하고, 세부 단계는 서브클래스에서 구현합니다.
    • 방문자 패턴 (Visitor Pattern): 객체 구조에 새로운 연산을 추가할 수 있게 합니다.

 

이 패턴 중에서 가장 많이 사용되는 몇 가지 패턴을 구체적으로 다룬 포스팅을 따로 올리겠습니다 :)