hubring

[EC++] 독자 여러분 반갑습니다 본문

C++/Effective C++

[EC++] 독자 여러분 반갑습니다

Hubring 2021. 6. 11. 00:40

Effective C++ 책의 목적

c++를 효과적으로 구사하는 방법
의도대로 동작하기 위한 지침과 조언을 모아둠.
구체적인 제안을 항목으로 55개를 묶어 소개함.

내용 부류

  • 일반적 설계 전략
  • C++ 언어적 특징 실전 세부 사항


여러가지 선택과 의문점들

  • 상속과 템플릿 사이에 선택해야 한다면?
  • public 상속과 private 상속 사이에 골라야 한다면?
  • private 상속과 클래스 합성 사이에서 어떻게 해야할까?
  • 멤버 함수와 비 멤버 함수 중 하나를 선택할 경우에는?
  • 값에 의한 전달과 참조에 의한 전달 중 무엇을 어떤 상황에서 집어야 할까?
  • 대입 연산자는 어떤 타입을 반환해야 적당할까?
  • 소멸자를 가상 함수로 만들어야 할 때는 언제일까?
  • 충분한 메모리를 찾지 못했을 때 operator new는 어떻게 동작시켜야 할까?


———-

용어 설명


선언(declaration)

코드에 사용되는 어떤 대상의 이름과 타입을 컴파일러에게 알려 주는 것

extern int x  // 객체 선언

본 책에서는 기본제공 타입이여도 객체라는 용어를 사용한다.

시그니처(signature)

모든 함수 선언문에는 함수의 매개변수 리스트와 반환 타입 나와 있으며 이것을 시그니처라고 한다.
공식적인 정의에서는 함수의 반환 타입을 제외하고 말하지만 이 책에서는 반환 타입도 시그니처의 일부로 본다.

정의(definition)

선언에서 빠진 구체적인 세부사항을 컴파일러에게 제공하는 것
객체에게 정의란 컴파일러가 그 객체의 메모리를 마련해 놓은 부분
함수/함수 템플릿에 대한 정의는 코드 본문을 제공하는 것
클래스/클래스 템플릿의 경우 그 클래스 혹은 템플릿의 멤버를 넣어 준 결과

초기화(initialization)

어떤 객체에 최초의 갓을 부여하는 과정

기본 생성자(default constructor)

어떤 인자도 주어지지 않은 채로 호출 될 수 있는 생성자

class B {
Public :
   explicit B(int x = 0, bool b = true);

explicit로 선언된 생성자는 암시적인 타입 변환을 수행하는 데 쓰이지 않게 됨 (타입 변환이 명시적인 곳은 사용가능)
이를 통해 예상하지 못했던 타입 변환을 막아준다. => 생성자는 암시적 타입 사용할 이유가 없다면 해당 선언을 우선적으로 한다.

복사 생성자(copy constructor)

어떤 객체의 초기화를 위해 그와 같은 타입의 객체로부터 초기화할 때 호출되는 함수
값에 의한 객체 전달을 정의해 주는 함수이기도 하다.

복사 대입 연산자(copy assignment operator)

같은 타입의 다른 객체 어떤 객체의 값을 복사하는 용도로 쓰이는 함수

Widget w1;
Widget w2(w1); // 복사 생성자 호출
w1 = w2; // 복사 대입 연산자 호출
Widget w3 = w2; // 복사 생성자 호출


STL

표준 템플릿 라이브러리 (Standard Template Library)의 준말
컨테이너 (vector, list, set, map ...), 반복자(vector<int>::iterator ..), 알고리즘(for_each, find, sort ...) 및 이들과 관련된 기능들의 결정체
컨테이너/반복자/알고리즘에 관련된 기능들이 상당 부분을 함수 객체(function object) 즉 함수처럼 도작하는 객체가 차지하고 있다.

미정의 동작(undefined behabior)

동작 자체가 정의되어 있지 않는 상태, 실행 시간에 어떤 현상이 터질지 확실히 예측할 수 없다는 뜻

Int *p = 0; // null  포인터
std::cout << *p; // 널포인터를 역참조하면 미정의 동작 발생
char name[] = “Darla”;
char c = name[10]; // 유효하지 않은 배열 원소지정번호로 참조하면 미정의 동작 발생


인터페이스(interface)

자바나 닷넷 계열의 언어의 경우 인터페이스라는 것이 언어 차원에서 주어져 있지만 C++ 에서는 없다.
이 책에 나오는 인터페이스는 함수의 시그니처 혹은 어떤 클래스의 접근 가능한 요소(public 인터페이스, protected 인터페이스)나 템플릿 타입 매개변수로서 유효해야 하는 표현식 등을 가리킨다.

사용자(client)

코드를 사용하는 모든 대상
함수의 사용자라 하면 함수를 호출하는 코드, 그런 코드를 작성했거나 유지보수 하는 사람 모두 사용자

————-

스레딩에 대한 고려사항

C++ 언어 차원에서 스레드에 대한 개념 자체가 없다. 어떤 종류의 병행성도 고려하지 않은 언어로 표준 라이브러리도 마찬가지이다.
이 책은 C++ 구문요소중 스레드 환경에서 문제를 일으킬 만한 것을 지적하여 알려주고 있다.

TR1 그리고 부스트

TR1 (Technical Report 1) : C++ 표준 라이브러리에 새로 추가되는 기능들에 대한 명세
부스트 : C++ 라이브러리를 제공하는 단체 (http://boost.org)


—————

추가

이 책의 원서는 2005년 5월에 나와 현재의 최신 C++ 버전과 맞지 않는 부분들이 있다.
TR1의 경우만 해도 C++11 에서 대부분의 제안 사항이 채택되어 포함되어 있으며 (std::tr1 으로 정의되어 있음) - 위키백과 참고
스레드 또한 C++11 에서 언어 차원에서 지원하고 있다.

정리하면서 이상한 부분은 찾아보고 적어둘 예정이다.