컴퓨터 사이언스/소프트웨어 아키텍처

[GOF 디자인 패턴] 좋은 소프트웨어 설계는 이렇게 시작된다.

Dachaes 2025. 5. 6. 15:03
728x90
반응형
728x90

GOF 디자인 패턴(Gang of Four Design Pattern

객체지향 설계에서 “좋은 코드”란 무엇일까요? 유지보수가 쉽고, 확장성이 뛰어나며, 중복이 적고, 결합도가 낮은 코드가 좋은 코드라고 할 수 있습니다. 이를 달성하기 위한 실질적인 지침으로 GOF 디자인 패턴이 널리 사용됩니다.
GOF(Gang of Four)는 디자인 패턴 개념을 정리하고 체계화한 4명의 저자를 지칭하며, 이들이 1994년에 발표한 『Design Patterns: Elements of Reusable Object-Oriented Software』는 객체지향 프로그래밍의 고전이 되었습니다. 이 책에서 소개한 23가지 디자인 패턴은 크게 생성(Creational), 구조(Structural), 행동(Behavioral) 패턴으로 나뉘며, 대부분의 소프트웨어 설계 문제를 해결하는 데 유용하게 활용됩니다.
이 글에서는 GOF 패턴의 개념과 각 패턴의 목적, 대표적인 예시들을 정리해봅니다. 특히 자바나 C++, 파이썬 등 객체지향 언어를 사용하는 개발자라면 이 패턴들을 알고 응용하는 것이 필수적입니다.

 


1.  GOF란 무엇인가?

GOF(Gang of Four)는 네 명의 저자 - Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides - 를 일컫는 말입니다. 이들은 객체지향 소프트웨어 개발에서 반복적으로 등장하는 설계 문제와 그 해결책을 체계적으로 정리하였습니다.

이들이 제안한 패턴들은 단순히 코드 조각이 아닌, 소프트웨어 아키텍처의 모범 사례로 평가받습니다.

디자인 패턴이란?

디자인 패턴은 "좋은 코드"를 넘어 "좋은 구조"를 짜기 위한 개발자의 지혜입니다.

디자인 패턴은 문제(Context)와 이를 해결하기 위한 구조(Solution)를 일반화한 것입니다. 각 패턴은 어떤 상황에서 적용해야 하는지, 어떤 장단점이 있는지를 설명합니다. 이를 통해 개발자는 효율적이고 유지보수하기 쉬운 소프트웨어를 설계할 수 있습니다.

핵심 요소

    • 문제(Problem) : 자주 발생하는 설계상의 문제
    • 맥락(Context) : 문제를 발생시키는 상황
    • 해결(Solution) : 문제를 해결하기 위한 구조적 방법
    • 결과(Consequences) : 패턴 적용 시 얻을 수 있는 이점과 고려사항

장점

    • 코드 재사용성 향상 : 검증된 구조를 사용하면 중복을 줄이고, 코드 품질을 높일 수 있습니다.
    • 설계 품질 개선 : 복잡한 문제를 잘게 나누고, 책임을 명확히 분리할 수 있습니다.
    • 유지보수 용이성 : 코드 변경이 필요할 때 구조적으로 대응할 수 있어 유지보수가 수월합니다.
    • 개발자 간 의사소통 원활 : "이 부분은 옵저버 패턴으로 만들었어"처럼, 패턴 이름만으로 설계 의도를 쉽게 공유할 수 있습니다.

단점

  • 과도한 복잡성 : 불필요하게 패턴을 적용하면 오히려 시스템이 과하게 복잡해질 수 있습니다. (오버엔지니어링)
  • 학습 비용 : 디자인 패턴 자체를 이해하고 적용하는 데 일정한 학습 시간이 필요합니다.
  • 남용 위험 : 모든 문제에 패턴을 억지로 끼워 맞추려 하면 본래 의도와 어긋날 수 있습니다.

 


2.  GOF 디자인 패턴의 3가지 분류

디자인 패턴은 목적에 따라 보통 세 가지로 분류됩니다. 각 패턴은 특정한 문제를 해결하기 위한 전략을 제공하며, 상황에 맞게 적용해야 효과를 발휘합니다.

분류 설명
생성 패턴(Creational Patterns) 객체 생성 과정을 캡슐화하여 유연성을 높입니다.
구조 패턴(Structural Patterns) 클래스와 객체를 조합하여 더 큰 구조를 만듭니다.
행위 패턴(Behavioral Patterns) 객체 간의 커뮤니케이션과 책임 분배를 정의합니다.

a.  생성 패턴 (Creational Patterns)

객체를 생성하는 방법에 대한 패턴으로, 객체 생성의 추상화유연성을 제공합니다.

패턴 이름 설명 예시
Singleton 하나의 인스턴스만 존재하도록 보장 데이터베이스 커넥션
Factory Method 객체 생성 로직을 서브클래스에 위임 GUI 버튼 생성기
Abstract Factory 관련 객체들을 일관된 방식으로 생성 테마별 UI 컴포넌트 팩토리
Builder 복잡한 객체 생성을 단계적으로 분리 HTML 문서 생성기
Prototype 기존 객체를 복사해서 생성 게임 캐릭터 복제

b.  구조 패턴 (Structural Patterns)

클래스나 객체들을 조합하여 더 큰 구조를 만드는 방법에 대한 패턴입니다.

패턴 이름 설명 예시
Adapter 인터페이스 변환 USB-C to HDMI
Bridge 구현과 추상을 분리 리모컨 - TV 관계
Composite 트리 구조 표현 폴더와 파일 시스템
Decorator 동적으로 기능 추가 Java I/O 스트림
Facade 복잡한 서브시스템을 단순화 Spring의 RestTemplate
Flyweight 공유 가능한 객체 사용 문자 렌더링 엔진
Proxy 접근 제어 프록시 서버, Lazy Loading

c.  행동 패턴 (Behavioral Patterns)

객체들 사이의 책임 분산통신 방법에 초점을 둔 패턴입니다.

패턴 이름 설명 예시
Observer 상태 변화 감지 및 알림 이벤트 리스너
Strategy 알고리즘을 객체로 캡슐화 정렬 전략 선택기
Command 명령을 객체로 캡슐화 실행 취소 기능
Chain of Responsibility 요청 처리 책임을 연쇄적으로 전달 필터 체인
State 상태에 따라 행동 변경 게임 상태 변화
Template Method 알고리즘의 골격 정의 후크 메서드
Iterator 내부 구조를 숨긴 반복자 Java의 Iterator 인터페이스
Mediator 객체 간 통신 조정 채팅방 중앙 허브
Memento 객체 상태 저장 및 복원 저장/복원 기능
Interpreter 언어 해석기 구성 수식 파서
Visitor 구조는 그대로, 동작만 추가 문서 분석기

 


3.  마무리

  • GOF는 객체지향 설계를 체계화한 4명의 저자가 만든 디자인 패턴 모음입니다.
  • 총 23개의 패턴이 있으며, 생성(Creational), 구조(Structural), 행동(Behavioral) 3가지 범주로 나뉩니다.
  • 각각의 패턴은 소프트웨어의 품질을 높이기 위한 설계 지침 역할을 합니다.
  • 단순히 암기하는 것이 아닌, 어떤 상황에서 어떤 패턴이 적절한지를 이해하고 적용하는 것이 중요합니다.
  • 실제 코드에서 패턴을 응용해보고 비교해보면, 더 깊은 이해가 가능합니다.

디자인 패턴은 효율적이고 견고한 소프트웨어 설계를 위한 훌륭한 도구입니다. 그러나 "적재적소"에 사용하는 것이 중요합니다. 문제의 본질을 이해하고, 필요한 경우에만 패턴을 적용하는 것이 가장 좋은 접근입니다.

함께 보면 좋은 자료

외부 사이트 :


반응형
728x90
반응형