전체 글 311

누워서 읽는 알고리즘

알고리즘을 주제로 기본부터 차근차근 재미있게 풀어놓았어요. P를 출력하는 프로그램 P, 섬에 사는 승려, 팰린드롬의 세계 등... 정말 재미있게 소개를 하고 있어요. 책을 읽으면서 제목처럼 누워서 읽어야 하나 라는 생각마저 들었지요. 수도사 메르센느를 기리는 사람들의 무한한 도전도 무척 흥미로웠어요. RSA 알고리즘의 탄생 이야기와 차근차근 RSA에 대해서 설명해주어서 수학적으로 어떻게 이 알고리즘에 적용되었는지 알 수 있어서 좋았어요. 책 뒤쪽에는 코드 인용이 지면의 많은 부분을 차지했고 도저히 누워서 읽을 정도가 아니라서 책의 콘셉트가 많이 달라져서 책에 대한 아쉬운 생각이 들었지요. 그렇기만 알고리즘의 기본이 되는 내용들 잘 설명하였고 고차원의 복잡한 내용들도 차근차근 단계를 거치면서 설명했기에 알..

독서 리뷰 2020.02.11

창의 성을 지휘하라

픽사와 디즈니 애니메이션 CEO인 에드 캣멀이 성공하는 기업이 만드는 필수 요소를 온 마음을 다해 글로 옮겨 놓은 책입니다. 루카스 필름의 그래픽스 부문이 스티브 잡스를 만나 픽사가 탄생하고, 픽사의 성공, 이후 디즈니 애니메이션 부문에 성공을 이끌었다. 이러한 과정속에서 필자 또한 리더로서 성장하였으며 성장하는 동안의 고민들과 자신이 생각하는 조직이 가져야할 덕목들을 구체적으로 알려준다. 애니메이션 영화 제작은 창조성이 중요시되며 현실에 안주하거나 실패하는 것을 두려워하면 결국 발전이 없고 창의적이고 뛰어난 작품이 나올 수 없음을 강조합니다. 게임 개발 또한 이런 면에서 공통점이 있어서 공감되는 부분이 많았습니다. 나이를 먹으면서 머리가 굳어지고 자신의 생각이 맞고 다른 사람의 말을 들어려 하지 않고 ..

독서 리뷰 2020.02.04

플라이웨이트 패턴(Flyweight Pattern)

데이터를 공유하여 메모리를 절약할 수 있게 하는 패턴입니다. 한번 생성된 객체는 또 다시 생성하지 않고 Pool로 관리하여 사용합니다. 플라이웨이트는 원래 권투 용어로 몸무게가 낮은 선수들의 매치를 의미합니다. 플라이웨이트 패턴은 많은 수의 가벼운 임시 객체들을 "스마트 참조"로 사용하는 것을 말하며 그러한 객체들을 플라이웨이트라고 부릅니다. 대단히 많은 수의 매우 비슷한 객체들이 사용되어야 할 때 메모리 사용량을 절감하는 방법으로 자주 사용됩니다. 사용자 이름 수 많은 유저의 이름을 저장하는 겨우를 생각해봅시다. 유저의 이름이 많이 겹친다면 이를 일일이 모두 메모리에 저장하면 메모리를 많이 사용할 것입니다. 이름 키값을 이용하여 중복된 이름을 함께 참조한다면 메모리 사용량을 줄일 수 있습니다. type..

퍼사드 패턴(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 파일에서 ..

반응형