본문 바로가기

책읽기

Effective C++

사용자 삽입 이미지

 

제목: Effective C++

원제: Effective C++: 50 Specific Ways to Improve Your Programs and Design

저자: Scott Meyers 
역자: 연승훈 
출판사: 대림


 

이책을 처음 접했을때 목차나 앞부분을 훑어본후 별로 감흥을 받지 못했다.
그도 그럴것이 책도 앏고 내용들고 뻔한 내용들 같았다.

 

그러나 이 책은 나의 뒷통수를 후려 갈긴 첫번째 책이 되었다.

 

다른 입문서와 틀리게 C++을 가르쳐 주는 책이 아니라 제대로 사용하기위한 기초(?) 지식들을 모아놓은 책이다.
C++은 문법을 알고 문법대로 코딩만 해서는 안된다고 가르쳐 주는 책이다.

 

번역된지는 좀 됬고 번역에 대해서는 나쁘지는 않지만 그리 썩 좋지도 않은 책으로 평가 되고 있다.
그러나 번역의 잘됨 여부에 관계없이 내용을 이해하는데에는 별 무리가 없는듯 하다.

 

C++ 고리타분한 입문서를 하나 읽었다면 바로 추천하는 바이다.

 

 


C에서 C++로의 전환
항목 1 #define보다는 const와 inline을 사용한다
항목 2 stdio.h 보다는 iostream을 사용한다.
항목 3 malloc과 free보다는 new와 delete를 사용한다.
항목 4 C++ 스타일의 주석을 지향한다.

 

이 챕터는 왠만한 C++책에는 다 있는 내용들이다.
뻔한 내용일수도 있지만 심호한 뜻이 있는 그런 챕터이다.

 

근본적인 주제는 C와 C++는 다르다 그러니 차이를 알아라 이다.

 


메모리 관리
항목 5 new와 delete의 사용시 동일한 형식을 이용한다
항목 6 소멸자에서 포인터 멤버에 대해 delete를 이용한 다.
항목 7 메모리가 모자랄 경우에 대비한다.
항목 8 operator new와 operator delete 작성시 관례를 따른다.
항목 9 new의 "정상" 형식을 감추지 않는다.
항목 10 operator new를 작성한다면 operator delete도 작성한다.


처음 이부분을 읽었을때 100% 이해 못하고 넘어갔다
그리고 이책의 후속작인 More Effective C++을 읽고 나서 이해하게된 챕터이다.

 

이 챕터의 주제는 new 키워드와 malloc 함수의 차이점을 이해하고 new를 사용함에 있어 이해하고 있어야 될것에대해 기술하고 있다.

그리고 사용자 형식(메모리 할당에 있어서)의 new 의 행동을 만드는것과
이책에서 처음으로 접했던 placement new 에 대해서도 선보이고 있다.

 

 

생성자, 소멸자, 그리고 치환 연산자
항목 11 동적으로 할당되는 메모리를 갖는 클래스를 위해서는 복사 생성자와 치환 연산자를 선언하라.
항목 12 생성자에서 치환보다는 초기화를 사용한다.
항목 13 클래스에 선언된 순서에 따라 멤버 초기화 리스트에 멤버들을 나열한다.
항목 14 베이스 클래스에서 소멸자는 가상 함수로 선언해야 한다.
항목 15 operator=이 *this에 대한 레퍼런스(reference)를 리턴(Return)하도록 한다.
항목 16 operator=에서 모든 데이터 멤버들로의 치환을 수행한다.
항목 17 operator=에서 재귀치환을 검사한다.


클래스를 설계함에 있어 기본이 되는 생성자, 소멸자, 그리고 치환연산사에 대한 내용이다.

생성자와 소멸자의 적절한 사용과 치환연산자에서 주의점에 대해 기술하고 있다.

 

여기서 중요한 내용은 "베이스 클래스용 소멸자는 가상이어야 한다"와 "생성자, 소멸자, 치환연산자는 같이 따로 생각할것이 아니라 같이 설계되어야 한다"는 점이다.

 


