분류 전체보기 298

퍼사드 패턴(Façade Pattern)

Façade는 프랑스어로 "출입구가 있는 건물의 앞부분을 의미합니다" 즉, 복잡한 부분은 뒤로 숨기고 간략화된 인터페이스를 제공하는 패턴입니다. 퍼사드 디자인 패턴은 하나 이상의 복잡한 서브 시스템 앞에 단순한 인터페이스를 두기 위한 방법입니다. 퍼사드는 편리하고 직관적인 API를 통해 이용할 수 있게합니다. class Engine { public: void Start() { ... } }; class Headlights { public: void TurnOn() { ... } }; // facade class Car { public: void Start() { headlights.TurnOn(); engine.Start(); } private: Engine engine; Headlights headli..

데커레이터 패턴(Decorator Pattern)

동료가 작성한 코드의 원본을 수정하지 않고 기능을 확장하는 방법은? 가장 쉽게 생각나는 것이 "상속"을 이용하는 것입니다. 데커레이터 패턴은 이미 존재하는 타입에 새로운 기능을 추가하면서도 원래 타입의 코드에 수정을 피할 수 있게 해줍니다. (OCP 준수) Shape을 상속 받아 ColoredShape과 TransparentShape을 추가하고 두 기능이 모두 필요하여 ColoredTransparentShape을 만들었습니다. 이렇게 상속의 방법으로 기능을 추가 한다면 Shape의 기능이 들어 나거나 도형이 추가된다면 클래스가 점점 수도 없이 늘어나야만 합니다. Square, Circle 등과 같은 도형추가 되거나 크기 조절 가능 기능을 추가되는 것을 상상해 봅시다. 평범한 상속으로는 효율적으로 원본을 ..

사피엔스

인지혁명, 농업혁명까지는 정말 재미 있었지요. 배경 지식이 부족해도 어느 정도 내용에 공감하며 따라 갈 수 있었습니다. 인지 혁명에는 여러 유인원들중에 어떻게 사피엔스가 살아 남을 수 있었는지 고대의 사피엔스들이 얼마나 행복했었는지 그리고 신체적으로 얼마나 뛰어 났는지에 대해 알게 되면서 한편으로는 부럽기도 했고요. 농업 혁명에서는 인류 최대의 사기극이 벌어 지는데 사람이 밀을 정복 한 것이 아니라 밀에게 이용당하며 노동력을 착취당하고 있습니다. 그 어느 개체보다 종족이 번성한 것은 밀이며 사피엔스는 이 밀들을 위해서 얼마나 많은 노동을 하여 왔는가? 라는 물음을 던진다. 이런 생각은 단 한번도 하지 않았는데 새로운 시각이었어요. 인류의 통합에서는 사피엔스는 눈에 보이지 않는 것을 믿고 신의 사명이라는 ..

독서 리뷰 2020.01.28

게임 프로그래밍 패턴

게임 개발을 오랜동안 해봤다면 거의 대부분의 아는 내용을 다루고 있었습니다. 게임 개발자로서 필수적으로 알면 좋은 내용들이며 게임 개발시 필수로 필요한 패턴들을 알기쉽고 재미 있는 예제로 설명을 잘해주고 있습니다. 디자인 패턴은 상속과 구성을 어떻게 하용하느냐. 그리고, 객체를 인스턴스화 시켜서 어떻게 구조를 갖느냐가 핵심이라는 것을 다시 한번 생각하게 됩니다. 최적화와 가독성 높은 코드는 서로 상충하기 때문에 어느 한쪽으로 치우치지 않고 용도에 맞는 개발의 중요성을 생각하게됩니다. 게임 개발에서 자주 사용하는 설계 기법들을 이렇게 패턴화 시켰다는 것에 박수를 보냅니다. 게임 개발을 많이 접하지 않은 분들은 이 책을 통해 좀더 넓은 시야를 얻을 수 있을 것으로 생각합니다. 알기 쉽게 풀어서 설명을 하였기..

독서 리뷰 2020.01.28

새는 날아가면서 뒤돌아 보지 않는다

어떻게 살아가는 것이 더 나은 인생을 사는 것인가 고민이 되시나요? 길을 잃은 것 같나요? 삶의 의미와 즐거움을 찾지 못하고 방황하고 있나요? 이런 분에게 이 책을 추천합니다. 자신을 성찰하고 마음 사용법을 배울 수 있는 책입니다. 삶의 지혜를 얻을 수 있으며 재미도 있습니다. 별 다섯개 10점 만점입니다. 책을 읽은지 오래 지나도 오래도록 남는 글들이 있어요. 몇 가지를 소개해 볼게요. 마음의 거리 대화를 하면서 점점 목소리가 커지는데 이럴 수록 마음의 거리는 멀어진다고 해요. 대화를 하면서 소리를 치는 이유는 바로 앞에 있어도 그 만큼 마음의 거리가 멀어졌기 때문에 소리를 질러요. 그렇지만 서로의 마음의 소리에 귀를 기울이지 않는 다면 그 마음의 거리는 점점 멀어지죠. 서로를 사랑하는 연인들이 속삭이..

