생성 패턴
생성 패턴 설명 및 키워드 표
| 패턴 | 설명 | 키워드 |
| 빌더 (builder) 여러단계로 나누어 조립, 분리 |
복잡한 생성 과정을 여러단계로 나누어 처리한다. 최종적으로 다양한 표현을 갖는 객체를 생성할 수 있도록 한다. 코드의 유지보수성과 확장성을 향상시키는데 유용하다. 복잡한 인스턴스를 조립하여 만드는 구조. 생성하는 방법과 구현하는 방법을 분리. 집을 짓는 사람을 연상. 공간을 분리해서 각 공간을 어떻게 꾸밀까 고민하는 빌더. |
생성자, 조립, 분리, 꾸밈 |
| 프로토타입 (prototype) 기존 객체 복제 |
원형을 만들어서 필요한 부분에만 사용하는 패턴. 기존 객체를 복사함으로써 다른 객체를 생성. |
원형, 복사, 생성 |
| 팩토리 메소드 (factory method) 서브클래스가 결정 |
객체 생성을 처리하는 인터페이스를 제공. 실제 객체의 생성은 서브클래스가 결정하도록 위임 1. 상위 클래스에서 객체를 생성하는 인터페이스를 정의. ( 인터페이스는 객체의 행동을 정의하는 것을 말함. 인터페이스를 정의한다는 것은 상위 클래스가 반드시 가져야하는 행동을 정의한다는 의미) 2. 하위 클래스에서 인스턴스를 생성하는 방식. 팩토리에서 제품을 뽑아 낼 때, 기계들을 설치하는 것과 실제 뽑아내야할 제품의 기능은 별개로 정하는 방식. 오버라이딩이 필수인 패턴. 오버라이딩은 상위(부모) 클래스에서 정의된 메소드를 하위(자식)클래스에서 재정의하는 방식을 말하므로, 팩토리 메소드는 인터페이스와 오버라이딩이 주요 키워드이다. * 오버로딩은 동일 메소드가 여러 형태의 매개변수를 가지고 갯수도 다르게 가질 수 있는 것을 말한다는 것도 기억해두기 |
인터페이스, 상속,
오버라이딩, 서브클래스가 결정 |
| 추상 팩토리 (Abstract Factory) 객체 패밀리 생성 인터페이스 |
서로 관련된 객체들의 패밀리를 생성하기 위해 인터페이스를 제공한다. 구체적인 클래스를 명시하지 않아도 객체들을 생성할 수 있다. 구체적인 클래스에 의존하지 않음. ( 즉, 클라이언트 코드가 실제로 사용하는 객체가 어떤 구체적인 클래스인지에 대해 알 필요가 없습니다.) 의존성 역전 원칙(Dependency Inversion Principle, DIP) 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스 제공. (하위 클래스의 객체들의 조합으로 인터페이스를 생성) 생성된 클래스에서는 사용자에게 API를 제공. ( 인터페이스를 통해 일관된 방법으로 객체를 생성하고 조작할 수 있는 메소드를 제공한다는 의미) 구체적인 구현은 Concrete Product(구체적 제품) 클래스에서 이루어짐. 동일한 주제의 서로 다른 팩토리로 묶음. |
관련된 객체 , 의존성, 조합,
인터페이스 |
| 싱글톤 (Singleton) 하나만 생성 |
객체를 하나만 생성하도록 하는 패턴. 전역 변수 사용 불가. ( 전역 변수는 어디서든 사용할 수 있는 변수 이기 때문에 Singleton 구현과 반대됨) 생성된 객체는 어디에서는 참조할 수 있음. 한 클래스에 하나의 객체만을 존재하도록. |
하나, 참조, 전역 |
구조 패턴 암기표
반드시 영문명과 함께 암기해주세요. 한글로 나올 확률은 매우매우 적습니다.
| 패턴명 | 설명 | 핵심키워드 |
| 브릿지(Bridge) 빈출 문제 추상층 분리층 |
추상화와 구현을 분리하여 두 계층이 독립적으로 변화할 수 있게 함. 두 개의 클래스 계층을 분리해 두면 각각의 클래스 계층을 독립적으로 확장할 수 있음 *구현부 클래스와 기능 클래스가 나눠져있다는 것을 가정 구현부 클래스와 기능 클래스를 연결함. 구현부에서 추상 계층을 분리 추상화된 부분과 구현부분을 각각 독립적으로 확장할 수 있음 추상화된 부분도 변경해야하는 경우에 활용 |
구현부, 연결, 확장 |
| 데코레이터 (Decorator) 동적으로 새로운 기능 |
객체에 동적으로 새로운 기능을 추가 코드의 수정 없이 객체의 기능을 확장 할 수 있는 방법을 제공 상속을 사용하지 않고도 기능을 동적으로 확장 *이미 구현되어 있는 클래스가 있음을 가정 이미 구현된 클래스에 필요한 기능을 추가 기능확장이 필요할 때 객체간의 결합을 통해 동적으로 확장 상속의 대안으로 사용함 |
기능 추가, 동적 확장, 상속의 대안 |
| 퍼사이드(facade) 명사 : 무관심 표면, 허울 [본 패턴에서는 "겉보기"와 같은 뜻으로 이해하는 것이 좋음] 복잡한 시스템 단순한 시스템 |
복잡한 시스템을 단순화하는 디자인 패턴 클라이언트는 단일 인터페이스만 사용하고 내부 구현은 숨김 서브시스템 사이의 의사소통 및 종속성을 최소화하기 위하여 단순화된 하나의 인터페이스를 제공 서브시스템의 가장 앞쪽에 위치하면서 서브 시스템에 있는 객체들을 사용할 수 있고록 인터페이스 역할 *이미 복잡한 시스템이 있음 복잡한 시스템에 대하여 단순한 인터페이스 제공 사용자와 시스템(혹은 다른 시스템) 간의 결합도를 낮추는 역할 결합도가 낮아져서 시스템 구조에 대한 파악을 쉽게 하는 패턴 시스템 구조 파악이 쉬워져서 오류를 쉽게 찾음 사용자의 접근성이 높아짐 통합된 인터페이스 제공 |
단순 인터페이스, 낮은 결합도, 구조 파악 |
| 플라이트 (Flyweight) 객체 공유 메모리 절약 |
객체를 공유하여 메모리 절약. 객체 생성이 오래걸리거나 많을 것 같을 때 활용 *하나의 클래스에 다수의 객체가 있다는 가정 다수의 객체를 생성한다면, 각 객체를 각 클래스로 생성하도록 클래스화 목적은 경량화(Flyweight) 메모리 절약 -> 경량화 여러개의 가상 인스턴스를 제공 |
경량화, 메모리 절약, 가상 인스턴스 |
| 프록시(Proxy) 빈출 문제 대리, 중개 |
다른 객체에 대한 접근 제어/중개하는 디자인 패턴 특정 객체의 대리자나 대변인 역할을 하는 프로시 객체 *미리해도 상관없는 일을 미리 해주는 거, 알바처럼 나를 대리해주는 패턴 실제 객체를 대리하는 객체 생성 실제 객체를 접근하기 전에 미리 생성해도 상관없는 객체를 생성함. 이로써 메모리를 아끼게됨 실체 객체를 드러내지 않으므로 정보 은닉화가 가능함. 특정 객체로의 접근을 제어하기 위한 용도 |
대리 객체, 메모리 절약, 정보 은닉 |
| 컴포사이트 (Composite) 트리구조 |
객체들을 어떠한 구조가 좋을까 생각하다 합성(composite)하는 방법을 선택 객체 관계를 Tree 구조로 구성함. 그럼 부분(Part)-전체(whole) 부분으로 구분됨 Tree이므로 계층 구조임 단일객체와 복합 객체 모두 동일하게 다룰 수 있음 복합 객체와 단일 객체를 동일하게 취급함 |
합성, 트리 구조, 동일 취급 |
| 어답터 (Adapter) |
호환되지 않는 인터페이스를 가진 클래스들이 함께 작동할 수 있음 클라이런트에서 요구하는 다른 인터페이스로 변환 한 클래스에서 요구하는 다른 인터페이스로 변환 두 인터페이스 간의 호환성 문제를 해결하여, 코드 변경없이 기존 클래스를 사용 이미 만들어져 있는 클래스를 사용하고 싶지만 인터페이스가 원하는 방식과 일치하지 않을 때. 혹은 관련성이 없거나 예측하지 못한 클래스들과 협동하는 재사용가능한 클래스를 생성하기를 원할 때 어댑터, 말그대로 무언가를 중간에서 바꿔주거나 맞춰주는 역할 중간에서 맞춰주기 위해서 인터페이스를 제공함. 클래스패턴(상속)과 인터페이스(위임) 두 가지 형태로 사용되는 패턴 인터페이스가 호환되지 않을 때, 타 클래스의 인터페이스를 기존 인터페이스에 덧씌우는 방법 5핀 충전 포트에 C 타입 충전 어댑터를 씌워서 C타입으로 충전 |
호환성, 중간 맞춤, 인터페이스 |
행위 패턴 암기표 키워드
| 패턴명 | 설명 | 키워드 |
| Mediator *빈출 상호작용, 중재자 |
여러 객체 간의 상호작용을 중앙집중적으로 관리 객체 간의 통제와 지시의 역할을 하는 중재자를 두어 객체지향의 목표를 달성 여러 객체들이 서로 메시지를 주고 받는 상호작용을 특정 객체 안에서 캡슐화하여 서로의 존재를 모르는 사애에서도 메시지를 주고받으며 협력할 수 있도록 함. 객체 수가 많아 복잡해진 상태를 가정 복잡해지면 느슨한 결합을 유지하기가 어려움 중재자가 통신빈도를 줄임 상호작용의 유연한 변경을 지원 |
중재자, 중간에서 통재, 상호작용 |
| interpreter (한글 뜻 : 통역사) 해석 |
문법 규칙을 기반으로 문장을 해석 프로그래밍 언어의 문법을 해석 언어의 다양한 해석구체적 구문을 나누고 그 분리되 구문의 해석을 맡는 클래스를 각각 작성 해석을 클래스를 작성했기 때문에 여러형태의 언어 구문을 해석 문법 자체를 캡슐화하여 사용 |
언어 구문, 해석, 캡슐화 |
| iterator (반복자) 요소들을 순차적으로 접근 |
컬렉션의 요소들을 순차적으로 접근하고 처리할 수 있음 집합 객체의 요소들에 대해 순서대로 접근하는 방법 제공 배열, 배열리스트, 해시 테이블과 같은 객체를 처리하는 데 사용하는 패턴 서로 다른 집합 객체 구조에 대해 동일한 방법으로 순회 내부구조를 노출하지 않고 복잡한 객체들의 원소들을 순차적으로 접근 가능하게 해주는 행위 패턴 모든 항목에 접근하는 방법 컬렉션 구현 방법 노출 X 하지만, 그 집합체에 모든 항목에 접근 |
i는 반복에서 많이 쓰이는 약어 |
| Templete method (생성의 factory method와 헷갈리면 안됨!) 알고리즘 (State와 유사) 하위 클래스 구체 구현 |
알고리즘의 핵심적인 골격은 그대로 유지하면서, 일부 단계는 하위 클래스에서 구체적으로 구현 코드의 양을 줄이고 유지보수를 용이하게 하는 패턴 어떤 처리를 하는 일부분을 서브 클래스로 캡슐화 전체 수행하는 과정은 바꾸지 않음 특정 단계에서 수행하는 내역을 바꿈 추상 클래스에서는 골격을 제공, 하위 클래스의 메서드에는 세부처리를 구체화하는 방식 * 상위 구조는 바꾸지 않으면서 서브 클래스로 작업의 일부분 수행 |
알고리즘, 서브 클래스, 캡슐화, 추상-골격, 하위-세부처리 |
| Observer *빈출 상태변화 알림 |
객체의 상태 변화를 관찰하고 싶은 다른 객체들에게 자동으로 알림. 일대다의 객체 의존 관계를 정의하며, 한객체의 상태가 변화되었을 때, 의존관계에 있는 다른 객체들에게 자동적으로 변화를 통지한다. 한 객체의 상태가 바뀌는지 염탐하다가, 바뀌면 그 객체에 의존하는 객체들에게 연락 자동으로 내용이 갱신되는 방법 |
연락, 갱신 |
| State 내부 상태->객체 동작 |
객체 내부 상태에 따라 객체의 동작을 변경 객체 상태에 따라 객체의 행위 내용을 변경해주는 패턴 객체의 상태를 캡슐화 캡슐화한 상태를 참조하게함 상태에 따라 다르게 처리할 수 있도록 행위 내용을 변경 |
상태 캡슐화 |
| visitor *빈출 생성패턴의 빌더와 유사 새로운 연산 추가 |
객체 구조를 변경하지 않고 객체에 새로운 연산 추가 데이터 구조에서 처리 기능을 분리 분리한 처리 기능을 별도의 클래스로 만들어둠 이 클래스의 메서드가 각 클래스를 돌아다니면서 특정 작업을 수행 객체의 구조는 변경하지 않으면서 기능만 따로 수행할 수 있음 특정한 구조를 가지는 복합 객체의 각 원소 특성에 따라 동작을 수행할 수 있도록 하는 지원 행위 |
새로운 연산 추가, 돌아다님, 기능만 수행 |
| Command 요청 객체로 캡슐화 요청자, 처리자 |
요청을 객체로 캡슐화하여 요청자와 처리자를 분리 명령, 요청자, 클리이언트, 수신자로 구분 실행기능을 캡슐화 -> 주어진 여러 기능을 실행 재사용성 높음 추상 클래스에 메서드를 만들어두고 각 명령에 따라 서브 클래스를 선택되어 실행됨 *요구사항에 맞게 특정 객체로 캡슐화 |
요청자, 처리자 |
| Strategy *빈출 알고리즘 |
알고리즘 군을 정의하고 같은 알고리즘을 각각 하나의 클래스에 캡슐화필요할때 서로 교환해서 사용할 수 있게 하는 패턴 동적으로 행위를 자유롭게 바꿀 수 있는 패턴 행위 객체를 캡슐화하여 동적으로 행위를 자유롭게 변환 알고리즘을 객체로 캡슐화하고, 알고리즘을 선택하고 실행하는 방법을 제공. |
알고리즘 군 |
| Memento 저장하고 복원 |
객체의 이전 상태를 저장하고 복원할 수 있도록 함 클래스설계 관점객체 정보를 저장할 필요가 있을 때 적용 undo 기능을 개발할 때 필요한 패턴 객체를 이전 상태로 복구시켜야하는 경우, 작업 취소(Undo) 요청 가능 |
저장하고 복원, 클래스 관점, Undo |
| Chain of Responsibility 체인형태 |
요청을 처리하는 객체들을 체인 형태로 연결하여 요청을 순서대로 전달 객체는 요청을 처리할 수 있는지 판단하고, 처리할 수 없으면 다음 객체로 전달 개발 할때, 정적으로 기능을 하드 코딩하면 기능 처리 연결 수정(변경)이 불가함 이를 동적으로 연결되어 있는 경우에 대해 다르게 처리 될 수 있도록 연결한 디자인 패턴 한 요청을 2개 이상의 객체에서 처리 |
2개 이상의 객체 |