GoF 23 가지 패턴
생성(Creational) 패턴
추상 팩토리(Abstract Factory) 패턴
여러 개의 연관된 객체를 생성하기 위한 인터페이스를 제공하는 패턴으로, 서로 관련성 있는 객체들을 일관성 있게 생성할 수 있도록 해준다. 구체적인 클래스를 지정하지 않고도 객체를 생성할 수 있으며, 구체 팩토리를 통해 구체 객체를 생성한다. 객체의 생성과 구현을 분리하여 시스템이 유연하게 확장되고, 상호 운용성이 좋아진다.
빌더(Builder) 패턴
복잡한 객체의 생성 과정을 단순화하기 위한 패턴으로, 객체 생성 과정을 단계별로 나누어 캡슐화하여 구현한다. 이를 통해 객체 생성 과정의 다양한 구현 방식을 제공하고, 동일한 생성 과정을 가진 다양한 객체를 생성할 수 있다.
팩토리 메서드(Factory Method) 패턴
객체를 생성하는 인터페이스를 정의하고, 이를 하위 클래스에서 구현하여 객체를 만드는 패턴이다. 객체 생성 코드를 별도의 클래스로 분리하여 결합도를 낮추고, 유연성을 높인다. 또한, 객체 생성 로직을 추상화하므로, 코드의 재사용성과 유지보수성이 좋아진다.
싱글톤(Singleton) 패턴
클래스의 인스턴스를 하나만 생성하고, 이를 전역에서 접근할 수 있도록 하는 패턴이다. 어디서든 하나의 인스턴스에 접근할 수 있어서, 시스템 전역에서 공유할 수 있는 객체를 만들기 위해 사용된다. 또한, 고정적인 메모리 영역을 할당하여 객체 생성 비용을 줄일 수 있다.
프로토타입(Prototype) 패턴
생성할 객체의 종류가 많은 경우, 객체를 생성하는 비용을 줄이기 위해 사용하는 패턴이다. 이미 생성된 객체를 복제하여 새로운 객체를 생성하는 방식으로, 객체 생성 비용이 많이 드는 경우에 효과적이다. 객체 생성 비용이 높은 경우, 새로운 객체를 만들기 위해 기존 객체를 복제하면 속도와 성능 면에서 이점을 얻을 수 있다.
구조(Structural) 패턴
어댑터(Adapter) 패턴
어댑터 패턴은 호환되지 않는 두 인터페이스를 연결해주는 구조 패턴이다. 즉, 기존 클래스의 인터페이스를 클라이언트가 요구하는 다른 인터페이스로 변환해주는 역할을 한다. 이를 통해 클라이언트는 호환되지 않는 인터페이스를 사용할 수 있게 되어 유연성과 재사용성이 향상된다. 예를 들어, 각기 다른 두 개의 클래스가 있고 이들의 인터페이스가 호환되지 않을 때, 어댑터 클래스를 사용하여 이 두 클래스를 연결하여 호환성을 확보할 수 있다.
브리지(Bridge) 패턴
브리지 패턴은 추상화와 구현을 분리하여 서로 독립적으로 변경할 수 있도록 하는 구조 패턴이다. 추상화와 구현이 분리되어 있기 때문에 구현의 변경이 추상화 부분에 영향을 주지 않는다. 예를 들어, 기능과 구현을 분리하여 기능이 변경되어도 구현부분을 변경하지 않아도 되는 경우에 브리지 패턴을 사용할 수 있다.
복합체(Composite) 패턴
복합체 패턴은 객체들의 관계를 트리 구조로 구성하여 전체-부분 계층을 표현하는 패턴이다. 개별 객체와 복합 객체를 모두 같은 방법으로 다룰 수 있도록 하여 사용자가 개별 객체와 복합 객체를 구분하지 않고 사용할 수 있도록 한다. 예를 들어, 디렉토리와 파일을 포함하는 파일 시스템의 경우 디렉토리와 파일 모두 파일 객체로 처리하여 다룰 수 있다.
데코레이터(Decorator) 패턴
데코레이터 패턴은 객체의 기능을 동적으로 추가하거나 변경할 수 있게 해주는 패턴이다. 객체에 기능을 추가하기 위해 상속을 사용하지 않고, 객체를 래핑하여 기능을 추가하는 방식으로 구현한다. 이를 통해 객체의 기능을 유연하게 확장할 수 있다. 예를 들어, 여러 가지 커피를 주문할 때, 기본 커피 객체에 샷이나 시럽 등을 추가하여 주문할 수 있다.
퍼사드(Facade) 패턴
복잡한 시스템에서 서브시스템들의 복잡한 인터페이스를 간단하게 제공하는 패턴이다. 각 서브시스템에 대해 하나의 통합된 인터페이스를 제공함으로써, 사용자는 간단하게 시스템과 상호작용할 수 있다.
플라이웨이트(Flyweight) 패턴
많은 수의 객체를 생성하고 유지보수하는 것이 부담스러울 때 사용하는 패턴이다. 객체를 가능한 한 공유하여 메모리 사용을 최적화한다. 즉, 객체의 공통적인 부분을 공유하고, 나머지 부분은 외부에서 전달받아 처리하는 방식이다.
프록시(Proxy) 패턴
다른 객체에 대한 대리자 또는 자리채움자 역할을 하는 패턴이다. 클라이언트는 객체에 직접 접근하지 않고 프록시를 통해 간접적으로 접근함으로써 객체의 동작을 제어할 수 있다. 예를 들어, 객체에 대한 접근 제어, 객체의 생성 시간을 줄이기 위한 늦은 초기화(Lazy Initialization), 객체의 캐싱 등의 기능을 구현할 수 있다.
행위(Behavioral)패턴
책임 연쇄(Chain of Responsibility) 패턴
여러 개의 객체가 책임 처리를 처리하는 패턴으로, 요청을 보내는 객체와 이를 받아 처리하는 객체들이 서로의 연결고리를 가지며, 각 객체가 요청을 처리할 수 없으면 다음 객체에게 책임을 전달한다. 이를 통해 객체들의 결합도를 낮추고, 유연한 처리가 가능해진다.
명령(Command) 패턴
요청을 객체의 형태로 캡슐화하여 저장하거나, 다른 객체에 전달하고, 나중에 이를 실행할 수 있는 패턴이다. 객체 간의 호출을 명령이라는 객체로 분리하여 요청을 수행할 객체, 요청 자체, 요청의 매개변수를 객체화한다. 이를 통해 요청을 처리하는 객체와 요청을 생성하는 객체의 결합도를 낮출 수 있다.
해석자(Interpreter) 패턴
주어진 언어의 문법 규칙을 클래스화하여 구현하는 패턴으로, 특정한 형태의 입력 언어를 해석하는 역할을 한다. 언어의 각 구문을 표현하는 클래스들로 구성되며, 이들 클래스는 해석할 입력 언어의 구문으로 구성된 추상 구문 트리(Abstract Syntax Tree)를 생성하고, 해당하는 연산을 수행한다.
반복자(Iterator) 패턴
컬렉션의 내부 구조에 상관없이 요소를 열거하고, 순차적으로 접근할 수 있는 인터페이스를 제공하는 패턴이다. 객체의 집합에서 원소를 하나씩 접근하며, 전체 구조를 알 필요 없이 원소를 반복적으로 처리할 수 있다. 이를 통해 집합체와 반복자를 분리하여 구현함으로써, 구조에 대한 의존성을 제거하고, 유연성을 높일 수 있다.
중재자(Mediator) 패턴
여러 객체 간의 상호작용을 캡슐화하여 객체 사이의 직접적인 상호작용을 피하고, 중개자 객체를 통해 간접적으로 상호작용할 수 있도록 해주는 패턴이다. 객체 간 결합도를 낮추고 유지보수성과 재사용성을 향상시키며, 객체 간의 복잡한 상호작용을 단순화시키는 효과가 있다.
메멘토(Memento) 패턴
객체의 상태를 저장하고 이전 상태로 복원할 수 있는 메커니즘을 제공하는 패턴이다. 객체의 상태를 외부에 노출하지 않고 내부적으로 관리하여 캡슐화를 유지할 수 있다. 상태 저장 기능과 복원 기능을 분리하여 객체의 불변성을 보장할 수 있고, 특히 객체의 상태를 변경한 후에도 원하는 이전 상태로 돌아갈 수 있도록 하는 기능이 있다.
감시자(Observer) 패턴
한 객체의 상태 변화에 따라 다른 객체들도 함께 상태를 업데이트할 수 있도록, 객체 간의 일대다 의존 관계를 구성하는 패턴이다. 주체(Subject)와 감시자(Observer) 객체로 구성되며, 주체 객체의 상태가 변경되면 해당 상태에 관심을 가진 모든 감시자 객체에게 변경 내용을 알리고, 감시자 객체는 이를 받아서 적절한 처리를 수행한다. 객체 간의 결합도를 낮추고 유연성과 확장성을 높일 수 있다.
상태(State) 패턴
객체의 내부 상태에 따라 객체가 수행하는 행위를 변경할 수 있도록, 상태를 객체화하여 상태에 따른 행위를 캡슐화하는 패턴이다. 상태를 클래스로 정의하고, 각 상태에서 수행할 행위를 메서드로 구현하여 객체의 행동을 정의한다. 상태 객체를 캡슐화하여 코드 중복을 줄이고, 새로운 상태를 추가하거나 기존 상태를 변경하는 일이 발생해도 코드 수정을 최소화할 수 있다.
'잡다한 것' 카테고리의 다른 글
정처기 역대 합격률 및 시험전날 마지막 정리 (0) | 2023.04.22 |
---|---|
2023 정처기도전-6 (0) | 2023.04.22 |
2023 정처기 도전-4 (0) | 2023.04.21 |
2023 정처기 도전-3 (0) | 2023.04.21 |
대표적인 테스트 기법의 종류 (0) | 2023.04.20 |