본문 바로가기

분류 전체보기

(44)
[Python] 메타클래스(Meta Class) 이해하기 파이썬에서는 모든 것이 객체다. 파이썬 프로그램에서는 모든 데이터는 객체 개념을 사용하여 저장됩니다.가장 기본적인 데이터 타입인 숫자, 문자열, 리스트, 사전 뿐만 아니라 함수, 모듈, 심지어 클래스조차도 객체입니다.즉, 우리가 작성하는 클래스도 어떤 방식으로든 생성이 되고 관리되는 대상이라는 것입니다.예를 들어서 아래와 같은 코드를 보면class Foo: pass print(type(sampleClassA)) # Foo는 사용자가 정의한 클래스이지만 실제로는 type 이라는 이름의 객체에 의해 생성된 것으로 확인할 수 있습니다.다시 말해서 클래스 자체도 객체이며, 클래스를 생성하는 다른 존재가 있다는 것을 알 수 있습니다.이 역할을 하는 것이 바로 메타클래스(Metaclass)입니다.인스턴스를 만..
[Design pattern] 프록시(Proxy)패턴 프록시(Proxy) 패턴 프록시(Proxy) 패턴은 다른 객체에 대한 접근을 제어하거나 감싸서 기능을 추가하는 구조적 패턴입니다.즉, 진짜 객체 앞에 대리 객체를 두어 대신 동적하거나, 조건부로 실행을 제어하는 패턴입니다.프록시 패턴은 다음과 같은 경우에 사용됩니다.무거운 객체의 지연 로딩이 필요할 때접근제어를 붙이고 싶을 때로깅, 캐싱, 트래픽 제한 등 부가 기능을 추가하고 싶을 때프록시 패턴은 다음과 같은 요소로 구성되어 있습니다. Subject (주제, 인터페이스)프록시와 실제 객체가 공통으로 구현해야할 인터페이스입니다.클라이언트는 이 인터페이스를 통해 객체를 조작합니다.클라이언트 입장에서 프록시인지 본체인지 알 필요 없이 일관되게 사용할 수 있게 해줍니다. RealSubject(실제 객체)실제로 ..
[Design pattern] 플라이웨이트(Flyweight)패턴 플라이웨이트(Flyweight) 패턴플라이웨이트 패턴은 동일하거나 유사한 객체들 사이에 가능한 많은 데이터들을 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 디자인 패턴입니다.플라이웨이트 패턴은 아래와 같은 경우에 사용합니다.같은 속성을 가진 객체가 반복적으로 만들어 질 때이미지, 폰트, 게임 캐릭터 등 대량의 객체를 생성해야하는 경우데이터 중 일부만 변경되고 대부분 공통 속성을 공유할 수 있을 때플라이웨이트 패턴은 다음과 같은 요소로 이루어져있습니다.Flyweight (공유 객체)자주 바뀌지 않는 공통 속성을 저장하는 객체입니다.여러 객체들이 공유해서 사용하는 대상입니다. Flyweight Factory공유 객체를 생성하고 캐싱하는 클래스입니다.요청이 들어오면 캐시에 동일할 객체가 있는지 확..
[Design pattern] 퍼사드(Facade)패턴 퍼사드(Facade) 패턴퍼사드(Facade) 패턴은 복잡한 서브시스템의 내부 구현을 감추고, 외부에서는 간단한 인터페이스 하나만 제공하는 구조 패턴입니다. 쉽게 말해 복잡한 시스템을 감추고, 단순하게 사용할 수 있게 해주는 ‘외벽’ 같은 클래스라고 보면 됩니다.퍼사드 패턴은 다음과 같은 경우에 사용합니다.클라이언트가 내부 구조를 몰라도 기능을 편하게 사용할 수 있게 하고 싶을 때여러 모듈/클래스의 조합을 하나의 단일 진입점으로 묶고 싶을 때라이브러리나 레거시 시스템의 사용법이 복잡할 때 간단한 인터페이스를 덧씌우기 위해퍼사드(Facade) 패턴 예제비디오스트리밍 시스템을 시나리오로 퍼사드 패턴에 대해 간단하게 알아보도록 하겠습니다.동영상을 재생하기 위해서는 실제로는 디코더, 버퍼, 오디오/비디오 동기화..
[Design pattern] 데코레이터(Decorator) 패턴 데코레이터(Decorator) 패턴데코레이터(Decorator) 패턴은 기존 객체를 변경하지 않고 런타임에 동적으로 기능을 추가할 수 있게 하는 구조패턴입니다. 데코레이터 패턴은 다음과 같은 경우에 사용합니다.기존 클래스를 수정하지 않고 기능을 확장하고 싶을 때클래스 수가 너무 많아지는 상속 방식 대신 조합을 쓰고 싶을 때여러 기능을 동적으로 조합하고 싶을 경우 데코레이터 패턴은 위와 같은 핵심 구성요소로 나뉘어져 있습니다.각각의 요소에 대해 설명하자면 아래와 같습니다.Component : 모든 객체가 따라야 할 기본 기능을 정의하는 인터페이스, 데코레이터와 컴포넌트가 이를 구현함ConcreteComponent : 기본 기능을 실제로 구현하는 개체Decorator : 데코레이터 인터페이스, 새로운 기능을..
[Design pattern] 컴포지트(Composite) 패턴 컴포지트(Composite) 패턴컴포지트(Composite)패턴은 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 형태로 개별 객체와 복합 객체를 동일하게 다룰 수 있도록 만드는 구조 패턴입니다. 컴포지트 패터은 다음과 같은 경우에 사용합니다.트리 구조(예: 파일/디렉토리, 조직도, 메뉴 구조)를 다룰 때단일 요소와 복합 요소를 동일한 방식으로 처리해야 할 때재귀적으로 동작하거나 계층적인 처리를 구현할 때컴포지트 패턴 구조 컴포지트 패턴은 3가지 구성 요소로 이루어져있습니다.Component Leaf와 Composite 모두가 구현해야할 공통 메소드들을 정의함Leaf 하위 요소를 포함하지 않는 가장 기본 단위(실제 객체)Composite다른 Component 객체들을 자식으로 보유하며, ..
[Design pattern] 브릿지 패턴(Bridge) 패턴 브릿지 (Bridge) 패턴브릿지(Bridge) 패턴은 추상화와 구현을 독립적으로 분리하여 각각을 독립적으로 확장 가능하게 만드는 구조입니다.쉽게 말하면 기능의 계층과 구현의 계층을 따로 분리해서, 서로 독립적으로 확장할 수 있도록 하는 디자인 패턴입니다. 추상화 계층시스템에서 무엇을 할 것인가에 대한 정의 즉, 사용자 입장에서의 기능/행위를 다루는 계층입니다.추상화 계층은 클라이언트에서 사용할 인터페이스를 정의합니다. 구현 계층시스템에서 어떻게 할 것인가에 대한 정의 즉, 실제 동작을 담당하는 계층입니다.추상화 계층에서 정의한 인터페이스를 구현합니다. 브릿지 패턴을 사용하는 이유는 아래와 같습니다클래스 상속으로 기능을 확장하면 클래스 폭발 문제가 발생합니다.기능과 구현을 따로 두면 유지보수와 확장성에 ..
[Design pattern] 어댑터(Adapter) 패턴 어댑터(Adapter) 패턴어댑터 패턴은 서로 다른 인터페이스를 가진 객체들을 연결해주는 디자인 패턴입니다. 기존 클래스의 인터페이스가 현재 요구사항과 맞지 않을 때, 중간에 어댑터를 끼워서 호환성을 맞추는 역할을 합니다. 이를 통해 인터페이스가 호환되지 않는 클래스들이 함께 작동할 수 있습니다.어댑터 패턴은 다음과 같은 경우에 사용합니다기존 코드(또는 외부 라이브러리)의 인터페이스를 변경하지 못할 때레거시 코드와 신규 코드가 함께 작동해야할 때API, DB, 서드파티 모듈 등 외부 시스템을 기존 시스템에 맞게 감싸야할 때어댑터 패턴 사용 예제어댑터 패턴을 설명하기 위해 간단한 로그시스템으로 예제를 구성하였습니다.기존 프로젝트는 최근 방식의 Logger.log(message) 인터페이스를 사용하지만, 오..