GoF 구조 패턴 7가지

🔥 매회 출제 (priority 3)

🌱 왜 배우나

레고 조립을 떠올려 보자. 블록 모양이 안 맞으면 변환 블록을 끼우고, 기존 블록 위에 장식을 덧붙이고, 복잡한 내부는 커버로 가리기도 한다. 프로그램도 이미 있는 객체(Object, 데이터와 기능의 묶음)들을 조립해 더 큰 구조를 만들 때 같은 고민에 부딪힌다. 인터페이스(Interface, 객체 사이의 대화 규격)가 안 맞거나, 기능을 덧붙이고 싶거나, 복잡한 내부를 숨기고 싶을 때다. 구조 패턴(Structural Pattern)은 이런 “조립 고민” 7가지를 검증된 방식으로 해결한다.

📖 핵심 개념

구조 패턴은 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴이다. GoF(Gang of Four, 디자인 패턴을 정리한 네 명의 저자) 3분류 중 하나다. 목적은 크게 네 가지다.

  • 인터페이스 호환 — 규격이 다른 것을 이어 붙이기
  • 기능 확장 — 기능을 덧붙이기
  • 접근 제어 — 접근을 막거나 감싸기
  • 복잡성 은닉 — 복잡한 내부를 숨기기

총 7가지 패턴이 있으며, 각각의 목적과 구조 차이를 구분하는 것이 시험의 핵심이다.

🔍 시각화

  GoF 구조 패턴 7가지 — 핵심 목적 한눈에 보기

  ┌────────────┬──────────────────────────────┐
  │ Adapter    │ 규격이 안 맞는 것을 변환     │
  ├────────────┼──────────────────────────────┤
  │ Bridge     │ 추상(기능)과 구현을 분리     │
  ├────────────┼──────────────────────────────┤
  │ Composite  │ 개별과 전체를 동일 취급      │
  ├────────────┼──────────────────────────────┤
  │ Decorator  │ 기능을 동적으로 덧붙임       │
  ├────────────┼──────────────────────────────┤
  │ Facade     │ 복잡한 내부에 단순 창구 제공 │
  ├────────────┼──────────────────────────────┤
  │ Flyweight  │ 공유로 메모리 절약           │
  ├────────────┼──────────────────────────────┤
  │ Proxy      │ 대리인이 접근 제어           │
  └────────────┴──────────────────────────────┘

  Decorator vs Adapter 비교:

  [원본 객체] ─감싸기─▶ [Decorator]  → 기능 추가 (인터페이스 동일)
  [원본 객체] ─감싸기─▶ [Adapter]    → 규격 변환 (인터페이스 변경)

↔️ 이웃 개념 구분

  • Decorator vs Adapter: 둘 다 기존 객체를 감싸지만 목적이 다르다. Decorator는 인터페이스를 그대로 두고 기능을 더한다. Adapter는 인터페이스 자체를 다른 형태로 바꾼다. 기능 확장 vs 규격 변환.
  • Facade vs Proxy: Facade는 복잡한 여러 객체를 하나의 단순 창구로 묶는다. Proxy는 특정 객체 하나에 대한 접근을 대리인이 제어한다.

🔑 핵심 용어

  • Adapter(어댑터): 호환되지 않는 인터페이스를 이어 주는 변환기. 기존 클래스를 건드리지 않고 새 시스템에서 재사용할 수 있게 한다.
  • Proxy(프록시): 실제 객체 대신 대리 객체를 두고 접근을 제어한다. 보안 검사, 캐싱(자주 쓰는 데이터 임시 저장), 지연 로딩(필요할 때 불러오기)에 많이 쓴다.
  • Bridge(브리지): 추상(기능 정의)과 구현(실제 동작)을 분리해 양쪽을 독립적으로 확장할 수 있게 한다.
  • Decorator(데코레이터): 실행 중에 객체에 새 기능을 덧붙인다. 상속(Inheritance, 부모 클래스의 기능을 물려받기) 없이 기능을 확장하는 방법이다.
  • Facade(파사드): 복잡한 서브시스템 앞에 단순한 창구 하나를 놓는다. 은행 창구처럼 내부 복잡성을 가린다.
  • Composite(컴포지트): 개별 객체와 여러 객체의 묶음을 똑같이 다룬다. 파일·폴더 같은 트리 구조를 표현할 때 쓴다.
  • Flyweight(플라이웨이트): 여러 객체가 공통 데이터를 공유해 메모리를 아낀다. 변하지 않는 부분(intrinsic)을 분리해 내는 것이 핵심이다.

✅ 스스로 가르쳐보기

이 내용을 처음 듣는 친구에게 설명한다면, 먼저 “구조 패턴이 해결하는 네 가지 고민”(호환·확장·제어·은닉)을 본인의 말로 정리해 보세요. 그다음 7가지 패턴을 하나씩 떠올리며 각각이 그 중 어떤 고민을 푸는지 연결해 보면 분류가 쉬워집니다.

체크포인트:

  • 7가지 패턴 이름을 빠짐없이 나열할 수 있는가?
  • Adapter와 Decorator의 차이를 “규격 변환 vs 기능 추가”로 말할 수 있는가?
  • Proxy의 활용 예(보안, 캐싱, 지연 로딩) 중 하나 이상을 들었는가?
  • 구조 패턴이 GoF 3분류 중 어디에 속하는지 짚었는가?

🎯 기출 포인트

  • 2025-1회: Adapter 패턴 — 기존 클래스의 인터페이스를 클라이언트가 원하는 형태로 변환
  • 2025-2회: Proxy 패턴 — 다른 객체에 대한 접근을 제어하기 위한 대리자 제공
  • 2024-2회: Iterator 출제 — Iterator는 행위 패턴이다. 구조와 혼동 금지. 구조에서 빈출은 Adapter와 Proxy
  • 패턴명 영문 표기 + 한글 목적 한 줄을 함께 외울 것

🔗 연결 개념