본문 바로가기
C++

디자인 패턴

by ji-han 2025. 2. 20.

이란?

- 소프트웨어 설계에서 자주 발생하는 문제를 해결하기 위한 일반적인 솔루션

 

사용 이유

  • 문제 해결의 일관성 - 검증된 솔루션을 제공, 반복적인 문제를 일관되게 해결
  • 코드 가독성 및 유지보수성 - 디자인 패턴 적용시 코드 구조가 명확해 짐
  • 재사용성 - 여러 프로젝트에서 재사용 가능
  • 확장성 - 소프트웨어 설계가 변화에 유연하게 대응
  • 공통 언어 - 의사소통을 더 명확하고 간결하게 만듬

한계

  • 복잡성 증가 - 잘못하면 불필요한 복잡성을 초래할 수 있음
  • 학습 곡선 - 이해하고 활용하려면 경험과 학습이 필요
  • 과잉 설계 - 간단한 문제에 과도하게 적용하면 비효율
  • 언어 특화 기능 대체 - 일부 언어에서는 디자인 패턴이 필요없거나 자동화됨

유형 3가지

행동 객체 간의 상호작용을 최적화 옵저버, 상태, 전략
생성 객체 생성 방식을 효율적으로 관리 싱글톤, 팩토리 메서드, 빌더
구조 클래스 및 객체의 관계를 구성 어댑터, 데코레이터, 컴포지트

 

 

2025.03.14-------------------------------------------------------------------

 

전략 패턴

- 행동을 동적으로 변경할 수 있도록 하는 패턴

- if-else 또는 switch문으로 처리하던 로직을 행동 객체로 분리함으로써 코드 가독성과 유지보수성을 높일 수 있음

 

장점

  • 유연성 : 기존 코드에 영향이 적고 새로운 클래스만 추가하면 됨
  • 결함도 감소
  • 런타임 교체

단점

  • 행동마다 별도의 클래스를 만들어야 됨
  • 생성자에서 어떤 행동을 사용할 것인지 결정하는 과정 필요

상태 패턴

- 객체의 상태에 따라 행동이 변하는 패턴

 

장점

  • if-else나 switch문 없이 상태별로 클래스를 캡슐화하므로 코드 가독성이 향상
  • 새로운 상태를 추가할 때 기존 코드를 거의 수정하지 않음
  • 응집도가 높아지고 유지보수성이 향상

단점

  • 상태가 많아질수록 클래스 파일 수 증가
  • 상태 전환 로직들의 전체 흐름을 파악하고 관리 필요

 

템플릿 메서드

- 기본 알고리즘의 틀을 정의하고 세부적인 동작은 하위 클래스에서 구현하는 패턴

 

장점

  • 공통 로직을 부모 클래스에 모아 중복 코드를 제거할 수 있음
  • 전체 흐름은 바꾸지 않으며 일부 단계만 오버라이드하여 변형을 쉽게 만듬
  • 유지보수 용이

단점

  • 상속 관계로 인한 클래스 의존성 증가
  • 단계가 많아질수록 복잡성 증가
  • 리스코프 치환 원칙 위반 위험

 

 

2025.03.26-------------------------------------------------------------------

 

반복자

- 리스트, 배열 등에 저장된 요소들을 순차적으로 접근할 수 있도록 객체를 제공

- 내부 구조를 노출하지 않고도 그 안의 요소에 접근할 수 있도록 하는데 목적

장점

  • 배열, 리스트, 트리 등 다양한 자료구조를 동일한 방식으로 처리할 수 있음
  • 내부 구조에 의존하지 않음
  • 반복자를 추가하거나 수정하기 쉬움

단점

  • 불필요한 반복자 클래스를 추가하면 코드가 복잡해질 수 있음
  • 추가적인 메모리 오버헤드가 발생할 수 있음

* STL에서 벡터, 맵, 리스트 등 에서 사용

빌더

- 생성 과정과 표현 방식을 분리하여 동일한 생성 절차에서 서로 다른 객체를 생성할 수 있도록한 패턴

장점

  • 객체를 생성하는 절차를 단계별로 분리할 수 있음
  • 코드의 유연성과 재사용성 증가
  • 생성 로직과 객체 생성 책임을 나누어 담당

단점

  • 간단한 생성에는 코드가 복잡해질 수 있음
  • Builder, Director 등 여러 클래스가 추가로 필요

* 복잡한 UI 위젯을 생성할 때 사용, 무기,스킬, 옷 등 을 빌더로 생성

2025.03.28-------------------------------------------------------------------

 

팩토리

- 객체 생성 로직을 별도의 팩토리 클래스로 분리하여 객체를 효율적으로 생성할 수 있도록 하는 패턴

장점

  • 객체 생성이 팩토리에 위임되므로 클라이언트 코드가 간단해짐
  • 객체를 추가할 때 코드 수정 없이 팩토리를 확장하여 기능 추가
  • 런타임에 객체의 생성 방식을 변경할 수 있음

단점

  • 팩토리 메서드나 추상 팩토리를 사용하면 클래스와 인터페이스 계층이 복잡해 질 수 있음
  • 팩토리에서 로직을 관리하는 만큼 코드가 장황해 질 수 있음

* 객체 롤링, AI 컨트롤러, 나이아가라 이펙트 생성 등에서 자주 사

어댑터

- 서로 호환되지 않는 인터페이스를 가진 객체들이 함께 동작할 수 있도록 중간 역할을 하는 패턴

장점

  • 기존 코드를 수정하지 않고도 새로운 인터페이스와 함께 사용할 수 있음
  • 어댑터의 코드를 재활용할 수 있음
  • 여러 어댑터 객체를 동적으로 교체할 수 있음

단점

  • 추가적인 어댑터 클래스를 설계해야 하므로 코드 구조가 더 복잡해질 수 있음
  • 클래스 어댑터는 다중 상속을 사용해야 하므로 제한된 언어는 객체 어댑터 방식을 사용

* 오래된 코드와의 린터페이스 차이를 해결 / 외부 라이브러리를 사용

프록시

- 대리 객체를 사용하여 다른 객체에 대한 접근을 제어하거나 기능을 추가하는 패턴

- 원본 객체롸 같은 인터페이스를 구현하여 클라이언트가 프록시를 통해 원본 객체에 접근

 

유형

  • 가상 프록시
  • 원격 프록시
  • 보호 프록시
  • 스마트 프록시

장점

  • 실제 객체 생성을 지연하여 메모리,CPU 사용량을 절감할 수 있음
  • 사용자나 상황에 따라 객체 접근을 제한하거나 권한을 부여할 수 있음
  • 객체 호출시 추가적인 부가 작업을 수행할 수 있음

단점

  • 프록시 객체가 중간 역할을 하므로 응답 시간이 지연될 수 있음
  • 클래스 계츨이 더 복잡해질 수 있음

* 무거운 GUI 요소(대용량 이미지, 영상) 로딩 시 가상 프록시 사용, 데이터베이스 연결

'C++' 카테고리의 다른 글

GAS 첫 공부(쳇 GPT) - 1  (0) 2025.05.16
클린코드  (0) 2025.03.27
Overlap 매개변수  (0) 2025.02.12
STL 반복자(연산)  (0) 2025.01.27
포인터와 참조 / 스마트 포인터  (0) 2025.01.20