독서 리뷰 2020.01.28

컴포지트 패턴(Composite Pattern)

컴포지트 패턴은 어떤 객체들의 집합에 대해 개별 인터페이스를 동일하게 가져갈 수 있게하는 것입니다. 배열에 기반한 속성 크리처의 속성을 배열로 구현하면 작성하기 쉽고 유지 보수 하기도 쉽다. 힘, 민첩, 지능을 가지는 크리쳐의 능력 들의 통계를 내는 구현입니다. struct Creature { int strength, agility, intelligence; int sum() const { return strength + agility + intelligence; } double average() const { return sum()/3.0; } int max() const { return max(max(strength, agility), intelligence); } } 크리처의 속성이 늘어 날때 마다..

브릿지 패턴(Bridge Pattern)

기능 클래스(껍데기)와 구현 클래스(실제 구현)를 서로 연결하는 패턴입니다. Bridge하면 무엇이 떠오르나요? 브릿지가 서로 떨어진 두 곳을 연결 하듯이 브릿지 패턴 또한 서로 떨어진 두 기능을 연결합니다. 이것이 핵심입니다. 즉, 기능과 구현을 서로 연결하는 것입니다. Pimpl(Pointer to Implementation) 관례 구현부를 포인터로 참조하는 관례를 뜻한다. 클래스의 구현부를 다른 클래스(PersonImpl)에 숨깁니다. PersonImpl 구현이 모두 .cpp 파일에 정의하는 것이 핵심입니다. Person.h struct Person { std::string name; class PersonImpl; // 전방 선언 PersonImpl *impl; // 구현은 모두 cpp 파일에서 ..

어댑터 패턴(Adapter Pattern)

인터페이스가 용도에 맞지 않을 때 용도에 맞도록 중간에서 변환한다. 6.2 어댑터 일반적인 어댑터의 예입니다. Line을 Point들로 변환하는 어댑터를 설명합니다. Point들을 그리는 기능만 있는데 Line을 그리려면 어떻게 해야 하나? void DrawPoints(CPaintDC& dc, std::vector::iterator start, std::vector::iterator end) 다음과 같이 라인을 점들로 변환하는 어댑터를 구현합니다. 이 구현은 수직, 수평인 라인들만을 다루고 나머지는 무시합니다. struct LineToPointAdapter { typedef vector Points; LineToPointAdapter(Line& line) { int left = min(line.start..

싱글턴 패턴(Singleton Pattern)

인스턴스의 포인터를 전역으로 접근하면서 오직 하나의 인스턴스만을 생성하는 것을 보장하는 패턴입니다. 역사상 가장 많이 미움을 받고 있는 디자인 패턴입니다. 패턴을 통틀어 구조적으로 가장 간단한 패턴입니다. 전역변수와 같은 역할을 하지만 호출 될때 객체를 만들 수 있어서 필요 할때만 만들 수 있습니다. 한 클래스의 인스턴스가 하나만 생기도록 하는 구현은 생각보다 까다롭다. 전역 객체는 초기화 순서가 정의 되어 있지 않습니다. 전역 객체가 다른 전역 객체를 참조 한다면 문제가 발생합니다. static Database database{}; 이 함수는 스레드 안전성이 C++11 이상 버전에서만 보증됩니다. Database& get_datatabase() { static Database database; retu..

프로토타입 패턴(Prototype Pattern)

이미 만들어진 객체(프로토타입, 원형)을 복사하여 새로운 객체를 생성하는 패턴입니다. 무에서 유를 창조하는 것은 드물다. 이미 존재하는 객체를 복제하여 사용하거나 일부를 수정하여 사용합니다. 이러한 것들이 프로토타입 패턴의 아이디어입니다. 프로토타입 패턴은 객체의 깊은 복제를 수행하되 매번 전체 초기화를 하는 대신 미리 부분적으로 만들어진 객체를 복제하여 약간의 수정만으로 이용할 수 있게합니다. 이 과정에서 원본 객체에 대한 걱정은 하지 않아도 되게 해줍니다. 객체 생성 복잡한 생성을 거쳐 잘 갖추어진 객체가 있다면 이 객체를 그대로 복제하는 것이 좋은 방법입니다. 프로토타입 패턴은 객체의 복제가 주요 기능이다. 복제를 하는 여러 방법들이 알아봅시다. 평범한 중복 처리 복제 대상 객체의 모든 항목이 값으..