SlideShare a Scribd company logo
Effective C++
1차 요약 과제
Chapter 1 C++에 왔으면 C++의 법을 따르자
기본 용어 정의
 Declaration - 코드에 사용되는 ‘어떤 대상'의 이름과 타입을 컴파일러에게 알려주는 것
 Definition – 선언에서 빠진 구체적인 세부사항을 컴파일러에게 제공하는 것
 Initialization – 어떤 객체에 최초의 값을 부여하는 과정
 Default constructor – 어떤 인자도 주어지지 않은 채로 호출될 수 있는 생성자
Default constructor
explicit
 오류가 발생할 수 있는 암시적 형식의 변환을 방지한다.
 매개 변수가 하나뿐인 C++ ctors(생성자)는 암시적 형식 변환을 자동을 수행한다.
 예를 들어, ctor이 문자열 포인터 매겨 변수를 예상할 때, int를 전달하는 경우 코드는 int를 분자열
포인터로 변환하는 코드를 추가한다. 그러나 이 자동 동작으로 인해 오류가 발생할 수 있다.
 암시적 변환을 방지하려면 explicit 키워드를 ctor 선언에 추가할 수 있다. 이는 강제로 코드가 올바
를 형식의 매개 변수를 사용하거나 올바른 형식에 대핸 매개 변수를 캐스팅하게 한다. 즉, 캐스팅을
코드에서 명시적으로 표시하지 못하면 오류가 발생한다.
Copy constructor
 어떤 객체의 초기화를 위해 그와 같은 타입의 객체로부터 초기화할 때 호출되는 함수
Copy assignment operator
 같은 타입의 다른 객체에 어떤 객체의 값을 복사하는 용도로 쓰이는 함수
Copy constructor & copy assignment
STL(Standard Template Library)
 C++ 표준 라이브러리 중 하나
 컨테이너(vector, list, set, map등), 반복자(vector<int>::iterator, set<string>::iterator 등), 알고리
즘(for_each, find, sort 등) 및 이들과 관련된 기능들이 집결한 결정체
 컨테이너, 반복자, 알고리즘에 관련된 기능들의 상당 부분을 함수 객체(function object), 즉 함수처
럼 동작하는 C++ 객체가 차지하고 있다.
Undefined behavior
 동작 자체가 글자 그대로 ‘정의되어 있지 않다.’
 실행 시간에 어떤 현상이 터질지 확실히 예측할 수 없다는 뜻이다.
Multiparadigm programming language
 C
 객체 지향 개념의 C++
 템플릿 C++
 STL
 위 4가지 sublanguage들이 C++을 구성한다.
 Unified language, sublanguage federation
 어떤 경우에 C++의 어떤 부분을 사용할지에 대해서 고민하라.
#define을 쓰려거든 const, enum, inline을…
 #define 사용의 문제점
 #define ASPECT_RATIO 1.653
 이 경우, 우리에겐 ASPECT__RATIO가 symbolic name으로 보이지만, 컴파일러에겐 숫자 상수로
보인다.
 컴파일 에러가 발생하면 에러 메시지에는 ASPECT_RATIO 대신에 1.653이 나타난다.
ASPECT_RATIO를 찾아가지 않으면 난감해질 수 있다.
 #define ASPECT_RATIO 1.653 -> const double AspectRatio = 1.653;
#define -> const 상수
 #define 매크로를 사용하면 선행 처리자에 의해 ASPECT_RATIO가 등장하기만 하면 1.653으로 모
두 바뀌면서 목적 코드 안에 1.653의 사본이 등장 횟수만큼 들어가게 된다.
 상수 타입의 AspectRatio는 아무리 여러 번 쓰이더라도 사본은 딱 한 개만 생긴다.
 결국, 상수가 보동소수점 실수 타입일 경우에는 컴파일을 거친 최종 코드의 크기가 #define을 썻을
때보다 작게 나올 수 있다.
#define -> const 상수 주의할 점
 Constant pointer – 상수 정의는 대게 헤더 파일에 넣는 것이 상례이므로 (다른 소스 파일이 이것을
include해서 쓴다.) pointe는 꼭 const로 선언해 주어야 한다. Pointer가 가리키는 대상까지 const
로 선언하는 것이 보통이다.
 예) const char * const authorName = “Scott Meyers”;
 char * 기반 문자열보다는 string 객체가 사용하기 좋다.
 예) const std::string authorName(“Scott Meyers”);
정적 클래스 상수의 선언과 정의
enum hack
매크로 함수의 단점
매크로 함수의 단점
매크로 함수의 문제점 해결
inline 함수
 프로그램의 코드들 가운데 컴파일된 함수 코드가 삽입된다.
 프로그램은 해당 코드를 수행하기 위해 일반 함수 수행처럼 메모리에 있는 함수의 주소를 찾아 점프
