디자인 패턴 (GoF)
쉽게 말하면
디자인 패턴은 개발자들이 자주 만나는 설계 문제에 대한 검증된 해법 모음이에요. GoF라 불리는 네 저자가 23개를 정리했어요. 객체를 어떻게 만들지에 관한 생성 패턴, 클래스와 객체를 어떻게 조립할지에 관한 구조 패턴, 객체들이 어떻게 협력하고 책임을 나눌지에 관한 행위 패턴으로 나뉘어요. 시험에는 '이 설명은 어느 패턴?'과 '이 패턴은 어느 분류?'가 자주 나와요.
시험용 정의
디자인 패턴은 소프트웨어 설계에서 반복되는 문제에 대한 재사용 가능한 해결책이다. GoF(Gang of Four)의 23개 패턴은 목적에 따라 생성 패턴(객체 생성 방법, 5개), 구조 패턴(클래스·객체 조합, 7개), 행위 패턴(객체 간 상호작용과 책임 분배, 11개)으로 나뉜다. 패턴을 쓰면 설계를 재사용하고 개발자 사이의 소통이 쉬워지지만, 객체지향 설계를 전제로 하고 처음 배우기 어렵다.
비유로 이해하기
요리책의 기본 레시피다. '여러 사람이 같은 냄비 하나를 써야 한다'(싱글톤), '콘센트 모양이 다르면 변환 어댑터를 끼운다'(어댑터), '음식이 다 되면 알림을 받기로 한 사람에게 모두 알려 준다'(옵서버)처럼 이미 검증된 해법이 이름과 함께 정리돼 있다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| GoF | 디자인 패턴 책을 쓴 네 사람(감마, 헬름, 존슨, 블리시디스) |
| 인스턴스 생성 | 클래스로 객체를 만드는 일 |
| 인터페이스 | 외부에 공개된 메서드 목록. 구현은 숨긴다 |
| 위임 | 자기가 할 일을 다른 객체에게 맡기는 것 |
생성 패턴 (5)
| 패턴 | 핵심 |
|---|---|
| 싱글톤 | 인스턴스를 하나만 만든다 |
| 팩토리 메서드 | 객체 생성을 하위 클래스가 결정 (생성 메서드를 서브클래스에서 재정의) |
| 추상 팩토리 | 서로 관련된 객체들의 묶음(제품군)을 구체 클래스 지정 없이 만든다 |
| 빌더 | 복잡한 객체를 단계별로 조립해 만든다 |
| 프로토타입 | 원본 객체를 복제(clone)해 새 객체를 만든다 |
구조 패턴 (7)
| 패턴 | 핵심 |
|---|---|
| 어댑터 | 맞지 않는 인터페이스를 변환해 함께 쓰게 한다 |
| 브리지 | 기능(추상)과 구현을 분리해 각자 확장 |
| 컴포지트 | 개별 객체와 복합 객체를 트리 구조로 똑같이 다룬다 (폴더-파일) |
| 데코레이터 | 객체에 기능을 동적으로 덧붙인다 (포장) |
| 퍼사드 | 복잡한 하위 시스템에 단순한 통합 창구를 제공 |
| 플라이웨이트 | 같은 객체를 공유해 메모리를 아낀다 |
| 프록시 | 대리 객체가 접근을 제어하거나 대신 처리 |
행위 패턴 (11)
| 패턴 | 핵심 |
|---|---|
| 옵서버 | 한 객체의 상태가 바뀌면 의존 객체들에 자동 통지 (일대다) |
| 전략 | 알고리즘을 캡슐화해 실행 중에 교체 |
| 템플릿 메서드 | 상위 클래스가 처리 골격을 정하고 일부 단계를 하위 클래스가 구현 |
| 커맨드 | 요청을 객체로 캡슐화 (실행 취소, 대기열) |
| 이터레이터 | 내부 구조를 드러내지 않고 요소를 차례로 접근 |
| 상태 | 상태에 따라 객체의 행동을 바꾼다 |
| 방문자 | 구조는 그대로 두고 새 연산을 밖에서 추가 |
| 중재자 | 객체 간 복잡한 상호작용을 중재자 하나로 모은다 |
| 메멘토 | 객체 상태를 저장해 두었다가 되돌린다 (되돌리기) |
| 책임 연쇄 | 요청을 처리할 수 있을 때까지 객체 사슬로 넘긴다 |
| 인터프리터 | 언어의 문법을 클래스로 표현해 해석 |
기출에서 더 나온 것
| 말 | 뜻 |
|---|---|
| 팩토리 메서드 | 상위 클래스는 객체를 만드는 인터페이스만 정하고, 어떤 객체를 만들지는 하위 클래스가 정한다 |
| 비지터 | 자료 구조와 처리 기능을 분리해, 구조는 그대로 두고 처리를 바꿀 수 있게 한다 (행위) |
| 브리지 | 기능 계층과 구현 계층을 분리해 각각 독립적으로 확장한다 (구조) |
| 스트래티지 | 알고리즘을 여러 개 캡슐화해 바꿔 끼운다 (행위). 인스턴스 복제는 프로토타입 |
| 패턴의 장점 | 구조 파악이 쉽고 재사용으로 시간이 줄며 의사소통이 원활하다. 객체지향과 함께 써야 효과가 크다 |
시험에 이렇게 나와요
- 생성 패턴 → 싱글톤·추상 팩토리·팩토리 메서드·빌더·프로토타입 (어댑터는 구조)
- 구조 패턴 → 어댑터·브리지·컴포지트·데코레이터·퍼사드·플라이웨이트·프록시 (빌더는 생성)
- 행위 패턴 → 옵서버·비지터·커맨드·스테이트·스트래티지·이터레이터 등 (프로토타입은 생성)
- GoF 분류 → 생성·구조·행위 세 가지 (추상 패턴은 없음)
- 패턴 구성 요소 → 이름·문제와 배경·해법·사례·결과·샘플 코드 (개발자 이름은 아님)
확인 문제
Q1. 클래스의 인스턴스가 오직 하나만 만들어지도록 보장하는 패턴은?
- 데코레이터
- 프로토타입
- 옵서버
- 싱글톤
정답 보기
4번 싱글톤
싱글톤(Singleton)은 생성 패턴으로, 인스턴스를 하나만 만들고 어디서나 그 하나에 접근하게 한다. 설정 관리자, 연결 풀 등에 쓴다.
Q2. GoF 디자인 패턴 중 생성 패턴에 속하는 것은?
- 옵서버
- 어댑터
- 퍼사드
- 빌더
정답 보기
4번 빌더
빌더는 생성, 어댑터·퍼사드는 구조, 옵서버는 행위.
Q3. 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에 자동으로 알리는 패턴은?
- 옵서버
- 중재자
- 커맨드
- 메멘토
정답 보기
1번 옵서버
옵서버 패턴이다. 일대다 의존 관계에서 바뀐 사실을 자동으로 알린다. 메멘토는 상태를 저장했다가 되돌리고, 중재자는 객체 사이 소통을 한곳에 모은다.
Q4. 호환되지 않는 인터페이스를 가진 클래스를 함께 쓸 수 있도록 변환해 주는 패턴은?
- 프록시
- 데코레이터
- 어댑터
- 브리지
정답 보기
3번 어댑터
220V 플러그를 110V 콘센트에 꽂는 변환기와 같다.
Q5. 다음 중 구조 패턴이 아닌 것은?
- 이터레이터
- 플라이웨이트
- 컴포지트
- 프록시
정답 보기
1번 이터레이터
이터레이터는 행위 패턴이다. 컴포지트·플라이웨이트·프록시는 클래스와 객체를 조합하는 구조 패턴이다.
헷갈리기 쉬운 O·X
프로토타입 패턴은 원본 객체를 복제해 새 객체를 만드는 생성 패턴이다.
정답 보기
O
퍼사드 패턴은 객체에 기능을 동적으로 덧붙이는 패턴이다.
정답 보기
X 그건 데코레이터. 퍼사드는 단순한 통합 창구.
전략 패턴은 행위 패턴에 속한다.
정답 보기
O