SlideShare ist ein Scribd-Unternehmen logo
1 von 60
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의 참조자를 반환

Weitere ähnliche Inhalte

Was ist angesagt?

Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
현찬 양
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2
문익 장
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
현찬 양
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
Min-soo Park
 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1
현찬 양
 

Was ist angesagt? (20)

Effective c++chapter8
Effective c++chapter8Effective c++chapter8
Effective c++chapter8
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식
 
More effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshinMore effective c++ chapter1 2_dcshin
More effective c++ chapter1 2_dcshin
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
5 6 1
5 6 15 6 1
5 6 1
 
Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
More effective c++ chapter1,2
More effective c++ chapter1,2More effective c++ chapter1,2
More effective c++ chapter1,2
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
 
[Swift] Generics
[Swift] Generics[Swift] Generics
[Swift] Generics
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
Scala type class pattern
Scala type class patternScala type class pattern
Scala type class pattern
 
Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리
 
Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6Effective c++ 정리 chapter 6
Effective c++ 정리 chapter 6
 
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
NHNNEXT 개경프14 Subway Rocket Team Study 3rd C++
 
More effective c++ 1
More effective c++ 1More effective c++ 1
More effective c++ 1
 
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are FundamentalSecrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
 
Scala nested function generic function
Scala nested function generic functionScala nested function generic function
Scala nested function generic function
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디
 

Andere mochten auch

블로그기반 비즈니스사례 91117[1]
블로그기반 비즈니스사례 91117[1]블로그기반 비즈니스사례 91117[1]
블로그기반 비즈니스사례 91117[1]
guestc454e976a
 
Service design in urban design field
Service design in urban design fieldService design in urban design field
Service design in urban design field
Sumin Bak
 
창발 업사이클링 최종과제
창발 업사이클링 최종과제창발 업사이클링 최종과제
창발 업사이클링 최종과제
po02117
 

Andere mochten auch (11)

블로그기반 비즈니스사례 91117[1]
블로그기반 비즈니스사례 91117[1]블로그기반 비즈니스사례 91117[1]
블로그기반 비즈니스사례 91117[1]
 
Unity ads integration guide_201504
Unity ads integration guide_201504Unity ads integration guide_201504
Unity ads integration guide_201504
 
Team Hi 소개 ppt
Team Hi 소개 pptTeam Hi 소개 ppt
Team Hi 소개 ppt
 
Service design in urban design field
Service design in urban design fieldService design in urban design field
Service design in urban design field
 
#2 정보기술기초 블로그 만들기 PPT
#2 정보기술기초 블로그 만들기 PPT#2 정보기술기초 블로그 만들기 PPT
#2 정보기술기초 블로그 만들기 PPT
 
Up cycling ppt.JINHANSOL
Up cycling ppt.JINHANSOLUp cycling ppt.JINHANSOL
Up cycling ppt.JINHANSOL
 
bsSelector.js(OctoberSky.js)
bsSelector.js(OctoberSky.js)bsSelector.js(OctoberSky.js)
bsSelector.js(OctoberSky.js)
 
컬러배스 PPT_JINHANSOL(진행중)
컬러배스 PPT_JINHANSOL(진행중)컬러배스 PPT_JINHANSOL(진행중)
컬러배스 PPT_JINHANSOL(진행중)
 
Google scholar 똑똑하게 사용하는 방법_PPT
Google scholar 똑똑하게 사용하는 방법_PPTGoogle scholar 똑똑하게 사용하는 방법_PPT
Google scholar 똑똑하게 사용하는 방법_PPT
 
ASA-K 11기 의장후보 장일준대사 공약 ppt
ASA-K 11기 의장후보 장일준대사 공약 pptASA-K 11기 의장후보 장일준대사 공약 ppt
ASA-K 11기 의장후보 장일준대사 공약 ppt
 
창발 업사이클링 최종과제
창발 업사이클링 최종과제창발 업사이클링 최종과제
창발 업사이클링 최종과제
 

Ähnlich wie Effective c++ Chapter1,2

Chapter5 ~ 6
Chapter5 ~ 6Chapter5 ~ 6
Chapter5 ~ 6
Injae Lee
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
jinho park
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
문익 장
 
M1 2 1
M1 2 1M1 2 1
M1 2 1
nexthw
 
The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표
재정 이
 

Ähnlich wie Effective c++ Chapter1,2 (20)

Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2
 
2014-15 Intermediate C++ Study #6
2014-15 Intermediate C++ Study #62014-15 Intermediate C++ Study #6
2014-15 Intermediate C++ Study #6
 
Effective C++ Chapter 1 Summary
Effective C++ Chapter 1 SummaryEffective C++ Chapter 1 Summary
Effective C++ Chapter 1 Summary
 
MEC++ 5
MEC++ 5MEC++ 5
MEC++ 5
 
Chapter5 ~ 6
Chapter5 ~ 6Chapter5 ~ 6
Chapter5 ~ 6
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
Mec++ chapter3,4
Mec++ chapter3,4Mec++ chapter3,4
Mec++ chapter3,4
 
게임프로그래밍입문 7
게임프로그래밍입문 7게임프로그래밍입문 7
게임프로그래밍입문 7
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디
 
Effective STL 1~4장 정리
Effective STL 1~4장 정리Effective STL 1~4장 정리
Effective STL 1~4장 정리
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디
 
2014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #72014-15 Intermediate C++ Study #7
2014-15 Intermediate C++ Study #7
 
M1 2 1
M1 2 1M1 2 1
M1 2 1
 
The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표
 
Chapter7~9 ppt
Chapter7~9 pptChapter7~9 ppt
Chapter7~9 ppt
 
EC 789
EC 789EC 789
EC 789
 
C++ Template/STL study
C++ Template/STL studyC++ Template/STL study
C++ Template/STL study
 

Mehr von 문익 장 (13)

Mec chapter 5,6
Mec chapter 5,6Mec chapter 5,6
Mec chapter 5,6
 
Effective c++ chapter 7,8
Effective c++ chapter 7,8Effective c++ chapter 7,8
Effective c++ chapter 7,8
 
Std bind
Std bindStd bind
Std bind
 
Winsock
WinsockWinsock
Winsock
 
C++ align
C++ alignC++ align
C++ align
 
Alignment
AlignmentAlignment
Alignment
 
Tcp server / client
Tcp server / clientTcp server / client
Tcp server / client
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
삼각형으로 지면 만들기
삼각형으로 지면 만들기삼각형으로 지면 만들기
삼각형으로 지면 만들기
 
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)
소켓 주소 구조체 다루기(윈도우 네트워크 프로그래밍)
 
3D Graphics Transform
3D Graphics Transform3D Graphics Transform
3D Graphics Transform
 
Direct3d overview
Direct3d overviewDirect3d overview
Direct3d overview
 
Effective c++(chapter3,4)
Effective c++(chapter3,4)Effective c++(chapter3,4)
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의 참조자를 반환