목록Categories (1099)
KoreanFoodie's Study
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 44 : 매개변수에 독립적인 코드는 템플릿으로부터 분리시키자 핵심 : 1. 템플릿을 사용하면 비슷비슷한 클래스와 함수가 여러 벌 만들어진다. 따라서 템플릿 매개변수에 종속되지 않은 템플릿 코드는 비대화의 원인이 된다. 2. 비타입 템플릿 매개변수로 생기는 코드 비대화의 경우, 템플릿 매개변수를 함수 매개변수 혹은 클래스 데이터 멤버로 대체함으로써 비대화 종종 없앨 수 있다. 3. 타입 매개변수로 생기는 코드 비대화의 경우, 동일한 이진 표현구조를 가지고 인스턴스화되는 타입들이 한 가지 함수 구현을 공유하게 만듦으로써 비대화를 감소시킬 ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 43 : 템플릿으로 만들어진 기본 클래스 안의 이름에 접근하는 방법을 알아 두자 핵심 : 파생 클래스 템플릿에서 기본 클래스 템플릿의 이름을 참조할 때는, "this->" 를 접두사로 붙이거나 기본 클래스 한정문을 명시적으로 써 주는 것으로 해결하자 템플릿 클래스 상속하는 다음 예제 코드를 보자. class CompanyA { public: void sendCleartext(const std::string& msg); void sendEncrypted(const std::string& msg); }; // CompanyB, Compan..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 42 : typename 의 두 가지 의미를 제대로 파악하자 핵심 : 1. 템플릿 매개변수를 선언할 때, class 및 typename 은 서로 바꾸어 써도 무방하다. 2. 중첩 의존 타입 이름을 식별하는 용도에는 반드시 typename 을 사용한다. 단, 중첩 의존 이름이 기본 클래스 리스트에 있거나 멤버 초기화 리스트 내의 기본 클래스 식별자로 있는 경우에는 예외이다. 질문 : 아래의 두 템플릿 선언문에 쓰인 class 와 typename 의 차이는 무엇일까? template class Widget; template class Wi..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 41 : 템플릿 프로그래밍의 천릿길도 암시적 인터페이스와 컴파일 타임 다형성부터 핵심 : 1. 클래스 및 템플릿은 모두 인터페이스와 다형성을 지원한다. 2. 클래스의 경우, 인터페이스는 명시적이며 함수의 시그니처를 중심으로 구성되어있다. 다형성은 프로그램 실행 중에 가상 함수를 통해 나타난다. 3. 템플릿 매개변수의 경우, 인터페이스는 암시적이며 유효 표현식에 기반을 두어 구성된다. 다형성은 컴파일 중에 템플릿 인스턴스화와 함수 오버로딩 모호성 해결을 통해 나타난다. 객체 지향 프로그래밍의 세계를 회전시키는 축은 명시적 인터페이스(ex..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 40 : 다중 상속은 심사숙고해서 사용하자 핵심 : 1. 다중 상속은 단일 상속보다 복잡하다. 새로운 모호성 문제를 일으킬 뿐 아니라 가상 상속이 필요해질 수도 있다. 2. 가상 상속을 쓰면 크기 비용, 속도 비용이 늘어나며 초기화 및 대입 연산의 복잡도가 커진다. 따라서 가상 기본 클래스에는 데이터를 두지 않는 것이 현실적으로 가장 실용적이다. 3. 다중 상속을 적법하게 쓸 수 있는 경우가 있다. 여러 시나리오 중 하나는, 인터페이스 클래스로부터 public 상속을 시킴과 동시에 구현을 돕는 클래스로부터 private 상속을 시키는 ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 39 : private 상속은 심사숙고해서 구사하자 핵심 : 1. private 상속의 의미는 is-implmented-in-terms-of(...는 ...를 써서 구현됨) 이다. 대개 객체 합성과 비교해서 쓰이는 분야가 많지는 않지만, 파생 클래스 쪽에서 기본 클래스의 protected 멤버에 접근해야 할 경우 혹은 상속받은 가상 함수를 재정의해야 할 경우에는 private 상속이 나름대로 의미가 있다. 2. 객체 합성과 달리, private 상속은 공백 기본 클래스 최적화(EBO) 를 활성화시킬수 있다. 이는 객체 크기를 가지고 고..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 38 : "has-a(...는...를 가짐)" 혹은 "is-implemented-in-terms-of(...는...를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자 핵심 : 1. 객체 함성(composition)의 의미는 public 상속이 가진 의미와 완전히 다르다. 2. 응용 영역에서 객체 합성의 의미는 has-a(...는...를 가짐)이다. 구현 영역에서는 is-implemented-in-terms-of(...는 ...를 써서 구현됨)의 의미를 갖는다. 합성(composition) 이란, 어떤 타입의 객체들이 그와 다른 타..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 37 : 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자 핵심 : 상속받은 기본 매개변수 값은 절대로 재정의해서는 안 된다. 왜냐하면 기본 매개변수 값은 정적으로 바인딩되는 반면, 가상 함수(오버라이드 가능한 유일한 함수)는 동적으로 바인딩되기 때문이다. 아래 예시를 보자. class Shape { public: enum ShapeColor { Red, Green, Blue }; // 모든 도형은 자기 자신을 그리는 함수를 제공해야 함 virtual void draw(ShapeColor color = Red) ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 36 : 상속받은 비가상 함수를 파생 클래스에서 재정의하는 것은 절대 금물! 핵심 : 상속받은 비가상 함수를 재정의하는 일은 절대로 하지 말자 사실 이 항목은 당연하다면 당연한데, 비가상 함수를 상속받는다는 것은 기반 클래스의 인터페이스와 구현을 모두 물려받는다는 뜻이므로 파생클래스에서 재정의한다는게 이론적으로도 모순되게 된다. 해당 기반 클래스를 물려받은 클래스는 해당 비가상 클래스를 호출할 때 기반 클래스에서 의도한 비가상 함수의 동작을 그대로 재현해야 하기 때문이다! 예시를 하나 보자. class B { public: void m..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 35 : 가상 함수 대신 쓸 것들도 생각해 두는 자세를 시시때때로 길러 두자 핵심 : 1. 가상 함수 대신에 쓸 수 있는 다른 방법으로 NVI 관용구 및 전략 패턴을 들 수 있다. 이 중 NVI 관용구는 그 자체가 템플릿 메서드 패턴의 한 예이다. 2. 객체에 필요한 기능을 멤버 함수로부터 클래스 외부의 비멤버 함수로 옮기면, 그 비멤버 함수는 그 클래스의 public 멤버가 아닌 것들을 접근할 수 없다는 단점이 생긴다. 3. std::function 객체는 일반화된 함수 포인터처럼 동작한다. 이 객체는 주어진 대상 시그니처와 호환되는..