할 필요가 없다.
 일반 함수보다 약간이나마 빠른 수행 속드를 갖는다.
 크기가 큰 함수를 인라인 함수로 사용하면(10번 호출한다면 프로그램 코드 사이에 10개의 복사본이
삽입된다.) 메모리 낭비를 유발할 수도 있다.
항목 3: 낌새만 보이면 const
 const 키워드가 붙은 객체는 외부 변경을 불가능하게 한다는 ‘의미적인 제약‘을 소스 코드 수준에서
붙인다.
 컴파일러가 이 제약을 단단히 지켜준다.
 어떤 값이 불변이어야 한다는 제작자의 의도를 컴파일러 및 다른 프로그래머와 나눌 수 있는 수단
const 사용
 클래스 바깥에서는 전역 혹은 네임스페이이스 유효범위의 상수를 선언하는 데 사용할 수 있다.
 그리고 파일, 함수 , 블록 유효범위에서 static으로 선언한 객체에도 const를 붙일 수 있다.
 클래스 내부의 경우에는, 정적 멤버 및 비정적 데이터 멤버 모두를 상수로 선언할 수 있다.
 그리고 포인터의 경우, 기본적으로 포인터 자체를 상수로, 혹은 포인터가 가리키는 데이터를 상수로
지정할 수 있다. 둘 다 지정할 수도 있고 아무것도 지정하지 않을 수도 있다.
const 사용
STL iterator에서 const 사용
상수 멤버 함수
 멤버 함수에 붙은 const 키워드의 역할은 “해당 멤버 함수가 상수 객체에 대해 호출될 함수이다.”라
는 사실을 알려주는 것이다.
 클래스의 인터페이스를 이해하기 좋게 하기 위해서, 그 클래스로 만들어진 객체를 변경할 수 있는
함수는 무엇이고, 또 변경할 수 없는 함수는 무엇인가를 사용자 쪽에서 할 수 있도록 한다.
 이 키워드를 통해 상수 객체를 사용할 수 있도록 한다. C++ 프로그램의 실행 성능을 높이는 핵심 기
법 중 하나가 객체 전달을 ‘상수 객체에 대한 참조자(reference-to-const)’로 진행하는 것이다.
const를 활용한 오버로딩
비트수준 상수성
 어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 그 멤버 함수가 ‘const’
 즉, 그 객체를 구성하는 비트들 중 어떤 것도 바꾸면 안 된다.
 어떤 포인터가 가리키는 대상을 수정하는 멤버 함수들 중 비트수준 상수성 검사를 통과하는 멤버 함
수들이 적지 않다.
비트수준 상수성의 문제점
상수 멤버 함수와 mutable
상수 멤버 및 비상수 멤버 함수에서 중복 회피
항목 4: 객체를 사용하기 전에 반드시 초기화
initialization? assignment!
초기화 리스트를 사용한 initialization
 theName, theAddress, thePhones이 복사
생성자에 의해 초기화
 기본 생성자 호출 후에 복사 대입 연산자를 연
달아 호출하는 방법보다 복사생성자를 한 번
호출하는 쪽이 더 효율적이다.
매개변수 없는 생성자 초기화
클래스 데이터 멤버는 모두 초기화 리스트에
 기본제공 타입의 객체는 사실 초기화와 대입에 걸리는 비용의 차이가 없다.
 초기화 리스트에서 어떤 멤버를 빼먹었을 때 어떤 멤버가 초기화되지 않을 수 있다는 부담을 해결할
수 있다.
 기본제공 타입의 객체는 초기화될지 안 될지 장담할 수 없다.(undefined behavior)
 상수이거나 참조자로 되어 있는 데이터 멤버의 경우엔 반드시 초기화되어야 한다.(상수와 참조자는
대입 자체가 불가능하기 때문이다.)
객체를 구성하는 데이터의 초기화 순서
 기본 클래스는 파생 클래스보다 먼저 초기화된다.
 클래스 데이터 멤버는 그들이 선언된 순서대로 초기화된다.
static object
 자신이 생성된 시점부터 프로그램이 끝날 때까지 살아 있는 객체를 일컫는다.
 스택 객체 및 힙 기반 객체는 정적 객체가 될 수 없다.
 전역 객체(non-local static object)
 네임스페이스 유효범위에서 정의된 객체(non-local static object)
 클래스 안에서 static으로 선언된 객체(non-local static object)
 함수 안에서 static으로 선언된 객체(local static object)
 파일 유효범위에서 static으로 정의된 객체(non-local static object)
 static object는 main() 함수의 실행이 끝날 때 소멸자가 호출된다.
