분류 전체보기 294

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

어떻게 살아가는 것이 더 나은 인생을 사는 것인가 고민이 되시나요? 길을 잃은 것 같나요? 삶의 의미와 즐거움을 찾지 못하고 방황하고 있나요? 이런 분에게 이 책을 추천합니다. 자신을 성찰하고 마음 사용법을 배울 수 있는 책입니다. 삶의 지혜를 얻을 수 있으며 재미도 있습니다. 별 다섯개 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)

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

팩토리 패턴(Factory pattern)

객체 생성을 대리하여 처리하는 것을 통칭하는 관용어로 팩토리라 부릅니다. 이것을 팩토리 패턴으로 부르는 사람도 있지만 엄밀히는 아닙니다. 팩터리는 두 가지중 하나입니다. 객체를 어떻게 생성하는지 알고 있는 "클래스" 호출했을 때 객체를 생성하는 "함수" 팩터리 메서드 생성할 타입의 멤버 함수로 객체를 생성하여 리턴합니다. 이 메서드는 생성자를 대신합니다. static 함수로 직교좌표 Point와 극좌표 Point를 생성하는 코드입니다. class Point { protected: Point(const float x, const float y) : x{x}, y{y} {} public: float x, y; static Point NewCartesian(float x, float y) { return{ x..

빌더 패턴(Builder Pattern)

빌더 패턴은 여러 복잡한 요소들의 조합이 필요한 객체를 생성해야 하거나 여러 개의 다양한 객체 집합을 생성해야 할 때 객체 생성만을 전담하는 컴포넌트를 정의하여 객체 생성을 간편하게 하는 것입니다. 이해가 되지 않으면 예제 코드를 보면 쉽게 이해가 되겠죠. House house = HouseBuilder::.buildWalls(). .buildDoors(). .buildWindows(). .buildRoof() .buildGarage() .getReulst(); Email mail = Email::make().from("me@mail.com") .to("you@mail.com") .subject("C++ builders") .body("I like this API, don't you?"); 컴포지트 빌더..

Inheritance(상속) 그리고 Composition(구성)

다음은 언랭의 창시자 Joe Armstrong의 유명한 "고릴라 바나나 문제"의 인용입니다. I think the lack of reusability comes in object-oriented languages, not functional languages. Because the problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle. https://www.johndcook.com/blo..

C++ Core Guidlines 함수

함수 정의 규칙: F.1: 의미있는 동작들을 "묶어서" 함수로 만들고 신중하게 이름을 지어라 F.2: 함수는 하나의 논리적 동작만 수행해야 한다 F.3: 함수는 간결하고 단순하게 유지하라 F.4: 함수가 컴파일 시간에 평가되어야 한다면 constexpr로 선언하라 F.5: 함수가 매우 짧고 수행시간이 중요하다면 inline으로 선언하라 F.6: 함수가 예외를 던지지 않는다면 noexcept로 선언하라 F.7: 보편성을 고려한다면, 스마트 포인터 대신에 T*나 T& 타입의 인자를 사용하라 F.8: 순수 함수를 선호하라 F.9: 사용되지 않는 인자는 이름이 없어야 한다 매개변수 전달 표현(parameter passing expression) 규칙: F.15: 정보를 전달 할 때 단순하고 관습적인 방법을 선호..