공든탑앱 열기

디자인 패턴 (GoF)

정보처리기사 · 화면·애플리케이션 설계 · 약 14분

쉽게 말하면

디자인 패턴은 개발자들이 자주 만나는 설계 문제에 대한 검증된 해법 모음이에요. GoF라 불리는 네 저자가 23개를 정리했어요. 객체를 어떻게 만들지에 관한 생성 패턴, 클래스와 객체를 어떻게 조립할지에 관한 구조 패턴, 객체들이 어떻게 협력하고 책임을 나눌지에 관한 행위 패턴으로 나뉘어요. 시험에는 '이 설명은 어느 패턴?'과 '이 패턴은 어느 분류?'가 자주 나와요.

시험용 정의

디자인 패턴은 소프트웨어 설계에서 반복되는 문제에 대한 재사용 가능한 해결책이다. GoF(Gang of Four)의 23개 패턴은 목적에 따라 생성 패턴(객체 생성 방법, 5개), 구조 패턴(클래스·객체 조합, 7개), 행위 패턴(객체 간 상호작용과 책임 분배, 11개)으로 나뉜다. 패턴을 쓰면 설계를 재사용하고 개발자 사이의 소통이 쉬워지지만, 객체지향 설계를 전제로 하고 처음 배우기 어렵다.

비유로 이해하기

요리책의 기본 레시피다. '여러 사람이 같은 냄비 하나를 써야 한다'(싱글톤), '콘센트 모양이 다르면 변환 어댑터를 끼운다'(어댑터), '음식이 다 되면 알림을 받기로 한 사람에게 모두 알려 준다'(옵서버)처럼 이미 검증된 해법이 이름과 함께 정리돼 있다.

자세히

먼저 알아 둘 말

말뜻
GoF디자인 패턴 책을 쓴 네 사람(감마, 헬름, 존슨, 블리시디스)
인스턴스 생성클래스로 객체를 만드는 일
인터페이스외부에 공개된 메서드 목록. 구현은 숨긴다
위임자기가 할 일을 다른 객체에게 맡기는 것

생성 패턴 (5)

패턴핵심
싱글톤인스턴스를 하나만 만든다
팩토리 메서드객체 생성을 하위 클래스가 결정 (생성 메서드를 서브클래스에서 재정의)
추상 팩토리서로 관련된 객체들의 묶음(제품군)을 구체 클래스 지정 없이 만든다
빌더복잡한 객체를 단계별로 조립해 만든다
프로토타입원본 객체를 복제(clone)해 새 객체를 만든다

구조 패턴 (7)

패턴핵심
어댑터맞지 않는 인터페이스를 변환해 함께 쓰게 한다
브리지기능(추상)과 구현을 분리해 각자 확장
컴포지트개별 객체와 복합 객체를 트리 구조로 똑같이 다룬다 (폴더-파일)
데코레이터객체에 기능을 동적으로 덧붙인다 (포장)
퍼사드복잡한 하위 시스템에 단순한 통합 창구를 제공
플라이웨이트같은 객체를 공유해 메모리를 아낀다
프록시대리 객체가 접근을 제어하거나 대신 처리

행위 패턴 (11)

패턴핵심
옵서버한 객체의 상태가 바뀌면 의존 객체들에 자동 통지 (일대다)
전략알고리즘을 캡슐화해 실행 중에 교체
템플릿 메서드상위 클래스가 처리 골격을 정하고 일부 단계를 하위 클래스가 구현
커맨드요청을 객체로 캡슐화 (실행 취소, 대기열)
이터레이터내부 구조를 드러내지 않고 요소를 차례로 접근
상태상태에 따라 객체의 행동을 바꾼다
방문자구조는 그대로 두고 새 연산을 밖에서 추가
중재자객체 간 복잡한 상호작용을 중재자 하나로 모은다
메멘토객체 상태를 저장해 두었다가 되돌린다 (되돌리기)
책임 연쇄요청을 처리할 수 있을 때까지 객체 사슬로 넘긴다
인터프리터언어의 문법을 클래스로 표현해 해석

기출에서 더 나온 것

말뜻
팩토리 메서드상위 클래스는 객체를 만드는 인터페이스만 정하고, 어떤 객체를 만들지는 하위 클래스가 정한다
비지터자료 구조와 처리 기능을 분리해, 구조는 그대로 두고 처리를 바꿀 수 있게 한다 (행위)
브리지기능 계층과 구현 계층을 분리해 각각 독립적으로 확장한다 (구조)
스트래티지알고리즘을 여러 개 캡슐화해 바꿔 끼운다 (행위). 인스턴스 복제는 프로토타입
패턴의 장점구조 파악이 쉽고 재사용으로 시간이 줄며 의사소통이 원활하다. 객체지향과 함께 써야 효과가 크다

시험에 이렇게 나와요

확인 문제

Q1. 클래스의 인스턴스가 오직 하나만 만들어지도록 보장하는 패턴은?

  1. 데코레이터
  2. 프로토타입
  3. 옵서버
  4. 싱글톤
정답 보기

4번 싱글톤

싱글톤(Singleton)은 생성 패턴으로, 인스턴스를 하나만 만들고 어디서나 그 하나에 접근하게 한다. 설정 관리자, 연결 풀 등에 쓴다.

Q2. GoF 디자인 패턴 중 생성 패턴에 속하는 것은?

  1. 옵서버
  2. 어댑터
  3. 퍼사드
  4. 빌더
정답 보기

4번 빌더

빌더는 생성, 어댑터·퍼사드는 구조, 옵서버는 행위.

Q3. 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에 자동으로 알리는 패턴은?

  1. 옵서버
  2. 중재자
  3. 커맨드
  4. 메멘토
정답 보기

1번 옵서버

옵서버 패턴이다. 일대다 의존 관계에서 바뀐 사실을 자동으로 알린다. 메멘토는 상태를 저장했다가 되돌리고, 중재자는 객체 사이 소통을 한곳에 모은다.

Q4. 호환되지 않는 인터페이스를 가진 클래스를 함께 쓸 수 있도록 변환해 주는 패턴은?

  1. 프록시
  2. 데코레이터
  3. 어댑터
  4. 브리지
정답 보기

3번 어댑터

220V 플러그를 110V 콘센트에 꽂는 변환기와 같다.

Q5. 다음 중 구조 패턴이 아닌 것은?

  1. 이터레이터
  2. 플라이웨이트
  3. 컴포지트
  4. 프록시
정답 보기

1번 이터레이터

이터레이터는 행위 패턴이다. 컴포지트·플라이웨이트·프록시는 클래스와 객체를 조합하는 구조 패턴이다.

헷갈리기 쉬운 O·X

프로토타입 패턴은 원본 객체를 복제해 새 객체를 만드는 생성 패턴이다.

정답 보기

O

퍼사드 패턴은 객체에 기능을 동적으로 덧붙이는 패턴이다.

정답 보기

X 그건 데코레이터. 퍼사드는 단순한 통합 창구.

전략 패턴은 행위 패턴에 속한다.

정답 보기

O

함께 보면 좋은 개념