translation unit
 컴파일을 통해 하나의 목적 파일(object file)을 만드는 바탕이 되는 소스 코드
 기본적으로는 소스 파일 하나가 되는데, 그 파일이 #include 하는 파일들까지 합쳐서 하나의 번역
단위가 된다.
translation unit과 non-local static object
 서로 다른 translation unit에 정의된 non-local static object 사이 상대적인 초기화 순서는 정해져
있지 않다.
 설계에 변화를 주어 이 문제를 해결하여야 한다.
발생할 수 있는 문제 예시
문제 해결 방법
 비지역 정적 객체를 하나씩 맡는 함수를 준비한다.
 이 안에 각 객체를 넣는다.
 함수 속에서도 이들은 정적 객체로 선언한다.
 그 함수에서는 이들에 대한 참조자를 반환하게 한다.
 사용자 쪽에서는 비지역 정적 객체를 직접 참조하는 과거의 폐단을 버리고 함수 호출로 대신한다.
 결과적으로 ‘비지역 정적 객체’가 ‘지역 정적 객체’로 바뀐 것이다.
 Singleton pattern의 전형적인 구현양식
 객체들의 초기화 순서를 제대로 맞춰 둔다는 전제조건이 뒷받침되어야 한다.
 객체 B가 초기화되기 전에 객체 A가 초기화되어야 하는데, A의 초기화가 B의 초기화에 의존하도록 만들어져 있다면 문
제는 해결되지 않는다.
 다중 스레드에서는 몰라도 단일 스레드 애플리케이션에서는 확실하다.
문제 해결 예시
Chapter 2 생성자, 소멸자 및 대입 연산자
생성자, 소멸자, 대입 연산자
 생성자 : 새로운 객체를 메모리에 만드는 데 필요한 과정을 제어하고 객체의 초기화를 맡는 함수
 소멸자 : 객체를 없앰과 동시에 그 객체가 메모리에서 적절히 사라질 수 있도록 하는 과정을 제어하
는 함수
 대입 연산자 : 기존의 객체에 다른 객체의 값을 줄 때 사용하는 함수
항목 5: C++가 은근슬쩍 만들어 호출해……
 클래스 안에 직접 선언해 넣지 않으면 컴파일러가 저절로 선언해 주도록 되어 있는 멤버 함수가 있
다.
 copy constructor, copy assignment, destructor
 이런 경우 컴파일러는 public 멤버이며 inline함수의 형태로 저절로 선언하게 된다.
저절로 만들어지는 조건
복사 생성자를 생성하는 경우
복사 대입 연산자를 생성하는 경우
컴파일러가 생성한 함수가 필요 없으면 생성을 막자
 복사 생성자와 복사 대입 연산자가 저절로 만들어지는 것을 막지 않으면 의도치 않은 문제가 발생할
수 있다.
 복사 생성자와 복사 대입 연산자를 public 멤버가 아닌 private 멤버로 선언하자.
 명시적으로 선언되기 때문에 컴파일러는 자신의 기본 버전을 만들 수 없게 된다.
private 멤버 함수만으로 충분한가?
 private 함수는 그 클래스의 멤버 함수 및 friend 함수가 호출할 수 있다.
 호출될 경우를 대비하여 복사 생성자와 복사 대입 연산자를 define하지 않으면 된다.
 private 멤버로 선언 + define(구현)하지 않기로 앞의 문제를 해결할 수 있다.
private 멤버 함수 + 구현 안하기
‘private 멤버 함수 + 선언만’ 담당하는 클래스
factory function
 factory function : 새로 생성된 파생 클래스 객체에 대한 기본 클래스 포인터를 반환하는 함수
factory function 해제 시 주의할 점
 getTimeKeeper 함수가 반환하는 포인터느
파생 클래스 객체에 대한 포인터이다.
 이 포인터가 가리키는 객체가 삭제될 때는 기
본 클래스 포인터를 통해 삭제된다.
 기본 클래스에 들어 있는 소멸자가 non-
virtual destructor이다.
 C++의 규정에 의하면, 기본 클래스 포인터를
통해 파생 클래스 객체가 삭제될 때 그 기본 클
래스에 비가상 소멸자가 들어 있으면 프로그램
동작은 undefined behavior
가상 소멸자로 factory function 문제 해결
 virtual ~ TimeKeeper(); 하나로 해결 가능
 기본 클래스에는 대개 소멸자 외에도 가상 멤버 함수들이 들어 있는 경우가 있는데, 이는 파생 클래
