python

    [Design patterns] Proxy Pattern (프록시 패턴)

    [Design patterns] Proxy Pattern (프록시 패턴)

    Introduction 구조 시스템 패턴 시리즈의 완결까지 본 글을 포함해 두 편 남았다! 이번에 소개할 디자인 패턴은 Proxy 패턴이다. Proxy 패턴을 한줄 요약하면 다음과 같다. 어떤 오브젝트로의 접근을 중간에서 제어하기 위한 대리자 (proxy) 오브젝트를 제공한다. 본 글의 많은 부분은 에릭 감마의 GoF Design Pattern 서적에서 참고했고, 파이썬에 맞추어 살짝씩 내용을 변경한 부분이 있다. Motivation 어떤 오브젝트의 생성 코스트가 너무 커서, 전체 시스템을 처음 구성할 때에 바로 생성하지 않고 그것이 실제로 필요할 때 까지 잠시 생성을 미루어야 할 때가 있다. 프록시 패턴은 어떤 오브젝트의 접근을 가로챈 후 그 오브젝트가 놓여야 할 곳에 대신 자리를 차지함으로써, 원래 ..

    [Design patterns] Facade Pattern (퍼사드 패턴)

    [Design patterns] Facade Pattern (퍼사드 패턴)

    Introduction 구조 시스템 패턴을 다루는 과정에서 패턴 이름들이 알파벳 순서로 나열되었던 게 좋았었는데 (Adapter, Bridge, Composite, Decorator), 이번엔 E로 시작하는 패턴이 나올 차례지만 안타깝게도 그런 디자인 패턴은 없다... 이번 글에서는 눈물을 머금고 알파벳 한 자리를 건너뛰어 Facade 패턴에 대해 소개하고자 한다. Facade 패턴을 한줄 요약하면 다음과 같다. 복잡한 시스템을 더 쉽게 사용하기 위한 high-level의 인터페이스를 제공한다. 본 글의 많은 부분은 에릭 감마의 GoF Design Pattern 서적에서 참고했고, 파이썬에 맞추어 아주 살짝씩 변경한 부분이 있다. Motivation 시스템을 여러 서브시스템으로 나누는 식으로 전체 시스템..

    [Design patterns] Decorator Pattern (데코레이터 패턴)

    [Design patterns] Decorator Pattern (데코레이터 패턴)

    Introduction 오늘 소개할 내용은 데코레이터 (Decorator) 패턴으로, 그 기능을 요약하자면 다음과 같다. 클래스 내용을 수정하지 않으면서 동적으로 오브젝트에 기능을 추가할 수 있다. 본 글의 많은 부분은 에릭 감마의 GoF Design Pattern 서적에서 참고했고, 파이썬에 맞추어 아주 살짝씩 변경한 부분이 있다. Motivation 전체 클래스 오브젝트의 동작을 수정하는 대신 특정 오브젝트에만 어떤 기능을 동적으로 추가해야 할 때가 있다. 즉, 기존에 작성된 클래스 코드를 전혀 건드리지 않으면서도 새로운 기능을 자유롭게 얼마든지 추가할 수 있으며, 기능이 추가되어도 외부에서는 기존 오브젝트와 동일하게 상호작용 할 수 있어야 한다. 코드 수정 없이 기능을 추가하기 위해 기존 클래스를 ..

    [Design patterns] Composite Pattern (컴퍼짓 패턴)

    [Design patterns] Composite Pattern (컴퍼짓 패턴)

    Introduction GoF 디자인 패턴 중 structural pattern (구조 패턴) 들을 하나씩 다루고 있는데, 이제 한 절반쯤 왔다. 이번에 소개할 내용은 Composite 패턴으로, 한줄로 요약하자면 다음과 같다. 오브젝트를 트리 구조로 구성해 계층 구조를 표현하는 동시에, 개별 오브젝트와 오브젝트의 composition을 동일한 방식으로 다룰 수 있게 한다. 본 글의 많은 부분은 에릭 감마의 GoF Design Pattern 서적에서 참고했고, 파이썬에 맞추어 아주 살짝씩 변경한 부분이 있다. Motivation 단순한 기능을 하는 작은 오브젝트를 모아 큰 오브젝트를 구성하고, 이들을 다시 동일한 방식으로 모아 더 큰 단위의 오브젝트를 구성해야 하는 경우가 있다. 예를 들어, Point-..

    [Design patterns] Bridge Pattern (브릿지 패턴)

    [Design patterns] Bridge Pattern (브릿지 패턴)

    Introduction 이번 글에서는 또다른 structural pattern (구조 패턴) 인 브릿지 패턴에 대해 소개하고자 한다. 브릿지 패턴은 인터페이스와 실제 구현을 분리해, 각각이 독립적으로 수정될 수 있도록 도와준다. 본 글의 많은 부분은 에릭 감마의 GoF Design Pattern 서적에서 참고했고, 파이썬에 맞추어 아주 살짝씩 변경한 부분이 있다. Motivation 인터페이스는 동일하게 유지한 채로, 실제 기능은 여러 가지 방식으로 구현하고 싶을 땐 다음과 같은 방법을 사용할 수 있다. 먼저 추상 클래스 (abstract class) 를 정의해 인터페이스를 설정한다 (추상화, abstraction). 이후엔, 그것을 상속하는 실체 서브클래스 (concrete subclasses) 들에선..

    [Design patterns] Adapter Pattern (어댑터 패턴)

    [Design patterns] Adapter Pattern (어댑터 패턴)

    Introduction 이번 글에서는 structural pattern (구조 패턴) 중 하나인 어댑터 패턴에 대해 소개하고자 한다. 어댑터 패턴에 대해 요약하자면, 현재의 클래스 인터페이스 X를 요구되는 인터페이스인 Y로 변환해 주는 디자인 패턴이라 할 수 있다. 본 글의 많은 부분은 에릭 감마의 GoF Design Pattern 서적에서 참고했고, 파이썬에 맞추어 아주 살짝씩 변경한 부분이 있다. Motivation 재사용을 위해 작성해놓은 툴킷 클래스가, 실제로 그것을 사용하는 쪽에서 요구하는 특수한 인터페이스를 가지고 있지 않아 사용이 불가능한 경우가 있다. 이런 상황에서 여기저기서 재사용되는 기존의 툴킷 클래스의 소스 코드를 변경하지 않고 현재의 특수한 인터페이스 요구 상황에 맞추기 위해 어댑터..

    [Python] 파이썬 3.11 기능 소개

    [Python] 파이썬 3.11 기능 소개

    Introduction 파이썬 3.10 기능 소개를 한 지 얼마 지나지 않은 것 같은데, 슬슬 3.11 버전에 대한 소식도 들려오고 있다. 이번 글에서는 3.10 버전과 비교해 3.11 버전에서는 어떤 기능들이 새롭게 추가 되었는지 소개하고자 한다. 이 글은 3.11.0b4 릴리즈를 기준으로 한다. 설치는 이 링크를 참고하자. 예제와 표의 일부는 공식 도큐멘테이션에서 참고했다. (이전 글) [Python] 파이썬 3.10 기능 소개 1. Faster CPython 파이썬 3.11 버전은 이전 버전에 비해 (3.10) 전반적인 실행 속도가 10%~60% 정도, 평균적으로는 25% 정도 빨라졌다고 한다. 설명만으로는 와닿지 않으니 한번 테스트를 해 보자. import time def timer(functio..

    [Python] Error parsing XML: not well-formed (invalid token) 에러 해결

    [Python] Error parsing XML: not well-formed (invalid token) 에러 해결

    Introduction 파이썬에서 XML 파일을 자동으로 생성한 후, xmltodict 나 ElementTree 를 사용해 다시 XML 파일을 파싱하려고 할 때 다음과 같은 에러가 발생하는 경우가 있다. Error parsing XML: not well-formed (invalid token) 사용하는 도구에 따라 XML 파일의 어느 위치가 잘못 되었는지 알려 주기도 하기 때문에 vim과 같은 에디터를 열어 해당 위치 내용을 직접 수정해도 되지만, 파일이 크고 수정해야 하는 지점이 많으면 이 방법을 사용하기엔 여의치 않다. 이번 글에서는 파이썬을 이용해 해당 문제를 편하게 해결하는 방법을 소개한다. Problem 위 문제의 원인은 크게 두 가지로 나눌 수 있다. XML 파일 내부에 XML 문서에서 처음부..