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
- 패턴명 영문 표기 + 한글 목적 한 줄을 함께 외울 것