스를 구현할 때 해당 함수를 역할에 따라 맞추는 작업을 허용한다는 의미이다.
 가상 함수를 하나라도 가진 클래스는 가상 소멸자를 가져야 하는 게 대부분 맞다.
 가상 소멸자를 갖고 있지 않은 클래스는 기본 클래스로 쓰일 의지를 상실한 것이다.
 반대로 기본 클래스로 의도하지 않은 클래스에 대해 소멸자를 가상으로 선언하는 것 또한 좋지 않다.
 정리하면, 클래스에 가상 함수가 하나라도 들어 있는 경우에만 가상 소멸자를 선언한다.
가상 소멸자가 없는 클래스로부터 파생 문제
소멸자를 통한 예외 처리
소멸자에서 발생하는 예외 처리1
소멸자에서 발생하는 예외 처리2
대입 연산자는 *this의 참조자를 반환

More Related Content

PPTX
이펙티브 C++ 스터디
quxn6
 
PPTX
이펙티브 C++ (7~9)
익성 조
 
PPTX
이펙티브 C++ 공부
quxn6
 
PPTX
이펙티브 C++ 5,6 장 스터디
quxn6
 
PPTX
Effective c++chapter3
성연 김
 
PPTX
Effective cpp
TonyCms
 
PPTX
Effective c++chapter1 and2
성연 김
 
PPTX
Effective c++chapter4
성연 김
 
이펙티브 C++ 스터디
quxn6
 
이펙티브 C++ (7~9)
익성 조
 
이펙티브 C++ 공부
quxn6
 
이펙티브 C++ 5,6 장 스터디
quxn6
 
Effective c++chapter3
성연 김
 
Effective cpp
TonyCms
 
Effective c++chapter1 and2
성연 김
 
Effective c++chapter4
성연 김
 

What's hot (20)

PPTX
Effective c++chapter8
성연 김
 
PPTX
Cpp에서 활용해보는 Lambda식
TonyCms
 
PDF
More effective c++ chapter1 2_dcshin
Dong Chan Shin
 
PPT
effective c++ chapter 3~4 정리
Injae Lee
 
PDF
5 6 1
nexthw
 
PPTX
Effective C++ Chaper 1
연우 김
 
PPTX
Effective c++ 4
현찬 양
 
PPTX
More effective c++ chapter1,2
문익 장
 
PPTX
More effective c++ 2
현찬 양
 
PDF
[Swift] Generics
Bill Kim
 
PPTX
Effective c++ 1~8장
Shin heemin
 
PDF
Effective c++ chapter 1,2 요약
Nam Hyeonuk
 
PDF
Scala type class pattern
Yong Joon Moon
 
PPTX
Effective c++ 챕터 2 정리
연우 김
 
PPTX
Effective c++ 정리 chapter 6
연우 김
 
PPTX
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
Min-soo Park
 
PPTX
More effective c++ 1
현찬 양
 
PDF
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Hyuncheol Jeon
 
PPTX
Scala nested function generic function
Yong Joon Moon
 
PPTX
모어 이펙티브 c++ 1,2장 스터디
quxn6
 
Effective c++chapter8
성연 김
 
Cpp에서 활용해보는 Lambda식
TonyCms
 
More effective c++ chapter1 2_dcshin
Dong Chan Shin
 
effective c++ chapter 3~4 정리
Injae Lee
 
5 6 1
nexthw
 
Effective C++ Chaper 1
연우 김
 
Effective c++ 4
현찬 양
 
More effective c++ chapter1,2
문익 장
 
More effective c++ 2
현찬 양
 
[Swift] Generics
Bill Kim
 
Effective c++ 1~8장
Shin heemin
 
Effective c++ chapter 1,2 요약
Nam Hyeonuk
 
Scala type class pattern
Yong Joon Moon
 
Effective c++ 챕터 2 정리
연우 김
 
Effective c++ 정리 chapter 6
연우 김
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
Min-soo Park
 
More effective c++ 1
현찬 양
 
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Hyuncheol Jeon
 
Scala nested function generic function
Yong Joon Moon
 
모어 이펙티브 c++ 1,2장 스터디
quxn6
 
Ad

Viewers also liked (11)

PDF
블로그기반 비즈니스사례 91117[1]
guestc454e976a
 
PDF
Unity ads integration guide_201504
UnityAds
 
PPTX
Team Hi 소개 ppt
980413
 
PDF
Service design in urban design field
Sumin Bak
 
PPTX
#2 정보기술기초 블로그 만들기 PPT
형 원
 
PDF
Up cycling ppt.JINHANSOL
Jin Hansol
 
PPTX
bsSelector.js(OctoberSky.js)
Seung-Hyun PAEK
 
PDF
컬러배스 PPT_JINHANSOL(진행중)
Jin Hansol
 
PDF
Google scholar 똑똑하게 사용하는 방법_PPT
Yulee Kwon
 
PDF
ASA-K 11기 의장후보 장일준대사 공약 ppt
Hanho Noh
 
PDF
창발 업사이클링 최종과제
po02117
 
