본문 바로가기

전체 글

(98)
[디자인 패턴] 커맨드 패턴 (Command Pattern) - python 예제 코드 커맨드 패턴(Command Pattern)은 객체지향 디자인 패턴의 하나로, 요청을 객체의 형태로 캡슐화하여 실행 가능한 작업으로 만드는 패턴입니다. 이 패턴은 요청을 발신자와 수신자 사이에 있는 객체들을 분리시키며, 이를 통해 요청의 종류, 매개변수, 실행 시점을 제어할 수 있게 됩니다. 1. 커맨드 패턴의 주요 구성요소 Command: 요청을 캡슐화하는 인터페이스. execute() 메소드를 포함합니다. ConcreteCommand: Command 인터페이스를 구현한 구체적인 클래스. 실제 요청을 수행합니다. Receiver: ConcreteCommand 객체에서 요청을 수행하는 객체. Invoker: Command 객체를 생성하고 실행하는 객체. Client: Command 객체를 생성하고 Invo..
[디자인 패턴] 책임 연쇄 패턴 (Chain of Responsibility Pattern) - python 예제 코드 책임 연쇄 패턴은 객체의 처리 요청을 받은 객체가 그 요청을 처리하지 못할 경우 다음 객체에게 책임을 전달하여 처리를 이어가는 디자인 패턴입니다. 이를 통해 객체 간의 결합도를 낮추고 유연성을 높일 수 있습니다. 책임 연쇄 패턴은 보통 객체들이 리스트 형태로 연결되어 있으며, 각 객체는 다음 객체에 대한 참조를 유지합니다. 클라이언트는 요청을 보내고, 첫 번째 객체는 요청을 처리할 수 있는지 검사한 후 요청을 처리할 수 없으면 다음 객체에게 요청을 전달합니다. 이러한 과정을 반복하여 적절한 객체가 요청을 처리할 때까지 진행합니다. 1. 예제 코드 Python으로 구현된 간단한 예제를 살펴보겠습니다. 우리는 로그 메시지를 처리하는 책임 연쇄 패턴을 구현할 것입니다. 로그 메시지에는 세 가지 유형이 있습니다..
[디자인 패턴] 프록시 패턴 (Proxy Pattern) - python 예제 코드 프록시 패턴은 객체 지향 디자인 패턴 중 하나로, 다른 객체에 대한 대리자(proxy)를 제공하여 해당 객체에 대한 간접적인 접근을 가능하게 합니다. 이 패턴은 프록시 객체를 통해 원본 객체에 접근하는 방법을 제어하므로, 프록시 객체를 통해 원본 객체에 대한 접근을 제한하거나, 캐싱, 인증, 로깅 등의 부가 기능을 추가할 수 있습니다. 1. 예제 코드 Python에서는 다음과 같이 프록시 패턴을 구현할 수 있습니다. # 프록시 인터페이스 class Subject: def request(self): pass # 실제 객체 class RealSubject(Subject): def request(self): print("RealSubject의 request() 메서드 호출") # 프록시 객체 class Pro..
[디자인 패턴] 플라이웨이트 패턴 (Flyweight Pattern) - python 예제 코드 플라이웨이트 패턴은 객체를 공유하여 메모리 사용을 줄이는 구조적인 디자인 패턴입니다. 이 패턴은 비용이 큰 객체를 여러 개 생성할 때 유용하며, 객체가 공유 가능한 상태와 고유한 상태를 가지고 있을 때 적용됩니다. 예를 들어, 문자열 처리를 하는 프로그램에서 동일한 문자열이 여러 번 사용된다면, 이를 하나의 객체로 생성하여 공유할 수 있습니다. 이렇게 하면 메모리 사용량이 감소하고, 성능도 향상될 수 있습니다. 1. 예제 코드 파이썬에서는 플라이웨이트 패턴을 구현하기 위해 클래스의 __new__ 메소드를 오버라이딩하고, 객체가 이미 존재하는 경우에는 이를 반환하도록 구현합니다. 이 때, 공유 가능한 객체는 클래스 변수로 선언하고, 고유한 상태는 인스턴스 변수로 처리합니다. 아래는 파이썬으로 구현한 플라이..
[디자인 패턴] 퍼사드 패턴 (Facade Pattern) - python 예제 코드 퍼사드 패턴은 객체 지향 디자인 패턴 중 하나로, 서브시스템의 복잡성을 감소시키기 위해 사용됩니다. 이 패턴은 간단한 인터페이스를 제공하여 서브시스템의 복잡성을 숨기고, 클라이언트와 서브시스템 간의 상호작용을 간소화합니다. 1. 설명 간단한 예를 들어보겠습니다. 가정용 전기 제품을 다루는 프로그램을 개발한다고 가정해봅시다. 이 프로그램에는 다양한 전기 제품이 있고, 각 제품에 대한 제어를 위해 해당 제품의 클래스를 만들어야 합니다. 예를 들어, 전등 클래스, 토스터 클래스, 에어컨 클래스 등이 있을 수 있습니다. 이러한 클래스를 모두 다루는 것은 복잡하고 번거로울 수 있습니다. 이런 경우, 퍼사드 패턴을 사용하여 해당 클래스들을 간단한 인터페이스로 숨길 수 있습니다. 2. 예제 코드 다음은 파이썬 코드 ..
[디자인 패턴] 데코레이터 패턴 (Decorator Pattern) - python 예제 코드 데코레이터 패턴(Decorator Pattern)은 객체 지향 디자인 패턴 중 하나로, 객체에 추가적인 기능을 동적으로 더할 수 있게 해주는 패턴입니다. 이 패턴은 기존 객체를 수정하지 않고도 객체의 기능을 확장할 수 있습니다. 1. 핵심 아이디어 데코레이터 패턴의 핵심 아이디어는 객체를 감싸는 래퍼(wrapper)를 생성하여 이 래퍼 객체가 추가적인 기능을 제공하도록 하는 것입니다. 래퍼는 기존 객체와 같은 인터페이스를 가지며, 기존 객체와 동일한 기능을 제공합니다. 래퍼 객체는 기존 객체에 덧붙여져서 새로운 객체를 형성합니다. 2. 예제 코드 다음은 파이썬으로 작성된 데코레이터 패턴 예제 코드입니다. 이 예제에서는 특정 함수의 실행 시간을 측정하는 기능을 래퍼 객체로 추가하는 예제입니다. import..
[디자인 패턴] 컴포지트 패턴 (Composite Pattern) - python 예제 코드 컴포지트 패턴은 객체지향 디자인 패턴 중 하나로, 객체들을 트리 구조로 구성하여 전체-부분 계층을 나타내는 패턴입니다. 이 패턴은 개별 객체와 복합 객체를 모두 동일하게 취급함으로써 클라이언트 코드의 일관성을 유지하면서 복잡한 계층 구조를 관리할 수 있습니다. 1. 간단한 설명과 구조 예를 들어, 파일 시스템에서 디렉토리와 파일은 모두 파일 시스템 트리의 노드입니다. 디렉토리는 하위 디렉토리와 파일을 가질 수 있으며, 파일은 데이터를 가지고 있습니다. 따라서 디렉토리와 파일을 모두 파일 시스템의 노드로 취급하고, 디렉토리의 경우 하위 노드를 포함하는 복합 객체로 취급하여 계층 구조를 유지할 수 있습니다. 1) 컴포지트 패턴의 구성 Component : Leaf와 Composite 객체가 공통으로 구현해야..
[디자인 패턴] 브릿지 패턴 (Bridge Pattern) - python 예제 코드 브릿지 패턴은 객체 지향 프로그래밍에서 구현하는 패턴 중 하나로, 클래스의 인터페이스와 구현부를 분리하여 두 개를 독립적으로 변경할 수 있도록 하는 디자인 패턴입니다. 이를 통해 시스템이 더욱 유연하고 확장성 있게 구현될 수 있습니다. 1. 두가지 계층 브릿지 패턴은 두 개의 계층으로 이루어집니다. 첫 번째 계층은 추상화 계층입니다. 이 계층은 클라이언트가 사용할 인터페이스를 정의합니다. 두 번째 계층은 구현 계층입니다. 이 계층은 추상화 계층이 정의한 인터페이스를 구현합니다. 추상화 계층과 구현 계층은 서로 독립적으로 변경될 수 있으며, 추상화 계층에서 구현 계층을 참조합니다. 이렇게 하면 구현 계층을 변경하더라도 추상화 계층은 변경되지 않으므로 클라이언트 코드를 수정할 필요가 없습니다. 또한, 구현 ..