정보처리기사 실기에서 자주 출제되는 GoF 디자인 패턴을 문제 중심으로 정리한다.
GoF 디자인 패턴은 목적에 따라 크게 다음 세 종류로 구분한다.
생성 패턴(Creational)
구조 패턴(Structural)
행위 패턴(Behavioral)
다음 설명에 해당하는 생성 패턴을 순서대로 쓰시오.
ㄱ. 서로 어울리는 버튼, 창, 메뉴 같은 제품군을 구체 클래스 없이 한 세트로 만든다.
ㄴ. 같은 조립 절차를 사용해 서로 다른 형태의 복잡한 결과물을 만든다.
ㄷ. 이미 존재하는 원형 객체를 복제해 새 객체를 얻는다.
ㄹ. 클래스의 인스턴스를 하나만 만들고 여러 사용자가 같은 인스턴스에 접근한다.
서로 관련되거나 의존적인 객체들을 구체적인 클래스를 직접 지정하지 않고 제품군 단위로 생성한다.
관련 객체 제품군
버튼 + 창 + 메뉴
한 세트로 생성
→ Abstract Factory
같은 생성 절차를 사용하면서 최종 결과물은 다르게 만들 수 있다.
복잡한 객체
단계별 조립
같은 과정 → 다른 결과
→ Builder
새로운 객체를 처음부터 만드는 대신 기존 객체를 복사하여 생성한다.
원형 객체
복제
Clone
→ Prototype
프로그램 전체에서 객체를 하나만 생성하고 같은 객체를 공유한다.
인스턴스 1개
공유
전역 접근
→ Singleton
ㄱ : Abstract Factory
ㄴ : Builder
ㄷ : Prototype
ㄹ : Singleton
다음 두 상황에 해당하는 구조 패턴을 순서대로 쓰시오.
ㄱ. 이미 만들어진 결제 모듈의 인터페이스가 새 서비스의 규격과 맞지 않아 중간 변환 객체를 끼웠다.
ㄴ. 리모컨 종류와 가전제품 종류가 앞으로 각각 늘어날 수 있어 두 계층을 분리하고 연결 객체를 뒀다.
기존 클래스 자체를 수정하지 않고 중간 객체를 이용하여 원하는 인터페이스로 변환한다.
기존 인터페이스
↓
변환
↓
새 인터페이스
→ Adapter
기능을 담당하는 계층과 실제 구현을 담당하는 계층을 분리하여 각각 독립적으로 확장할 수 있게 한다.
추상화 계층 ↔ 구현 계층
서로 독립적으로 확장
→ Bridge
ㄱ : Adapter
ㄴ : Bridge
다음 역할에 해당하는 패턴을 순서대로 쓰시오.
ㄱ. 실제 객체 앞에서 권한을 검사하고 필요할 때만 실제 객체를 만든다.
ㄴ. 기존 인터페이스를 유지하면서 감싼 객체에 기능을 겹쳐 더한다.
ㄷ. 복잡한 여러 하위 시스템을 단순한 하나의 진입 창구로 감춘다.
클라이언트가 실제 객체에 직접 접근하지 않고 대리 객체를 거치게 한다.
접근 제어
권한 검사
지연 생성
대리 객체
→ Proxy
기존 객체의 인터페이스는 유지하면서 객체를 감싸 새로운 기능을 추가한다.
기존 객체
↓
Decorator로 감싸기
↓
기능 추가
→ Decorator
여러 개의 복잡한 하위 시스템을 직접 호출하는 대신 하나의 단순한 인터페이스를 제공한다.
복잡한 여러 시스템
↓
하나의 단순한 창구
→ Facade
ㄱ : Proxy
ㄴ : Decorator
ㄷ : Facade
한 뉴스 채널의 새 소식이 등록된 구독자 모두에게 자동 전송되는 방식과, 여러 항공기의 요청을 관제탑 하나가 받아 충돌 없이 조정하는 방식에 해당하는 패턴을 순서대로 쓰시오.
한 객체의 상태가 변경되면 해당 객체를 구독하고 있는 여러 객체에 자동으로 알린다.
Publisher
↓
Observer 1
Observer 2
Observer 3
상태 변화
구독자에게 자동 알림
1 : N
→ Observer
객체들이 서로 직접 통신하지 않고 중간의 중재 객체를 통해 통신한다.
항공기 A ─┐
항공기 B ─┼→ 관제탑 → 조정
항공기 C ─┘
중앙 중재자
객체 간 직접 통신 감소
→ Mediator
Observer, Mediator
내비게이션 사용자가 최소 거리와 최단 시간 계산법 가운데 하나를 선택하는 경우와, 주문 객체가 결제 대기, 결제 완료, 취소라는 내부 상태에 따라 같은 요청에 다르게 반응하는 경우의 패턴을 순서대로 쓰시오.
여러 알고리즘을 각각 객체로 만들어 필요에 따라 교체한다.
최단 거리 알고리즘
최단 시간 알고리즘
사용자가 선택
→ Strategy
같은 객체라도 내부 상태가 달라지면 행동이 달라진다.
결제 대기
결제 완료
취소
상태에 따라 행동 변경
→ State
Strategy, State
다음 설명에 해당하는 행위 패턴을 순서대로 쓰시오.
ㄱ. 요청을 객체로 만들어 저장, 대기열 처리, 취소를 가능하게 한다.
ㄴ. 요청을 처리할 객체를 만날 때까지 처리자 사슬을 따라 넘긴다.
ㄷ. 컬렉션 내부 표현을 노출하지 않고 원소에 차례로 접근한다.
ㄹ. 객체 구조를 바꾸지 않고 원소에 적용할 새 연산을 별도 객체로 추가한다.
ㅁ. 상위 클래스가 알고리즘 골격을 정하고 하위 클래스가 일부 단계를 재정의한다.
실행할 요청 자체를 하나의 객체로 만든다.
요청 객체화
저장
Queue
Undo
→ Command
현재 객체가 처리할 수 없으면 다음 처리자에게 요청을 넘긴다.
요청
↓
처리자 A
↓
처리자 B
↓
처리자 C
→ Chain of Responsibility
컬렉션의 내부 구조를 직접 노출하지 않고 요소를 하나씩 접근한다.
hasNext()
next()
→ Iterator
기존 객체 구조를 수정하지 않으면서 새로운 연산을 추가한다.
객체 구조 유지
새로운 연산 추가
각 객체 방문
→ Visitor
상위 클래스에서 알고리즘의 전체 흐름을 정의하고 세부 단계만 하위 클래스에서 구현한다.
전체 흐름 → 부모 클래스
일부 단계 → 자식 클래스
→ Template Method
ㄱ : Command
ㄴ : Chain of Responsibility
ㄷ : Iterator
ㄹ : Visitor
ㅁ : Template Method
다음 보기가 설명하는 패턴을 쓰시오.
영문 Full-Name으로 작성하시오.한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고 자동으로 내용이 갱신되는 방법으로 일대 다의 의존성을 가지며 상호작용하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
핵심 키워드는
한 객체의 상태 변화
다른 객체들에게 자동 전달
1 : N
느슨한 결합
이다.
이는 Observer Pattern의 특징이다.
Observer Pattern
목적에 따른 디자인 패턴의 유형에는 생성, 구조,
( )이/가 있다.
괄호( )안에 알맞은 유형을 쓰시오.
GoF 디자인 패턴은 목적에 따라 세 가지로 분류한다.
생성 패턴
구조 패턴
행위 패턴
행위
괄호
( )안에 알맞은 단어를 쓰시오.디자인 패턴 중에서
( )패턴은 반복적으로 사용되는 객체들의 상호작용을 패턴화한 것으로, 클래스나 객체들이 상호작용하는 방법이다. 알고리즘의 패턴에는 Interpreter, Observer, Command가 있다.
문제에서
객체들의 상호작용
책임 분배
Observer
Command
Interpreter
가 등장한다.
이들은 모두 행위 패턴에 속한다.
행위(Behavioral)
다음 설명에 해당하는 디자인 패턴을 쓰시오.
( )패턴은 객체지향 디자인 패턴이다.부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며,
자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다.
부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.
객체 생성 자체는 상위 클래스에서 정의하지만
어떤 객체를 만들 것인가?
는 하위 클래스에서 결정한다.
객체 생성
↓
하위 클래스가 결정
→ Factory Method
Factory Method
다음은 디자인 패턴에 대한 설명이다. 괄호 안에 알맞은 답을 작성하시오.
(1)은/는 기능을 처리하는 추상화 계층과 실제 구현을 담당하는 구현 계층을 분리하여, 두 계층이 독립적으로 변경될 수 있도록 하는 패턴이다.
구현뿐 아니라 추상화도 독립적인 확장이 필요할 때 사용한다.
기능 계층과 구현 계층을 연결하는 다리 역할을 하며, 기능 확장과 구현 변경을 서로 분리할 수 있다.
(2)은/는 한 객체의 상태가 변화하면 그 객체에 의존하는 다른 객체들에게 변화된 상태를 전달해주는 패턴이다.
일대다 관계를 가지며, 주로 분산된 시스템 간에 이벤트를 생성, 발행(Publish)하고 이를 수신(Subscribe)해야 할 때 이용한다.
추상화 계층
↕
구현 계층
독립적 확장
→ Bridge
상태 변화
Publish / Subscribe
1 : N
→ Observer
(1) Bridge
(2) Observer Pattern
다음 설명에 해당하는 디자인 패턴을 쓰시오.
실제 객체를 직접 참조하는 대신 대리 객체를 앞에 둔다. 대리 객체는 접근 제어, 지연 생성, 로깅 같은 부가 작업을 처리한 뒤 실제 객체에 요청을 전달한다.
핵심 키워드는
대리 객체
접근 제어
지연 생성
로깅
이다.
이는 Proxy 패턴이다.
Proxy
디자인 패턴 설명을 읽고 ①과 ②에 들어갈 패턴을 쓰시오.
① 클래스의 인스턴스를 하나만 만들고 어디서든 그 인스턴스에 접근하게 한다.
② 객체 구조의 원소를 바꾸지 않고 새로운 연산을 추가하며, 각 원소를 방문해 작업을 수행한다.
객체 1개
공유
전역 접근
→ Singleton
객체 구조 유지
새로운 연산 추가
원소 방문
→ Visitor
① Singleton
② Visitor
다음 설명에 해당하는 GoF 디자인 패턴을 쓰시오.
구체적인 클래스를 지정하지 않고 서로 관련되거나 의존적인 객체들의 제품군을 생성하는 인터페이스를 제공한다. 제품군 전체를 일관되게 교체해야 할 때 사용한다.
핵심은
구체 클래스 지정 X
관련 객체 제품군
제품군 전체 생성
이다.
이는 Abstract Factory이다.
Abstract Factory
다음 설명에 해당하는 GoF 디자인 패턴을 쓰시오.
컬렉션의 내부 표현을 노출하지 않고 원소를 차례대로 접근할 수 있게 한다. hasNext와 next 같은 동작으로 순회 책임을 별도 객체에 맡긴다.
컬렉션
순차 접근
hasNext()
next()
가 핵심이다.
이는 Iterator 패턴이다.
Iterator
괄호에 공통으로 들어갈 GoF 디자인 패턴 분류를 쓰시오.
( )패턴은 객체들이 상호작용하는 방법과 책임 분배를 정의한다. 객체 사이의 통신 방법을 다루고 알고리즘을 캡슐화해 결합도를 낮춘다. Chain of Responsibility, Command, Observer가 여기에 속한다.
Chain of Responsibility
Command
Observer
는 모두 행위 패턴이다.
행위
다음 설명에 해당하는 디자인 패턴을 쓰시오.
호환되지 않는 인터페이스를 가진 기존 객체를 감싸 클라이언트가 원하는 인터페이스로 바꿔 준다. 기존 클래스의 내부 코드는 수정하지 않는다.
기존 객체 수정 X
호환되지 않는 인터페이스
원하는 인터페이스로 변환
따라서 Adapter이다.
Adapter
다음 설명에 해당하는 디자인 패턴을 쓰시오.
실제 객체를 바로 사용하지 않는다. 그 객체를 대신하는 대리 객체가 접근을 제어하고 부가 기능도 맡는다. 실제 객체의 생성을 늦추거나 접근 권한을 확인할 때 쓴다.
대리 객체
접근 권한
지연 생성
이 나오면 Proxy이다.
Proxy
다음 설명에 해당하는 디자인 패턴을 각각 쓰시오.
① 기능의 클래스 계층과 구현의 클래스 계층을 분리하고, 두 계층을 연결하여 서로 독립적으로 확장할 수 있게 한다.
② 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 상태 변화를 자동으로 알린다.
추상화 ↔ 구현
독립적 확장
→ Bridge
한 객체의 상태 변화
↓
여러 객체에 알림
→ Observer
① Bridge
② Observer
다음 설명에 해당하는 디자인 패턴을 보기에서 골라 쓰시오.
구체적인 클래스를 명시하지 않고 서로 관련되거나 의존적인 객체들의 집합을 생성하기 위한 인터페이스를 제공한다.
Kit라고도 한다.ㄱ. Builder
ㄴ. Factory Method
ㄷ. Abstract Factory
ㄹ. Prototype
관련 객체들의 집합
제품군
구체 클래스 명시 X
Kit
이 나오면 Abstract Factory이다.
ㄷ. Abstract Factory
GoF 디자인 패턴은 총 23개이며 크게 세 종류로 나눈다.
| 분류 | 목적 |
|---|---|
| 생성 패턴 | 객체를 어떻게 생성할 것인가 |
| 구조 패턴 | 객체와 클래스를 어떻게 구성할 것인가 |
| 행위 패턴 | 객체들이 어떻게 동작하고 협력할 것인가 |
객체의 생성 방식과 관련된 패턴이다.
| 패턴 | 핵심 키워드 |
|---|---|
| Abstract Factory | 관련 객체 제품군 생성 |
| Builder | 단계별 조립 |
| Factory Method | 객체 생성을 하위 클래스가 결정 |
| Prototype | 기존 객체 복제 |
| Singleton | 인스턴스 하나만 생성 |
생성 = 객체를 어떻게 만들까?
클래스나 객체를 어떻게 조합하고 연결할 것인가와 관련된다.
| 패턴 | 핵심 키워드 |
|---|---|
| Adapter | 인터페이스 변환 |
| Bridge | 추상화와 구현 분리 |
| Composite | 부분과 전체를 동일하게 처리 |
| Decorator | 객체를 감싸 기능 추가 |
| Facade | 복잡한 시스템의 단순 창구 |
| Flyweight | 객체 공유로 메모리 절약 |
| Proxy | 대리 객체 |
객체 간의 책임 분배와 상호작용을 다룬다.
| 패턴 | 핵심 키워드 |
|---|---|
| Chain of Responsibility | 처리자 사슬 |
| Command | 요청 객체화 |
| Interpreter | 문법 해석 |
| Iterator | 컬렉션 순회 |
| Mediator | 중재자 |
| Memento | 상태 저장·복원 |
| Observer | 상태 변화 자동 알림 |
| State | 상태에 따라 행동 변경 |
| Strategy | 알고리즘 선택·교체 |
| Template Method | 알고리즘 골격 정의 |
| Visitor | 구조 변경 없이 연산 추가 |
생성 패턴 5개는
추빌팩프싱
처럼 묶어서 기억할 수 있다.
추 → Abstract Factory
빌 → Builder
팩 → Factory Method
프 → Prototype
싱 → Singleton
시험에서는 이름 자체보다 키워드 연결이 더 중요하다.
제품군 → Abstract Factory
조립 → Builder
하위 클래스 → Factory Method
복제 → Prototype
하나만 → Singleton
이미 존재하는 두 인터페이스가 서로 맞지 않을 때 사용한다.
기존 인터페이스
→ 변환
→ 원하는 인터페이스
Adapter = 변환기
처음부터 기능과 구현을 분리해서 둘 다 독립적으로 확장한다.
추상화 ↔ 구현
Bridge = 두 계층을 연결하는 다리
둘 다 객체를 감싼다는 점 때문에 헷갈리기 쉽다.
목적은 접근 제어이다.
권한 검사
지연 생성
접근 제어
대리 객체
목적은 기능 추가이다.
기존 객체
+ 기능
+ 기능
+ 기능
따라서
Proxy = 대신 접근
Decorator = 기능 추가
라고 기억하면 된다.
Facade는 여러 복잡한 기능을 하나의 단순한 창구로 제공한다.
복잡한 시스템 여러 개
↓
Facade
↓
사용자
Facade = 안내 데스크
라고 생각하면 쉽다.
한 객체의 변화가 여러 객체에게 자동 전파된다.
1 → N
유튜브 채널 → 구독자
뉴스 채널 → 구독자
여러 객체가 서로 직접 통신하지 않고 중앙 중재자를 거친다.
A ─┐
B ─┼→ Mediator
C ─┘
관제탑
채팅방 서버
중앙 조정자
둘 다 동작이 바뀐다는 점에서 헷갈릴 수 있다.
사용할 알고리즘을 선택한다.
최단 거리
최단 시간
통행료 최소
→ Strategy
즉
Strategy = 어떤 방법을 사용할까?
객체의 현재 상태 때문에 행동이 달라진다.
대기
결제 완료
취소
즉
State = 지금 상태가 무엇인가?
시험에서는 설명 속 단어를 보고 바로 패턴을 떠올리는 것이 중요하다.
요청 객체화
저장 / 취소 / Queue
→ Command
처리할 때까지 다음 객체로 전달
→ Chain of Responsibility
hasNext / next
컬렉션 순회
→ Iterator
중앙에서 객체들을 조정
→ Mediator
상태 변화 자동 알림
1 : N
Publish / Subscribe
→ Observer
상태에 따라 행동 변경
→ State
알고리즘 선택 / 교체
→ Strategy
알고리즘 골격은 부모
세부 단계는 자식
→ Template Method
객체 구조 변경 X
새로운 연산 추가
→ Visitor
Abstract Factory
→ 관련 객체 제품군
Builder
→ 단계별 조립
Factory Method
→ 하위 클래스가 생성 결정
Prototype
→ 복제
Singleton
→ 인스턴스 하나
Adapter
→ 인터페이스 변환
Bridge
→ 추상화 / 구현 분리
Decorator
→ 기능 추가
Facade
→ 단순한 통합 창구
Proxy
→ 대리 객체 / 접근 제어
Observer
→ 상태 변화 자동 알림
Mediator
→ 중앙 중재자
Strategy
→ 알고리즘 선택
State
→ 상태에 따라 행동 변경
Command
→ 요청 객체화
Chain of Responsibility
→ 처리자 사슬
Iterator
→ 순차 접근
Visitor
→ 구조 변경 없이 연산 추가
Template Method
→ 부모가 골격, 자식이 세부 구현
객체를 만든다
→ 생성 패턴
객체를 연결하고 조립한다
→ 구조 패턴
객체가 서로 행동하고 협력한다
→ 행위 패턴