CS/디자인 패턴

디자인 패턴

tae-woong 2025. 10. 15. 22:11
디자인 패턴의 개념

디자인 패턴(Design Pattern)이란 소프트웨어를 설계할 때 자주 발생하는 문제들을 해결하기 위한, 검증된 해결책들의 모음이라고 할 수 있습니다.

우리가 요리를 할 때, 맛있는 김치찌개를 만들기 위한 '황금 레시피'가 있는 것처럼, 프로그래밍 세계에도 특정 문제를 효과적으로 해결하기 위한 '모범 답안' 혹은 '설계의 정석'이 존재합니다. 이것이 바로 디자인 패턴입니다.

중요한 점은 디자인 패턴은 특정 언어나 기술에 종속된 완성된 코드가 아니라, 문제 해결을 위한 설계 사상(Concept) 이라는 점입니다. 따라서 개발자는 디자인 패턴을 이해하고, 현재 마주한 문제 상황에 맞게 적절히 변형하여 적용할 수 있어야 합니다.

 

디자인 패턴을 장점
  • 재사용성 및 확장성 향상 : 검증된 설계 구조를 사용하므로, 코드의 재사용성이 높아지고 새로운 기능을 추가하거나 수정하기 용이해집니다.
  • 유지보수 용이성 : 잘 짜인 패턴을 기반으로 코드를 작성하면, 코드의 구조를 파악하기 쉬워져 유지보수가 편리해집니다. 버그를 찾거나 수정하는 과정이 훨씬 수월해집니다.
  • 소프트웨어 품질 향상 : 객체지향 설계 원칙(SOLID 등)을 기반으로 만들어진 패턴이 많기 때문에, 자연스럽게 더 안정적이고 유연한 고품질의 소프트웨어를 만들 수 있습니다.

 

디자인 패턴의 분류

디자인 패턴은 목적에 따라 크게 세 가지 유형으로 나뉩니다.

 

1. 생성 패턴 (Creational Patterns)

객체의 생성 과정을 다루는 패턴입니다. 객체를 직접 생성하는 대신, 생성 과정을 캡슐화하여 코드의 유연성을 높이고 특정 상황에 맞는 객체를 만들 수 있게 합니다.

  • 싱글톤 (Singleton) : 클래스의 인스턴스가 오직 하나만 생성되도록 보장합니다. (e.g., 게임 전체의 설정을 관리하는 GameManager)
  • 팩토리 메서드 (Factory Method) : 객체를 생성하는 인터페이스는 미리 정의하되, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하도록 합니다. (e.g., 다양한 종류의 몬스터를 생성하는 MonsterFactory)
  • 추상 팩토리 (Abstract Factory) : 관련 있는 객체들의 집합을 생성하는 인터페이스를 제공합니다.
  • 빌더 (Builder) : 복잡한 객체를 생성하는 과정과 표현을 분리합니다.
  • 프로토타입 (Prototype) : 원본 객체를 복사하여 새로운 객체를 생성합니다.

 

2. 구조 패턴 (Structural Patterns)

클래스나 객체들을 조합하여 더 큰 구조를 만드는 패턴입니다. 서로 다른 클래스들을 엮어 더 크고 새로운 기능을 제공할 수 있게 합니다.

  • 어댑터 (Adapter) : 호환되지 않는 인터페이스를 가진 클래스들을 함께 동작하도록 변환해 줍니다. (e.g., 구형 그래픽 API를 최신 API처럼 사용할 수 있게 감싸는 클래스)
  • 데코레이터 (Decorator) : 객체에 동적으로 새로운 책임(기능)을 추가할 수 있게 합니다. (e.g., 기본 무기 객체에 '화염', '냉기' 등의 속성을 동적으로 추가)
  • 컴포지트 (Composite) : 개별 객체와 객체들의 집합을 동일한 방식으로 다룰 수 있게 합니다.
  • 프록시 (Proxy) : 특정 객체에 대한 접근을 제어하기 위해 대리자를 제공합니다.
  • 퍼사드 (Facade) : 복잡한 서브시스템을 더 쉽게 사용할 수 있도록 간단한 통합 인터페이스를 제공합니다.

 

3. 행위 패턴 (Behavioral Patterns)

객체 간의 상호작용과 책임 분배에 관련된 패턴입니다. 객체들이 어떻게 협력하고 작업을 나누는지에 대한 효율적인 방법을 제시합니다.

  • 전략 (Strategy) : 알고리즘들을 각각의 클래스로 캡슐화하고, 동적으로 교체할 수 있게 합니다. (e.g., 캐릭터의 이동 방식을 '걷기', '뛰기', '날기' 전략으로 분리하여 상황에 맞게 교체)
  • 옵저버 (Observer) : 한 객체의 상태가 변하면, 그 객체에 의존하는 다른 객체들에게 자동으로 알려주고 업데이트하는 방식을 정의합니다. (e.g., 캐릭터의 HP가 변할 때마다 UI가 자동으로 갱신되는 경우)
  • 상태 (State) : 객체의 내부 상태에 따라 행위를 변경하도록 합니다. (e.g., 캐릭터가 '평화', '전투', '사망' 상태에 따라 다른 행동을 함)
  • 커맨드 (Command) : 요청 자체를 객체로 캡슐화하여, 요청을 저장하거나 로깅하고, 되돌릴 수 있는 연산을 지원합니다.
  • 템플릿 메서드 (Template Method) : 알고리즘의 골격은 부모 클래스에 정의하고, 일부 단계는 자식 클래스에서 구현하도록 합니다.

'CS > 디자인 패턴' 카테고리의 다른 글

싱글톤 패턴  (0) 2025.10.15