GoF 디자인 패턴

정보처리실무 · 소프트웨어 설계

이 페이지의 목차

학습 목표

패턴 이름보다 바꾸려는 대상과 객체 사이 역할을 먼저 찾는다.

본문

핵심 이론

생성 패턴: 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(요소별 연산 분리).

Adapter와 Bridge는 각각 기존 규격 호환과 독립 확장이 목적이다. Strategy는 알고리즘 교체, State는 상태 변화에 따른 행동이다. Factory Method와 Abstract Factory는 생성 결정의 위임과 제품군 생성이라는 차이를 본다.

패턴은 해결하려는 변화에서 출발한다

생성은 객체를 만드는 방법, 구조는 객체를 연결하는 방법, 행위는 책임과 협력을 나누는 방법에 초점을 둔다. 문제의 동사에 밑줄을 긋듯 표시하면 이름을 회상하기 쉽다. 변환한다·감싼다·공유한다·통지한다·교환한다는 서로 다른 설계 목적이다.

혼동하는 패턴결정적인 구별
Adapter / Facade기존 규격을 맞춤 / 여러 기능의 간단한 창구
Bridge / Adapter두 변화 축을 독립 확장 / 기존 규격 불일치 해결
Strategy / State알고리즘 교환 / 상태에 따른 행동 변화
Factory Method / Abstract Factory생성 결정을 하위 타입에 위임 / 관련 제품군 생성
Composite / Flyweight부분·전체를 같은 방식으로 처리 / 공통 상태 공유

할인 계산 객체를 바꿔 끼우는 사례라면 교환 가능한 알고리즘이므로 Strategy다. 구독한 객체들에게 값 변경을 알리면 Observer다. 요청을 객체로 만들어 실행·보관·취소의 단위로 다루면 Command다. 한 사례를 여러 패턴 이름으로 무작정 나열하지 말고 지문이 강조한 목적 하나를 선택한다. 장문 구현을 암기하는 대신 이 비교와 핵심 단서를 익힌다.

풀이 예시

배송 요금 계산기는 거리 기반, 무게 기반, 정액 계산 객체 중 하나를 주입받는다. 계산기는 공통 cost()만 호출하고 실행 중에 계산 객체를 다른 것으로 교체할 수 있다. 알고리즘들을 같은 계약 아래 교환 가능하게 만든 패턴을 쓰시오.

정답과 풀이 보기

예시 정답

예시·텍스트
Strategy

풀이 과정

서로 다른 계산 알고리즘을 캡슐화하고 공통 인터페이스를 통해 선택·교체하는 전략 패턴이다. 객체 내부 상태 전이에 따라 행동이 바뀌는 State 패턴을 묻는 상황이 아니다.

Proxy·Iterator·Singleton 구별

패턴대분류핵심 판단 기준헷갈리기 쉬운 비교
Proxy(프록시·대리자)구조실체와 같은 계약의 대리 객체가 접근 권한 검사, 지연 생성 등 실체 접근을 통제한다.Adapter는 다른 호출 계약을 맞춘다. Facade는 여러 하위 기능을 단순한 통합 호출로 감싼다.
Iterator(반복자)행위집합의 내부 표현을 숨긴 채 순회 위치를 가진 객체로 요소를 차례로 방문한다.집합의 저장 구조와 탐색 책임을 분리한다.
Singleton(싱글턴)생성지정한 범위에서 인스턴스를 하나로 제한하고 접근점을 제공한다.단일 프로세스 안의 생성 통제가 여러 서버 전체의 단일성까지 자동 보장하지는 않는다.

구조가 비슷해 보일 때는 중간 객체의 존재만 보지 말고 목적을 확인한다. 접근 제어는 Proxy, 인터페이스 변환은 Adapter, 순회 책임은 Iterator, 인스턴스 생성 제한은 Singleton이다.