클래스와 함수: 설계 및 선언
항목 18 최소한의 완전한 클래스 인터페이스를 추구한다.
항목 19 멤버 함수, 비멤버 함수 및 프렌드 함수를 구별한다.
항목 20 데이터 멤버를 공용 인터페이스에 포함시키지 않는다.
항목 21 가능한 const를 이용한다.
항목 22 값에 의한 호출보다는 레퍼런스에 의한 호출을 선호한다.
항목 23 객체 반환시 레퍼런스를 반환하지 않는다.
항목 24 함수 오버로딩과 디폴트 인자값 중에서 주의깊 게 선택한다.
항목 25 포인터나 수치형 타입상의 오버로딩을 피한다.
항목 26 잠재적 모호성을 경계한다.
항목 27 의도하지 않은 내부 생성 멤버 함수의 이용을 명시적으로 막는다.
항목 28 전역 네임스페이스를 분할한다.


이 챕터는 클래스의 제대로된 설계를 위한 지침이다.

인터페이스를 설계시 주의 사항에 대해 기술하고 있다.

 

"최소한의 완전한 클래스 인터페이스를 추구한다"

 


클래스와 함수: 구현
항목 29 내부 데이터에 대한 "핸들"을 리턴하는 것을 피해라.
항목 30 접근하기 어려운 멤버에 대한 비상수 포인터나 레퍼런스를 리턴하는 멤버 함수 사용을 피하라.
항목 31 지역 객체에 대한 참조나 함수 내에서 new를 이용해 초기화된 포인터를 가리키는 참조를 리턴하지 말라.
항목 32 변수 정의는 가능한 뒤로 늦춰라.
항목 33 인라인을 선별적으로 사용하라.
항목 34 파일간의 컴파일 의존성(dependency)을 최소화하라.


이 챕터는 클래스의 특징중 은닉성에 대한 부분을 기술하고 있다.
그리고 몇개의 C++사용에 관한 지침들 ...

 

 

인스턴스와 객체지향 설계
항목 35 public 계승이 "isa"를 모델링하도록 하라.
항목 36 인터페이스 계승과 구현 계승의 차이점을 이해하라.
항목 37 계승된 비가상 함수를 재정의하지 않도록 한다.
항목 38 계승된 부재 인자값을 재정의하지 않도록 한다.
항목 39 계층도의 아래쪽 클래스로 다운캐스트(downcast )하지 않도록 한다.
항목 40 레이어링(layering)을 통해 "가지고 있는" 것과 "사용하여 구현된" 것을 모델링하도록 한다.
항목 41 계승과 템플릿과의 차이점을 이해한다.
항목 42 private 계승을 바르게 사용하라.
항목 43 다중 계승을 바르게 사용하도록 하라.
항목 44 의미하는 바를 표현하도록 하라; 자신이 표현한 것의 의미를 이해하도록 하라.

 

상속에 관한 내용이다.
목적에 맞는 제대로된 상속을 사용 할것과 상속시 지침에 대해 설명하고 있다.

 

그리고 템플릿과 상속의 차이점을 이해해 적절히 사용하라고 한다.

 

"인터페이스 계승과 구현 계승의 차이점을 이해하라."

 

 


미묘한 부분
항목 45 C++가 은밀하게 어떤 함수를 만들어주고 호출 하는지 이해하기
항목 46 실행 시간 에러보다는 컴파일 시간과 링크 시간 에러가 좋다.
항목 47 비지역 정적(Non-local static) 객체는 사용되기 전에 초기화되도록 해야 한다.
항목 48 컴파일러의 경고(warning)에 주의를 기울여라.
항목 49 표준 라이브러리를 잘 알아두어라.
항목 50 C++에 대한 이해를 넓혀라.
 

그리고 기타 못다한 얘기들이다.

주로 컴파일과 링크 그리고 C++의 표준이 되면서 (ISO C++) 추가된 것들에 대한 내용이다.

 

"C++에 대한 이해를 넓혀라"

 

 

 

이 책은 시작에 불과하다..

음하하

 

'책읽기' 카테고리의 다른 글

Exceptional C++ Style  (0) 2005.05.16
C++ Coding Standards: Rules, Guidelines, and Best Practices  (0) 2005.04.20
Modern C++ Design  (0) 2004.12.04
Effective C++  (0) 2004.12.02