블로그기반 비즈니스사례 91117[1]
guestc454e976a
 
Unity ads integration guide_201504
UnityAds
 
Team Hi 소개 ppt
980413
 
Service design in urban design field
Sumin Bak
 
#2 정보기술기초 블로그 만들기 PPT
형 원
 
Up cycling ppt.JINHANSOL
Jin Hansol
 
bsSelector.js(OctoberSky.js)
Seung-Hyun PAEK
 
컬러배스 PPT_JINHANSOL(진행중)
Jin Hansol
 
Google scholar 똑똑하게 사용하는 방법_PPT
Yulee Kwon
 
ASA-K 11기 의장후보 장일준대사 공약 ppt
Hanho Noh
 
창발 업사이클링 최종과제
po02117
 
Ad

Similar to Effective c++ Chapter1,2 (20)

PPTX
Effective c++ 1,2
세빈 정
 
PDF
2014-15 Intermediate C++ Study #6
Chris Ohk
 
PDF
Effective C++ Chapter 1 Summary
SeungYeonChoi10
 
PDF
MEC++ 5
Gyeongwook Choi
 
PPTX
Chapter5 ~ 6
Injae Lee
 
PPTX
Api design for c++ pattern
jinho park
 
PPTX
Api design for c++ ch3 pattern
jinho park
 
PDF
Effective c++ chapter1 2_dcshin
Dong Chan Shin
 
PPTX
Mec++ chapter3,4
문익 장
 
PPTX
게임프로그래밍입문 7
Yeonah Ki
 
PPTX
모어이펙티브 C++ 3,4장 예외, 효율 스터디
quxn6
 
PPTX
Effective STL 1~4장 정리
Shin heemin
 
PPTX
Effective c++ 정리 1~2
Injae Lee
 
PPTX
모어 이펙티브 c++ 5장 스터디
quxn6
 
PDF
2014-15 Intermediate C++ Study #7
Chris Ohk
 
PDF
M1 2 1
nexthw
 
PDF
The c++ programming language 10장 클래스 발표
재정 이
 
PPTX
Chapter7~9 ppt
Injae Lee
 
PDF
EC 789
Gyeongwook Choi
 
PPTX
C++ Template/STL study
Seo Dong-yu
 
Effective c++ 1,2
세빈 정
 
2014-15 Intermediate C++ Study #6
Chris Ohk
 
Effective C++ Chapter 1 Summary
SeungYeonChoi10
 
Chapter5 ~ 6
Injae Lee
 
Api design for c++ pattern
jinho park
 
Api design for c++ ch3 pattern
jinho park
 
Effective c++ chapter1 2_dcshin
Dong Chan Shin
 
Mec++ chapter3,4
문익 장
 
게임프로그래밍입문 7
Yeonah Ki
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
quxn6
 
Effective STL 1~4장 정리
Shin heemin
 
Effective c++ 정리 1~2
Injae Lee
 
모어 이펙티브 c++ 5장 스터디
quxn6
 
2014-15 Intermediate C++ Study #7
Chris Ohk
 
M1 2 1
nexthw
 
The c++ programming language 10장 클래스 발표
재정 이
 
Chapter7~9 ppt
Injae Lee
 
C++ Template/STL study
Seo Dong-yu
 

More from 문익 장 (13)

PPTX
Mec chapter 5,6
문익 장
 
PPTX
Effective c++ chapter 7,8
문익 장
 
PPTX
Std bind
문익 장
 
PPTX
Winsock
문익 장
 
PPTX
C++ align
문익 장
 
PPTX
Alignment
문익 장
 
PPTX
Tcp server / client
문익 장
 
PPTX
Effective c++(chapter 5,6)
문익 장
 
PPTX
삼각형으로 지면 만들기
문익 장
 
PPTX
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)
문익 장
 
PPTX
3D Graphics Transform
문익 장
 
PPTX
Direct3d overview
문익 장
 
PPTX
Effective c++(chapter3,4)
문익 장
 
Mec chapter 5,6
문익 장
 
Effective c++ chapter 7,8
문익 장
 
Std bind
문익 장
 
Winsock
문익 장
 
C++ align
문익 장
 
Alignment
문익 장
 
Tcp server / client
문익 장
 
Effective c++(chapter 5,6)
문익 장
 
삼각형으로 지면 만들기
문익 장
 
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)
문익 장
 
3D Graphics Transform
문익 장
 
Direct3d overview
문익 장
 
Effective c++(chapter3,4)
문익 장
 

