본문 바로가기

728x90

study

[디자인패턴][구조패턴] 컴포지트 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 컨테이너 방식으로의 전환도 만만치 않을 것이고 회사에 바로 적용한다고 해서 가능할지도 모.. 더보기
[디자인패턴][생성패턴] 프로토타입 Prototype - C++ [모던 C++ 디자인 패턴] 책을 바탕으로 공부하는 내용을 정리한 내용이다. Prototype pattern 처음부터 모두 새로 만드는 방식(이 경우 팩토리나 빌더 패턴이 유용)은 어렵다. 대신, 이미 존재하는 객체를 이용해 복제해 사용하는 방식은 처음부터 새로 만들지 않고 쉽게 생성할 수 있다. 아니면 일부를 수정하거나 확장할 수도 있을 것이다. 이러한 아이디어를 갖고 프로토타입 패턴이 나오게 된다. 프로토타입 패턴을 이용하면 어떤 모델 객체도 복제할 수 있고, 복제본을 커스터마이징해 사용할 수도 있다. 가장 까다로운 부분이라면, 복제를 구현하는 부분이다. 객체 생성 생성자를 통해 객체를 생성하는 것보다 이미 잘 설정된 객체를 복제하는 것이 보다 쉬운 방법이다. 빌더 패턴을 이용해 복잡한 생성 과정을 .. 더보기
[C++][Effective C++] 49~52. new와 delete를 내 맘대로 [Effective C++(3판)]에 대한 내용을 공부하면서 정리한 내용이다. 이번에 요약하는 내용은 49~52 항목으로 아래와 같다. 49. new 처리자의 동작 원리를 제대로 이해하자 50. new 및 delete를 언제 바꿔야 좋은 소리를 들을지를 파악해두자 51. new 및 delete를 작성할 대 따라야 할 기존의 관례를 잘 알아 두자 52. 위치 지정 new를 작성한다면 위치 지정 delete도 같이 준비하자 요약 49. new 처리자의 동작 원리를 제대로 이해하자 사용자가 보낸 메모리 할당 요청을 operator new 함수가 만족하지 못할 경우에는 예외를 던지고 있다. 예전에는 malloc을 사용한 것과 같이 NULL 포인터를 반환했다. 메모리 할당에 실패한 경우 예외를 던지기 전에 사용자.. 더보기
[C++][Effective C++] 41~48. 템플릿과 일반화 프로그래밍 [Effective C++(3판)]에 대한 내용을 공부하면서 정리한 내용이다. 이번에 요약하는 내용은 41~48 항목으로 아래와 같다. 41. 템플릿 프로그램이의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터 42. typename의 두 가지 의미를 제대로 파악하자 43. 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자 44. 매개변수에 독립적인 코드는 템플릿으로부터 분리시키자 45. "호환되는 모든 타입"을 받아들이는 데는 멤버 함수 템플릿이 직방! 46. 타입 변환이 바람직할 경우에는 비멤버 함수를 클래스 템플릿 안에 정의해 두자 47. 타입에 대한 정보가 필요하다면 특성정보 클래스를 사용하자 48. 템플릿 메타프로그래밍, 하지 않겠는가? 요약 41. 템플릿 프로그램이의 .. 더보기
[C++][Effective C++] 32~40. 상속, 그리고 객체 지향 설계 [Effective C++(3판)]에 대한 내용을 공부하면서 정리한 내용이다. 이번에 요약하는 내용은 32~40 항목으로 아래와 같다. 32. public 상속 모형은 반드시 "is-a"를 따르도록 만들자 33. 상속된 이름을 숨기는 일은 피하자 34. 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자 35. 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자 36. 상속받은 비가상 함수를 파생 클래스에서 재정의하는 것은 절대 금물! 37. 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자 38. "has-a" 혹은 "is-implemented-in-terms-of"를 모형화할 때는 객체 합성을 사용하자 39. private 상속은 심사숙고해서 구사하자.. 더보기

728x90