테마
디자인 패턴: 생성·구조
디자인 패턴(design pattern)은 설계에서 자주 부딪히는 문제와 그 해법을 이름 붙여 정리한 것이다. 이름이 있으면 "여기는 어댑터로 감싸자"처럼 한 단어로 설계 의도를 주고받을 수 있다. 가장 유명한 목록은 감마(Erich Gamma) 등 네 명, 이른바 GoF(Gang of Four, 4인방)가 1994년 책 『Design Patterns』에 정리한 23개다. 시험은 패턴 설명을 주고 이름을 쓰게 하거나 생성·구조·행위 중 어디에 속하는지 묻는다. 이 문서는 생성 5개와 구조 7개를, 행위 11개는 다음 문서에서 다룬다.
세 분류
패턴 하나는 이름만 있는 게 아니라 어떤 문제와 배경에서 쓰는지, 실제 적용 사례, 재사용할 수 있는 예제 코드까지 묶어 설명한다. GoF는 패턴을 목적에 따라 셋으로 나눈다. 생성 패턴(creational pattern) 은 객체를 만드는 과정을 감춰 어떤 구체 클래스를 쓰는지 바깥이 몰라도 되게 한다. 구조 패턴(structural pattern) 은 클래스와 객체를 조합해 더 큰 구조를 만든다. 행위 패턴(behavioral pattern) 은 객체들이 책임을 나누고 서로 소통하는 방법을 다룬다. 개수는 5·7·11이다.
생성 패턴 5개
| 패턴 | 한 줄 의도 | 시험 단서 |
|---|---|---|
| 추상 팩토리(abstract factory) | 관련된 객체 묶음을 구체 클래스 없이 생성 | 제품군, 한 번에 교체 |
| 빌더(builder) | 복잡한 객체를 단계별로 조립 | 생성 과정과 표현 분리 |
| 팩토리 메서드(factory method) | 생성할 클래스를 서브 클래스가 결정 | 가상 생성자(서브 클래스가 만들 객체를 정한다는 별명) |
| 프로토타입(prototype) | 원본 객체를 복제해 생성 | 복제, 생성 비용이 클 때 |
| 싱글톤(singleton) | 인스턴스를 하나만 두고 어디서나 공유 | 하나뿐, 메모리 낭비 방지 |
팩토리 메서드와 추상 팩토리가 가장 헷갈린다. 팩토리 메서드는 객체 하나를 만드는 메서드를 서브 클래스가 정의하게 하고, 추상 팩토리는 버튼·창·메뉴처럼 서로 어울리는 객체 여러 개를 한 공장이 통째로 만들게 한다.
싱글톤은 생성자를 막고 정적 메서드로만 인스턴스를 얻게 한다. 아래 코드에서 두 번 요청해도 생성자는 한 번만 실행된다(Java 21로 실행해 확인).
java
class Config {
private static Config instance;
static int created = 0;
private Config() { created++; }
static Config getInstance() {
if (instance == null) instance = new Config();
return instance;
}
}
// Config.getInstance() == Config.getInstance() → true, created → 1구조 패턴 7개
| 패턴 | 한 줄 의도 | 시험 단서 |
|---|---|---|
| 어댑터(adapter) | 맞지 않는 인터페이스를 변환해 연결 | 호환성, 변환기 |
| 브리지(bridge) | 추상층과 구현부를 분리해 따로 확장 | 기능과 구현을 두 계층으로 |
| 컴포지트(composite) | 부분과 전체를 같은 방식으로 다룸 | 트리 구조, 폴더 안의 폴더 |
| 데코레이터(decorator) | 객체를 덧씌워 기능을 동적으로 추가 | 덧붙이기, 포장 |
| 퍼사드(facade) | 복잡한 하위 시스템에 단순한 창구 제공 | 통합 인터페이스 |
| 플라이웨이트(flyweight) | 공유 가능한 부분을 나눠 써 메모리 절약 | 공유, 대량의 유사 객체 |
| 프록시(proxy) | 대리 객체가 접근을 제어 | 대리자, 지연 로딩 |
모양이 비슷한 쌍을 구분해 두면 점수가 된다. 어댑터는 이미 있는 것을 맞춰 끼우는 것이고, 브리지는 처음부터 두 계층으로 나눠 설계하는 것이다. 데코레이터와 프록시는 둘 다 같은 인터페이스로 감싸지만, 데코레이터는 기능을 더하고 프록시는 접근을 제어한다. 퍼사드는 여러 하위 객체 앞에 창구 하나를 두는 것이라 한 객체를 감싸는 둘과 다르다.
시험 포인트
- 분류 개수 생성 5 · 구조 7 · 행위 11, 합계 23.
- 생성 5개: 추상 팩토리·빌더·팩토리 메서드·프로토타입·싱글톤.
- 구조 7개: 어댑터·브리지·컴포지트·데코레이터·퍼사드·플라이웨이트·프록시.
- "하위 클래스가 생성할 객체를 결정, 가상 생성자" → 팩토리 메서드. "원본 복제" → 프로토타입.
- "호환되지 않는 인터페이스 변환" → 어댑터. "구현부와 추상층 분리" → 브리지.
- "부가 기능을 덧붙여 동적 확장" → 데코레이터. "대리자" → 프록시.
