본문 바로가기

728x90

디자인패턴

[디자인패턴][행위패턴] 관찰자 Observer - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Observer Pattern 관찰자 패턴은 널리 사용되는 패턴이다. 다른 언어들에서는 언어 자체적으로 또는 표준 라이브러리에서 관찰자 패턴을 지원한다. C++을 제공되지 않는다. 제대로 된 관찰자 패턴은 기술적으로 매우 정교한 구현을 요구한다. 속성 관찰자 생일잔치를 챙겨주도록 해보자. 사람의 나이가 바뀌는 것을 어떻게 알 수 있을까? 변경을 알아채는 방법에는 폴링(polling)을 사용할 수도 있다. 이러한 방법은 효과는 있지만 비효율적이다. 사람의 나이가 변경될 때 정보를 받는 것이 가장 효과적이다. 그러기 위해서는 set 멤버 함수가 필요하다. 이제 set 멤버 함수가 호출될 때 알림을 보낼 수 있으면 된다. Observ.. 더보기
[디자인패턴][구조패턴] 프록시 Proxy - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Proxy pattern Decorator 패턴은 객체의 기능을 수정/확장하는 여러 다른 방법들을 제시해준다. Proxy 패턴도 객체의 기능을 수정/확장한다는 목적은 비슷하지만 기존 API 사용 방식을 정확히 동일하게 유지하면서 내부 동작만 다르게 한다는 점이 다르다. Proxy는 API를 일관되게 유지하기 위한 것은 아니다. 같은 API에 대해서 서로 다른 종류의 서로 다른 목적의 완전히 다른 프록시들이 여러 개발자에 의해 만들어질 수 있기 때문이다. 스마트 포인터 가장 단순하면서도 직접적인 프록시 패턴은 스마트 포인터라 할 수 있다. 스마트 포인터는 포인터의 참조 횟수를 관리하고, 몇몇 연산자를 오버라이딩하는 래퍼(wrapp.. 더보기
[디자인패턴][구조패턴] 플라이웨이트 Flyweight - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Flyweight pattern 플라이웨이트 패턴은 많은 수의 가벼운 임시 객체를 스마트 참조로 사용하는 것을 말하며 그러한 객체들을 플라이웨이트라고 부른다. 종종 토큰, 쿠키라고 부르기도 한다. 플라이웨이트 패턴은 많은 수의 매우 비슷한 객체들이 사용되어야 할 때 메모리 사용량을 절감하는 방법으로서 자주 사용된다. 사용자 이름 대규모 멀티 플레이가 지원되는 온라인 게임을 생각해보자. 중복 이름이 허용된다면, 흔한 이름이 생성될 때마다 중복되는 공간을 낭비하게 된다. 대신에 이름을 한 번만 저장하고 같은 이름을 가진 사용자들은 그 이름을 포인터로 갖게 할 수도 있다. 이것은 적지 않은 메모리 절감이다. 더 나아가 이름을 "성"과.. 더보기
[디자인패턴][구조패턴] 데코레이터 Decorator - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Decorator pattern 동료가 작성한 클래스 기반으로 기능 확장을 한다고 해보자. 원본 코드를 수정하지 않고 기능을 추가하기 위한 방법 중에서 상속이 생각날 수 있다. 하지만 항상 이렇게 작업할 수 있지는 않다. 상속을 할 수 없는 여러 사정이 있을 수 있다. 무엇보다 수정하는 이유가 여러 가지인 경우에는 단일 책임 원칙(SRP)을 위반하는 것이기 때문이다. Decorator 패턴은 이미 존재하는 타입에 새로운 기능을 추가하면서도 원래 타입의 코드에 수정을 피할 수 있도록 해준다. OCP를 준수하는 것이다. 시나리오 여러 개선 작업이 필요한 상황을 생각해보자. 도형을 기반으로 색상이 있는 도형과 투명한 도형을 상속받아 .. 더보기
[디자인패턴][구조패턴] 컴포지트 Composite - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Composite Pattern 보통 공부할 때 Aggregation 관계와 Composite 관계는 생명주기에서 다르다고 말을 한다. 하지만, 이 책에서는 두 개를 서로 동등한 것으로 취급한다. 객체가 복수의 구성 요소로 이루어져 있다는 것을 의도적으로 사용자에게 알려줄 방법은 많지 않다. 우선, 명시적으로 멤버 변수에 대한 getter/setter를 노출하는 방법이 있다. 이때, begin/end 반복자와 같은 것으로 구성 요소의 집합이라는 것을 알려야 한다. 다른 방법으로는 컨테이너 타입을 상속받는 것이다. 하지만, STL 컨테이너는 virtual 소멸자가 없기 때문에 소멸자를 쓸 일이 없어야 한다. Composite 패턴.. 더보기
[디자인패턴][구조패턴] 브릿지 Bridge - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Bridge Pattern 최근 C++ 컴파일러들은 컴파일 속도가 굉장히 빨라졌다. 번역 단위(translation unit) 전체를 생성하는 대신 변경된 정의 부분만 새로 만들고 나머지는 재활용하는 방식으로 진화했다. 과거 C++ 개발자들은 유사하게 컴파일 시간을 단축시키기 위해 독특한 관례를 사용했다. Pimpl 관례가 그것이다. Pimpl 관례 Pimpl(Pointer to Implementation)은 구현부를 포인터로 참조하는 관례를 말한다. 기술적 측면에서 어떤 역할을 수행하는지 살펴보자. 일반적으로 개인 정보를 담는 Person 클래스를 구현한다 해보자. 사람 이름을 저장하고, 인사말을 출력하는 메서드를 갖는다고 할.. 더보기
[디자인패턴][구조패턴] 어댑터 Adapter - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Adapter pattern 어댑터 패턴은 일상생활에서 많이 보이는 어댑터와 같은 용도로 사용된다. 어떤 인터페이스가 용도에 맞지 않을 때 변환하는 역할로 사용하는 패턴이다. 시나리오 픽셀을 그리는 그리기 라이브러리가 있고, 이 라이브러리를 이용해야만 그림을 그릴 수 있다. 그런데 선분, 사각형과 같은 기하학적 모양을 그려야 하는 상황이다. 픽셀을 그리는 라이브러리는 요구사항에 비해 너무 저수준의 작업이기 때문에 기하학적 도형을 픽셀 기반의 표현이 가능하도록 바꿔주는 어댑터가 필요하다. 기본적인 그리기 객체를 정의한다. struct Point { int x, y; }; struct Line { Point start, end; }.. 더보기
[디자인패턴][생성패턴] 싱글턴 Singleton - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Singleton pattern 싱글턴 패턴은 가장 많이 미움받고 있는 디자인 패턴이다. 하지만, 필요하기 때문에 많이 사용된다. 싱글턴 디자인 패턴은 어떤 특정 컴포넌트의 인스턴스가 애플리케이션 전체에서 단 하나만 존재해야 하는 상황을 처리하기 위해 고안됐다. 개인적으로 처음 알았던 디자인 패턴이고, 그만큼 여기저기서 많이 사용되는 패턴이다. 그래서 왜 미움받는 디자인 패턴이라고 묘사했는지를 몰랐다. 책의 내용을 읽다 보니 그럴만한 이유들이 있구나 생각했다. 내가 사용하던 수준은 해당 문제들에 얽혀 있지 않은지 생각해볼 수 있었다. IoC 컨테이너 방식으로의 전환도 만만치 않을 것이고 회사에 바로 적용한다고 해서 가능할지도 모.. 더보기

728x90