Effective c++ Chapter1,2

  • 2. Chapter 1 C++에 왔으면 C++의 법을 따르자
  • 3. 기본 용어 정의  Declaration - 코드에 사용되는 ‘어떤 대상'의 이름과 타입을 컴파일러에게 알려주는 것  Definition – 선언에서 빠진 구체적인 세부사항을 컴파일러에게 제공하는 것  Initialization – 어떤 객체에 최초의 값을 부여하는 과정  Default constructor – 어떤 인자도 주어지지 않은 채로 호출될 수 있는 생성자
  • 5. explicit  오류가 발생할 수 있는 암시적 형식의 변환을 방지한다.  매개 변수가 하나뿐인 C++ ctors(생성자)는 암시적 형식 변환을 자동을 수행한다.  예를 들어, ctor이 문자열 포인터 매겨 변수를 예상할 때, int를 전달하는 경우 코드는 int를 분자열 포인터로 변환하는 코드를 추가한다. 그러나 이 자동 동작으로 인해 오류가 발생할 수 있다.  암시적 변환을 방지하려면 explicit 키워드를 ctor 선언에 추가할 수 있다. 이는 강제로 코드가 올바 를 형식의 매개 변수를 사용하거나 올바른 형식에 대핸 매개 변수를 캐스팅하게 한다. 즉, 캐스팅을 코드에서 명시적으로 표시하지 못하면 오류가 발생한다.
  • 6. Copy constructor  어떤 객체의 초기화를 위해 그와 같은 타입의 객체로부터 초기화할 때 호출되는 함수
  • 7. Copy assignment operator  같은 타입의 다른 객체에 어떤 객체의 값을 복사하는 용도로 쓰이는 함수
  • 8. Copy constructor & copy assignment
  • 9. STL(Standard Template Library)  C++ 표준 라이브러리 중 하나  컨테이너(vector, list, set, map등), 반복자(vector<int>::iterator, set<string>::iterator 등), 알고리 즘(for_each, find, sort 등) 및 이들과 관련된 기능들이 집결한 결정체  컨테이너, 반복자, 알고리즘에 관련된 기능들의 상당 부분을 함수 객체(function object), 즉 함수처 럼 동작하는 C++ 객체가 차지하고 있다.
  • 10. Undefined behavior  동작 자체가 글자 그대로 ‘정의되어 있지 않다.’  실행 시간에 어떤 현상이 터질지 확실히 예측할 수 없다는 뜻이다.
  • 11. Multiparadigm programming language  C  객체 지향 개념의 C++  템플릿 C++  STL  위 4가지 sublanguage들이 C++을 구성한다.  Unified language, sublanguage federation  어떤 경우에 C++의 어떤 부분을 사용할지에 대해서 고민하라.
  • 12. #define을 쓰려거든 const, enum, inline을…  #define 사용의 문제점  #define ASPECT_RATIO 1.653  이 경우, 우리에겐 ASPECT__RATIO가 symbolic name으로 보이지만, 컴파일러에겐 숫자 상수로 보인다.  컴파일 에러가 발생하면 에러 메시지에는 ASPECT_RATIO 대신에 1.653이 나타난다. ASPECT_RATIO를 찾아가지 않으면 난감해질 수 있다.  #define ASPECT_RATIO 1.653 -> const double AspectRatio = 1.653;
  • 13. #define -> const 상수  #define 매크로를 사용하면 선행 처리자에 의해 ASPECT_RATIO가 등장하기만 하면 1.653으로 모 두 바뀌면서 목적 코드 안에 1.653의 사본이 등장 횟수만큼 들어가게 된다.  상수 타입의 AspectRatio는 아무리 여러 번 쓰이더라도 사본은 딱 한 개만 생긴다.  결국, 상수가 보동소수점 실수 타입일 경우에는 컴파일을 거친 최종 코드의 크기가 #define을 썻을 때보다 작게 나올 수 있다.
  • 14. #define -> const 상수 주의할 점  Constant pointer – 상수 정의는 대게 헤더 파일에 넣는 것이 상례이므로 (다른 소스 파일이 이것을 include해서 쓴다.) pointe는 꼭 const로 선언해 주어야 한다. Pointer가 가리키는 대상까지 const 로 선언하는 것이 보통이다.  예) const char * const authorName = “Scott Meyers”;  char * 기반 문자열보다는 string 객체가 사용하기 좋다.  예) const std::string authorName(“Scott Meyers”);
  • 15. 정적 클래스 상수의 선언과 정의
  • 20. inline 함수  프로그램의 코드들 가운데 컴파일된 함수 코드가 삽입된다.  프로그램은 해당 코드를 수행하기 위해 일반 함수 수행처럼 메모리에 있는 함수의 주소를 찾아 점프 할 필요가 없다.  일반 함수보다 약간이나마 빠른 수행 속드를 갖는다.  크기가 큰 함수를 인라인 함수로 사용하면(10번 호출한다면 프로그램 코드 사이에 10개의 복사본이 삽입된다.) 메모리 낭비를 유발할 수도 있다.
  • 21. 항목 3: 낌새만 보이면 const  const 키워드가 붙은 객체는 외부 변경을 불가능하게 한다는 ‘의미적인 제약‘을 소스 코드 수준에서 붙인다.  컴파일러가 이 제약을 단단히 지켜준다.  어떤 값이 불변이어야 한다는 제작자의 의도를 컴파일러 및 다른 프로그래머와 나눌 수 있는 수단
  • 22. const 사용  클래스 바깥에서는 전역 혹은 네임스페이이스 유효범위의 상수를 선언하는 데 사용할 수 있다.  그리고 파일, 함수 , 블록 유효범위에서 static으로 선언한 객체에도 const를 붙일 수 있다.  클래스 내부의 경우에는, 정적 멤버 및 비정적 데이터 멤버 모두를 상수로 선언할 수 있다.  그리고 포인터의 경우, 기본적으로 포인터 자체를 상수로, 혹은 포인터가 가리키는 데이터를 상수로 지정할 수 있다. 둘 다 지정할 수도 있고 아무것도 지정하지 않을 수도 있다.
  • 25. 상수 멤버 함수  멤버 함수에 붙은 const 키워드의 역할은 “해당 멤버 함수가 상수 객체에 대해 호출될 함수이다.”라 는 사실을 알려주는 것이다.  클래스의 인터페이스를 이해하기 좋게 하기 위해서, 그 클래스로 만들어진 객체를 변경할 수 있는 함수는 무엇이고, 또 변경할 수 없는 함수는 무엇인가를 사용자 쪽에서 할 수 있도록 한다.  이 키워드를 통해 상수 객체를 사용할 수 있도록 한다. C++ 프로그램의 실행 성능을 높이는 핵심 기 법 중 하나가 객체 전달을 ‘상수 객체에 대한 참조자(reference-to-const)’로 진행하는 것이다.
  • 27. 비트수준 상수성  어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 그 멤버 함수가 ‘const’  즉, 그 객체를 구성하는 비트들 중 어떤 것도 바꾸면 안 된다.  어떤 포인터가 가리키는 대상을 수정하는 멤버 함수들 중 비트수준 상수성 검사를 통과하는 멤버 함 수들이 적지 않다.
  • 30. 상수 멤버 및 비상수 멤버 함수에서 중복 회피
  • 31. 항목 4: 객체를 사용하기 전에 반드시 초기화
  • 33. 초기화 리스트를 사용한 initialization  theName, theAddress, thePhones이 복사 생성자에 의해 초기화  기본 생성자 호출 후에 복사 대입 연산자를 연 달아 호출하는 방법보다 복사생성자를 한 번 호출하는 쪽이 더 효율적이다.
  • 35. 클래스 데이터 멤버는 모두 초기화 리스트에  기본제공 타입의 객체는 사실 초기화와 대입에 걸리는 비용의 차이가 없다.  초기화 리스트에서 어떤 멤버를 빼먹었을 때 어떤 멤버가 초기화되지 않을 수 있다는 부담을 해결할 수 있다.  기본제공 타입의 객체는 초기화될지 안 될지 장담할 수 없다.(undefined behavior)  상수이거나 참조자로 되어 있는 데이터 멤버의 경우엔 반드시 초기화되어야 한다.(상수와 참조자는 대입 자체가 불가능하기 때문이다.)
  • 36. 객체를 구성하는 데이터의 초기화 순서  기본 클래스는 파생 클래스보다 먼저 초기화된다.  클래스 데이터 멤버는 그들이 선언된 순서대로 초기화된다.
  • 37. static object  자신이 생성된 시점부터 프로그램이 끝날 때까지 살아 있는 객체를 일컫는다.  스택 객체 및 힙 기반 객체는 정적 객체가 될 수 없다.  전역 객체(non-local static object)  네임스페이스 유효범위에서 정의된 객체(non-local static object)  클래스 안에서 static으로 선언된 객체(non-local static object)  함수 안에서 static으로 선언된 객체(local static object)  파일 유효범위에서 static으로 정의된 객체(non-local static object)  static object는 main() 함수의 실행이 끝날 때 소멸자가 호출된다.
  • 38. translation unit  컴파일을 통해 하나의 목적 파일(object file)을 만드는 바탕이 되는 소스 코드  기본적으로는 소스 파일 하나가 되는데, 그 파일이 #include 하는 파일들까지 합쳐서 하나의 번역 단위가 된다.
  • 39. translation unit과 non-local static object  서로 다른 translation unit에 정의된 non-local static object 사이 상대적인 초기화 순서는 정해져 있지 않다.  설계에 변화를 주어 이 문제를 해결하여야 한다.
  • 40. 발생할 수 있는 문제 예시
  • 41. 문제 해결 방법  비지역 정적 객체를 하나씩 맡는 함수를 준비한다.  이 안에 각 객체를 넣는다.  함수 속에서도 이들은 정적 객체로 선언한다.  그 함수에서는 이들에 대한 참조자를 반환하게 한다.  사용자 쪽에서는 비지역 정적 객체를 직접 참조하는 과거의 폐단을 버리고 함수 호출로 대신한다.  결과적으로 ‘비지역 정적 객체’가 ‘지역 정적 객체’로 바뀐 것이다.  Singleton pattern의 전형적인 구현양식  객체들의 초기화 순서를 제대로 맞춰 둔다는 전제조건이 뒷받침되어야 한다.  객체 B가 초기화되기 전에 객체 A가 초기화되어야 하는데, A의 초기화가 B의 초기화에 의존하도록 만들어져 있다면 문 제는 해결되지 않는다.  다중 스레드에서는 몰라도 단일 스레드 애플리케이션에서는 확실하다.
  • 43. Chapter 2 생성자, 소멸자 및 대입 연산자
  • 44. 생성자, 소멸자, 대입 연산자  생성자 : 새로운 객체를 메모리에 만드는 데 필요한 과정을 제어하고 객체의 초기화를 맡는 함수  소멸자 : 객체를 없앰과 동시에 그 객체가 메모리에서 적절히 사라질 수 있도록 하는 과정을 제어하 는 함수  대입 연산자 : 기존의 객체에 다른 객체의 값을 줄 때 사용하는 함수
  • 45. 항목 5: C++가 은근슬쩍 만들어 호출해……  클래스 안에 직접 선언해 넣지 않으면 컴파일러가 저절로 선언해 주도록 되어 있는 멤버 함수가 있 다.  copy constructor, copy assignment, destructor  이런 경우 컴파일러는 public 멤버이며 inline함수의 형태로 저절로 선언하게 된다.
  • 48. 복사 대입 연산자를 생성하는 경우
  • 49. 컴파일러가 생성한 함수가 필요 없으면 생성을 막자  복사 생성자와 복사 대입 연산자가 저절로 만들어지는 것을 막지 않으면 의도치 않은 문제가 발생할 수 있다.  복사 생성자와 복사 대입 연산자를 public 멤버가 아닌 private 멤버로 선언하자.  명시적으로 선언되기 때문에 컴파일러는 자신의 기본 버전을 만들 수 없게 된다.
  • 50. private 멤버 함수만으로 충분한가?  private 함수는 그 클래스의 멤버 함수 및 friend 함수가 호출할 수 있다.  호출될 경우를 대비하여 복사 생성자와 복사 대입 연산자를 define하지 않으면 된다.  private 멤버로 선언 + define(구현)하지 않기로 앞의 문제를 해결할 수 있다.
  • 51. private 멤버 함수 + 구현 안하기
  • 52. ‘private 멤버 함수 + 선언만’ 담당하는 클래스
  • 53. factory function  factory function : 새로 생성된 파생 클래스 객체에 대한 기본 클래스 포인터를 반환하는 함수
  • 54. factory function 해제 시 주의할 점  getTimeKeeper 함수가 반환하는 포인터느 파생 클래스 객체에 대한 포인터이다.  이 포인터가 가리키는 객체가 삭제될 때는 기 본 클래스 포인터를 통해 삭제된다.  기본 클래스에 들어 있는 소멸자가 non- virtual destructor이다.  C++의 규정에 의하면, 기본 클래스 포인터를 통해 파생 클래스 객체가 삭제될 때 그 기본 클 래스에 비가상 소멸자가 들어 있으면 프로그램 동작은 undefined behavior
  • 55. 가상 소멸자로 factory function 문제 해결  virtual ~ TimeKeeper(); 하나로 해결 가능  기본 클래스에는 대개 소멸자 외에도 가상 멤버 함수들이 들어 있는 경우가 있는데, 이는 파생 클래 스를 구현할 때 해당 함수를 역할에 따라 맞추는 작업을 허용한다는 의미이다.  가상 함수를 하나라도 가진 클래스는 가상 소멸자를 가져야 하는 게 대부분 맞다.  가상 소멸자를 갖고 있지 않은 클래스는 기본 클래스로 쓰일 의지를 상실한 것이다.  반대로 기본 클래스로 의도하지 않은 클래스에 대해 소멸자를 가상으로 선언하는 것 또한 좋지 않다.  정리하면, 클래스에 가상 함수가 하나라도 들어 있는 경우에만 가상 소멸자를 선언한다.
  • 56. 가상 소멸자가 없는 클래스로부터 파생 문제
  • 60. 대입 연산자는 *this의 참조자를 반환