effective c++ chapter1 2_dcshin

24
We are! Digging Effective C++ Chapter 1 Chapter 2 NEXT 1๊ธฐ 131039 ์‹ ๋™์ฐฌ

Upload: dongchan-shin

Post on 27-Jun-2015

194 views

Category:

Technology


1 download

DESCRIPTION

This content wrote for Advanced C++ Class in NHN NEXT. 2014. spring-summer semester

TRANSCRIPT

Page 1: Effective c++ chapter1 2_dcshin

We are!

Digging Effective C++

Chapter 1Chapter 2

NEXT 1๊ธฐ131039 ์‹ ๋™์ฐฌ

Page 2: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 1. United State of C++!

C++๋Š” ๋” ์ด์ƒ ๋‹จ์ˆœ C with Classes๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ์–ธ์–ด๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…์“ฐ๋Š” ์˜์—ญ์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋„ ๋‹ค๋ณ€ํ™”

C++

๊ฐ์ฒด์ง€ํ–ฅ ๊ฐœ๋…์˜ C++

ํ…œํ”Œ๋ฆฟ C++ STL

โ€ข์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›โ€ข๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›โ€ข๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›

โ€ข๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋… ์ถ”๊ฐ€โ€ขํด๋ž˜์Šค, ์บก์Šํ™”, ์ƒ์†์œผ๋กœ ๊ตฌํ˜„โ€ข๋‹คํ˜•์„ฑ, ๊ฐ€์ƒ ํ•จ์ˆ˜๋กœ ๊ตฌ์ฒดํ™”

โ€ขํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐโ€ข์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑโ€ข์šฉ๋„์— ๋งž์ถฐ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ ์‚ฌ์šฉ

โ€ข์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌโ€ข์ปจํ…Œ์ด๋„ˆ, ๋ฐ˜๋ณต์ž, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ

C

โ€ข๊ธฐ๋ณธ์ œ๊ณต ๋ฐ์ดํ„ฐํƒ€์ž…โ€ข์ „์ฒ˜๋ฆฌ๊ธฐ, ๋ฐฐ์—ด, ํฌ์ธํ„ฐ ๋“ฑโ€ข๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์˜ ์›์ฒœ

Page 3: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 2. ๋‚ญ๋น„๋ฒฝ์„ ๊ฐ€์ง„ #define

์ „์ฒ˜๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” #define์„ ๋ฒ„๋ฆฌ๊ณ  ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ž

์ด์œ 1) ์ฝ”๋“œ ์ „์ฒด ์˜์—ญ์—์„œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” #define์€ ๋‚ญ๋น„์ด์œ 2) #define์—๋Š” ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ์—†๋‹ค์ด์œ 3) #define ๋งคํฌ๋กœ๋ฅผ ์ž˜๋ชป ์จ ๊ทธ๋งŒ...

ํ•ด๊ฒฐ๋ถ€ํ„ฐ ๋ณด๊ณ  ๊ฐ€์‹ค๊ป˜์š”

๋ฐฉ์•ˆ1) ์ƒ์ˆ˜ ํƒ€์ž…(const)์™€ ์นœํ•ด์งˆ ๊ฒƒ๋ฐฉ์•ˆ2) ํด๋ž˜์Šค์—์„œ๋Š” ์ •์  ๋ฉค๋ฒ„๋กœ ๋งŒ๋“ค ๊ฒƒ๋ฐฉ์•ˆ3) inline ํ•จ์ˆ˜๋ฅผ ์“ธ ๊ฒƒ

Page 4: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 2. ๋‚ญ๋น„๋ฒฝ์„ ๊ฐ€์ง„ #define

#define MAX_BUFF 1024 const int MAX_BUFF = 1024;

โ€ข ์ปดํŒŒ์ผ ์—๋Ÿฌ์‹œ ํ™•์ธ์ด ์–ด๋ ค์›€์ปดํŒŒ์ผ์—์„œ๋Š” ์ด๋ฏธ ์ˆซ์ž ์ƒ์ˆ˜๋กœ ๋Œ€์ฒด

โ€ข ์ฝ”๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ์กด์žฌํ•ด๋‹น ๋‹จ์–ด๋ฅผ ๊ธฐ๊ณ„์ ์œผ๋กœ ๋Œ€์น˜ ํ•จ

โ€ข ์œ ํšจ๋ฒ”์œ„ ๊ฐœ๋…์ด ์—†์Œ

โ€ข ์บก์Šํ™” ๋ถˆ๊ฐ€

โ€ข ์ปดํŒŒ์ผ๋Ÿฌ ํ™•์ธ ๋ฐ ๊ธฐํ˜ธ ํ…Œ์ด๋ธ” ์ž…๋ ฅ

โ€ข ์ƒ์ˆ˜ ํƒ€์ž…์€ ์—ฌ๋Ÿฌ ๋ฒˆ ์“ฐ์ด๋”๋ผ๋„ ์‚ฌ๋ณธ์€ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ

โ€ข ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ •์ (static) ๋ฉค๋ฒ„๋กœ๋งŒ๋“ค์–ด ํด๋ž˜์Šค ์˜์—ญ์—์„œ๋งŒ ์‚ฌ์šฉ

โ€ข ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋Š” ์บก์Šํ™” ๋จ

Page 5: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 2. ๋‚ญ๋น„๋ฒฝ์„ ๊ฐ€์ง„ #define

ํด๋ž˜์Šค ๋‚ด๋ถ€ ์ƒ์ˆ˜ ์ƒ์„ฑ ๋ฐ ํ™œ์šฉ ๋ฐฉ๋ฒ•

//in header fileclass CostEstimate {private:

Static const double FudgeFactor;โ€ฆ

}

// in implement fileconst double CostEstimate::FudgeFactor = 1.35;

๋ฐฉ๋ฒ•1)

//in header fileclass CostEstimate {private:

Static const double FudgeFactor = 1.35;โ€ฆ

}

// in implement fileconst double CostEstimate::FudgeFactor;

๋ฐฉ๋ฒ•2) ๋ฐฉ๋ฒ•3)

//in header fileclass CostEstimate {private:

Enum { NumTurns = 5 };

Int scores[NumTurns];โ€ฆ

}

โ€ข ์ •์  ์ƒ์ˆ˜ ์ƒ์„ฑ ํ›„ ๊ตฌํ˜„ ๋ถ€์—์„œ ์ •์˜ โ€ข ๊ตฌ์‹ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ์˜ ์„ ์–ธ๊ณผ ์ •์˜ โ€ข ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ƒ์ˆ˜๊ฐ€ ๋จผ์ € ํ•„์š”ํ•œ ๊ฒฝ์šฐโ€ข Enum hack ๊ธฐ๋ฒ•์œผ๋กœ ์ƒ์ˆ˜ ํ™•๋ณดโ€ข Enum hack ํŠน์ง•

โ€– ๋™์ž‘ ๋ฐฉ์‹์ด ์ง๊ด€์ (#define ์œ ์‚ฌ)โ€– ์“ธ๋ฐ ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์—†์Œ

Page 6: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 2. ๋‚ญ๋น„๋ฒฝ์„ ๊ฐ€์ง„ #define

#define ๋งคํฌ๋กœ์˜ ์œ„ํ—˜์„ฑ์„ ํ”ผํ•˜๋ผ

์ผ๋ฐ˜ ์‚ฌ๋ก€)

#define CALL_WITH_MAX(a, b) f( (a) > (b) ? (a) : (b) )

Int a = 5, b = 0;

CALL_WITH_MAX (++a, b); //1๋ฒˆCALL_WITH_MAX (++a, b+10); //2๋ฒˆ

โ€ข 1๋ฒˆ๊ณผ 2๋ฒˆ์˜ ํ–‰๋™์ด ๋‹ค๋ฆ„

โ€ข 1๋ฒˆ์€ ++a๊ฐ€ 2ํšŒ ์‹คํ–‰์ตœ์ดˆ ๋น„๊ต ๋‹จ๊ณ„์—์„œ 1ํšŒ(a) ๋ฆฌํ„ด ๋‹จ๊ณ„์—์„œ 1ํšŒ

โ€ข 2๋ฒˆ์€ ++a๊ฐ€ 1ํšŒ ์‹คํ–‰

Inlineํ•จ์ˆ˜๋กœ ์•ˆ์ •์„ฑ ํ™•๋ณด)

template<typename T>Inline void callWithMax( const T& a, const T& b ){

f( a > b ? A : b );}

โ€ข ์ž„์˜์˜ T์— ๋Œ€ํ•ด ํฌ๊ธฐ ๋น„๊ต ํ•จ์ˆ˜โ€ข ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํƒ€์ž… ์•ˆ์ •์„ฑ๊นŒ์ง€ ํ™•๋ณด

Page 7: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 3. ๋ผ๋ฉด์Šคํ”„ ๊ฐ™์€ const

Const๋Š” ๊ทธ ์–ด๋–ค ์™ธ๋ถ€ ๋ณ€๊ฒฝ๋„ ๋ง‰์•„๋ƒ„(๋ณ€๊ฒฝ ๋ถˆ๊ฐ€)์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ์•ฝ์„ ํ™•์ธํ•˜๊ณ  ์ง€์ผœ ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ

์šฉ๋„1) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ์ƒ์˜ ์—๋Ÿฌ๋ฅผ ๋Œ€์‹  ํ™•์ธ์šฉ๋„2) ์–ด๋Š ๊ณณ์—์„œ๋“  ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Œ์šฉ๋„3) ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ์‚ฌ์šฉํ•ด ์•ˆ์ „์„ฑ,ํšจ์œจ์„ ํ™•๋ณดํ•˜๋ฉฐ ์—๋Ÿฌ ๊ฐ์†Œ

ex) ์ž˜๋ชป๋œ ๋Œ€์ž… ์—ฐ์‚ฐ ๋“ฑ์šฉ๋„4) ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ข‹๊ฒŒ ํ•จ์šฉ๋„5) ์‹คํ–‰ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๊ธฐ์—ฌ(reference-to-const)

์ฃผ์˜ ์‚ฌํ•ญ

์ฃผ์˜1) ๋น„ํŠธ์ˆ˜์ค€ ์ƒ์ˆ˜์„ฑ์€ ๋ชจ๋“ ๊ฑธ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ์ฃผ์˜2) ์ƒ์ˆ˜ ๋ฉค๋ฒ„, ๋น„์ƒ์ˆ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๊ฐ™์€ ๊ฒฝ์šฐ

๋น„์ƒ์ˆ˜ ๋ฒ„์ „์ด ์ƒ์ˆ˜ ๋ฒ„์ „์„ ํ˜ธ์ถœํ•˜๋„๋ก ํ•จ

Page 8: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 3. ๋ผ๋ฉด์Šคํ”„ ๊ฐ™์€ const

์ •๋ง ๋‹ค ๊ดœ์ฐฎ์€ const, ๋‹ค๋งŒ ์˜๋ฏธ๊ฐ€ ์กฐ๊ธˆ ๋‹ฌ๋ผ์งˆ ๋ฟ

Char *p = greeting;

const char *p = greeting;

char * const p = greeting;

const char * const p = greeting;

void f1 ( const Widget * pw );

void f2 (Widget const *pw);

std::vector<int> vec;...const std::vector<int>::iterator iter = vec.begin();*iter = 10;++iter;

std::vector<int>::const_iterator cIter = vec.begin();*cIter = 10;++cIter

โ€ข ๋น„์ƒ์ˆ˜ ํฌ์ธํ„ฐ, ๋น„์ƒ์ˆ˜ ๋ฐ์ดํ„ฐโ€ข ๋น„์ƒ์ˆ˜ ํฌ์ธํ„ฐ, ์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ(๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‹œ ์˜ค๋ฅ˜)โ€ข ์ƒ์ˆ˜ ํฌ์ธํ„ฐ, ๋น„์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ(ํฌ์ธํ„ฐ ์ฃผ์†Œ ๋ณ€๊ฒฝ์‹œ ์˜ค๋ฅ˜)โ€ข ์ƒ์ˆ˜ ํฌ์ธํ„ฐ, ์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ(์ „๋ถ€ ๋ณ€๊ฒฝ ๊ธˆ์ง€)

โ€ข ์˜๋ฏธ ์ฐจ์ด ์—†์Œโ€ข Widget ๊ฐ์ฒด๊ฐ€ const

โ€ข Iter๊ฐ€ ์ƒ์ˆ˜โ€ข ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋‚˜ ++iter์—์„œ ์˜ค๋ฅ˜

โ€ข ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์ˆ˜โ€ข ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ์‹œ ์˜ค๋ฅ˜, ++iter ๊ฐ€๋Šฅ

Page 9: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 3. ๋ผ๋ฉด์Šคํ”„ ๊ฐ™์€ const

๋น„ํŠธ ์ˆ˜์ค€ ์ƒ์ˆ˜์„ฑ์€ ํ—ˆ์šฉ๋˜๋‚˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

Class CTextBlock {Public:

โ€ฆchar& operator[]( std::size_t position ) const{ return pText[position]; }

Private:Char *pText;

};

//main ์‹คํ–‰

Const CTextBlock cctb( โ€œHelloโ€ );

Char *pc = &cctb[0];

*pc = โ€˜Jโ€™

โ€ข ์ƒ์ˆ˜ ๊ฐ์ฒด ์„ ์–ธโ€ข ์ƒ์ˆ˜ ๋ฒ„์ „ operator[] ํ˜ธ์ถœ๋กœ cctb์˜ ํฌ์ธํ„ฐ ํš๋“

์ƒ์ˆ˜ ๋ฒ„์ „์ด๋ผ ์•ˆ์ „ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒโ€ข ๊ทธ๋Ÿฌ๋‚˜ ์ง์ ‘ ์ ‘๊ทผ์œผ๋กœ โ€˜Helloโ€™๊ฐ€ โ€˜Jelloโ€™๋กœ ๋ณ€๊ฒฝ

-> ์˜ค๋ฅ˜!-> mutable์„ ์‚ฌ์šฉํ•ด ์ฒ˜๋ฆฌ-> ๋น„๋ก ์ƒ์ˆ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—์„œ๋„ ์ˆ˜์ • ๊ฐ€๋Šฅ

Page 10: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 3. ๋ผ๋ฉด์Šคํ”„ ๊ฐ™์€ const

์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜๋ฉด ๋น„์ƒ์ˆ˜ ๋ฒ„์ „์ด ์ƒ์ˆ˜ ๋ฒ„์ „์„ ๋ถˆ๋Ÿฌ ์˜ค๋„๋ก ํ•จ

Const char& operator[](std::size_t position) const{

//pseudo์ฝ”๋“œ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ();์ ‘๊ทผ ๋ฐ์ดํ„ฐ ๋กœ๊น…();์ž๋ฃŒ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ();

}

char& operator[](std::size_t position){

//pseudo์ฝ”๋“œ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ();์ ‘๊ทผ ๋ฐ์ดํ„ฐ ๋กœ๊น…();์ž๋ฃŒ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ();

}

Const char& operator[](std::size_t position) const{

//pseudo์ฝ”๋“œ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ();์ ‘๊ทผ ๋ฐ์ดํ„ฐ ๋กœ๊น…();์ž๋ฃŒ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ();

}

char& operator[](std::size_t position){

return const_cast<char&>( static_cast<const TextBlock&>(*this)[position] );

}

โ€ข ์ค‘๋ณต์„ ์ œ๊ฑฐโ€ข ์ž…๋ ฅ ์ž๋ฃŒํ˜•๊ณผ ์ถœ๋ ฅ ์ž๋ฃŒํ˜•์„ ๊ฐ•์ œ ํ˜•๋ณ€ํ™˜์œผ๋กœ ์ผ์น˜

Page 11: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 4. ์ƒˆ์ œํ’ˆ์€ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ณ  ์“ฐ์ž

์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์ฝ๋„๋ก ๋‚ด๋ฒ„๋ ค ๋‘๋ฉด์“ฐ๋ ˆ๊ธฐ ๊ฐ’์„ ์ฝ๊ณ  ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘(์˜ค๋ฅ˜) ๋ฐœ์ƒ

๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ ์ดˆ๊ธฐํ™”!

Page 12: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 4. ์ƒˆ์ œํ’ˆ์€ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ณ  ์“ฐ์ž

๋Œ€์ž…์€ ์ดˆ๊ธฐํ™”๊ฐ€ ์•„๋‹ˆ๋‹ค

ABEntry::ABEntry(const std::string& name,const std::string& address,const std::list<PhoneNumber>& phones)

{theName = name;theAddress = address;thePhones = phones;numTimesconsulted = 0;

}

โ€ข ๊ฐ์ฒด์— ๋“ค์–ด์˜จ ์ „๋‹ฌ์ธ์ž๋ฅผ ๋Œ€์ž…ํ•˜๊ณ  ์žˆ์Œ

โ€ข ์ด๋ฏธ ๋Œ€์ž… ์ „์— ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์–ด ์žˆ์—ˆ์–ด์•ผ ํ•จ

ABEntry::ABEntry(const std::string& name,const std::string& address,const std::list<PhoneNumber>& phones)

theName( name ),theAddress( address ),thePhones( phones ),numTimesconsulted( 0 )

{}

โ€ข ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•ด ์ดˆ๊ธฐํ™”

โ€ข ๊ทธ์— ์•ž์„œ ๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ธฐํ™” ํ›„ ํ•จ์ˆ˜์—์„œ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ

Page 13: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 4. ์ƒˆ์ œํ’ˆ์€ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ณ  ์“ฐ์ž

๋น„์ง€์—ญ ์ •์  ๊ฐ์ฒด(์„œ๋กœ ๋‹ค๋ฅธ Class์˜ ์ฐธ์กฐ)๋“ค์˜ ์ดˆ๊ธฐํ™” ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œโ€˜์ดˆ๊ธฐํ™” ๋˜๊ธฐ๋„ ์ „์— ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ์ดˆ๊ธฐํ™” ์ „ ๋ณ€์ˆ˜ ์š”์ฒญโ€˜ = ์˜ค๋ฅ˜Singleton Pattern์œผ๋กœ ํ•ด๊ฒฐ!

โ€ข ๋น„์ง€์—ญ ์ •์  ๊ฐ์ฒด๋ฅผ ๋งก๋Š” ํ•จ์ˆ˜ ์ œ์ž‘ ํ›„ ๊ฐ ๊ฐ์ฒด ๋„ฃ๊ธฐโ€ข ํ•จ์ˆ˜์—์„œ ์ •์  ๊ฐ์ฒด ์„ ์–ธ ํ›„ ์ฐธ์กฐ์ž ๋ฐ˜ํ™˜โ€ข ์ง์ ‘ ์ ‘๊ทผ์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ๋Œ€์ฒด

FileSystem& tfs();Directory& tempDir(); ๋“ฑ

Class FileSystem { โ€ฆ };

FileSystem& tfs(){

Static FileSystem fs;Return fs;

}

Class Directory { โ€ฆ };

Dirctory::Directory( params ){

โ€ฆStd::size_t disks = tfs().numDisks();

}

Directory& tempDir(){

Static Dirctory td;Return td;

}

Page 14: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 5. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ๋งŒ๋“œ๋Š” ์ˆจ๊ฒจ์ง„ ํ•จ์ˆ˜

๋น„์–ด ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋”๋ผ๋„ ์ด๋ฏธ ์ˆจ๊ฒจ์ ธ ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค

class Empty {public:

Empty() { ... }Empty(const Empty& rhs) { ... }

~Empty() { ... }

Empty& operator=( const Empty& rhs) { ... }};

โ€ข ๊ธฐ๋ณธ ์ƒ์„ฑ์ž

โ€ข ๋ณต์‚ฌ ์ƒ์„ฑ์ž

โ€ข ์†Œ๋ฉธ์ž

โ€ข ๋ณต์‚ฌ ๋Œ€์ž… ์—ฐ์‚ฐ์ž

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ๋งŒ๋“ค์ง€๋งŒ...

์‚ฌ์šฉ์ž๊ฐ€ ์šฐ์„  ์„ ์–ธํ•˜๋ฉด ๋งŒ๋“ค์ง€ ์•Š์Œ๋™์ž‘์˜ ์ตœ์ข… ์ฝ”๋“œ๊ฐ€ ์ ๋ฒ•ํ•˜๊ณ  ์ด์น˜์— ๋‹ฟ์•„์•ผ ์ž๋™ ์ƒ์„ฑ

Page 15: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 6. ์•Œ์•„์„œ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ธˆ์ง€ ์‹œํ‚ค์ž

๋ณต์‚ฌ ๋ฐฉ์ง€ ๋“ฑ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ธˆ์ง€ํ•˜๋ ค๋ฉด?์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ด๋ฏธ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Œ์„ ์•Œ๋ ค์คŒ

Class HomeForSale {Public:

โ€ฆPrivate:

...HomeForSale ( const homeForSale& );HomeForSale& operator= ( const HomeForSale& );

}

๋ฐฉ๋ฒ•1)์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์„ ์–ธ(๊ธฐ๋Šฅ์€ ๊ตฌํ˜„ ์•ˆ ํ•จ)

๋ฐฉ๋ฒ•2)๋ณต์‚ฌ ๋ฐฉ์ง€ ๋ถ€๋ชจ ํด๋ž˜์Šค ์‚ฌ์šฉ

Class Uncopyable {Protected:

Uncopyable() {}~Uncopyable() {}

Private:Uncopyable( const Uncopyable& );Uncopyable& operator=( const Uncopyable& );

};

Class HomeForSale : private Uncopyable{Public:

โ€ฆ}

Page 16: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 7. ๋‹คํ˜•์„ฑ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ํ•„์š”ํ•ด

๋™์  ๋ฐ”์ธ๋”ฉ์‹œ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์œผ๋ฉด ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ฉ”๋ชจ๋ฆฌ leak์ด ๋ฐœ์ƒ

๊ธฐ๋ณธ ํด๋ž˜์Šค ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์ž์‹ ํด๋ž˜์Šค ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ ๋  ๋•Œ,๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์œผ๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค๋งŒ ์‚ญ์ œ

โ€ข ์ƒ์„ฑ์‹œ ์ˆœ์„œ1. ๋ถ€๋ชจ ํด๋ž˜์Šค2. ์ž์‹ ํด๋ž˜์Šค

โ€ข ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ ์‹œ1. ๋ถ€๋ชจ ํด๋ž˜์Šค2. ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ์ƒ์‹ค

โ€ข ๊ฐ€์ƒ ์†Œ๋ฉธ์ž ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ1. ์ž์‹ ํด๋ž˜์Šค2. ๋ถ€๋ชจ ํด๋ž˜์Šค

Class TimeKeeper {Public:

TimeKeeper();Virtual ~TimeKeeper();

};

TimeKeeper *ptk = getTimeKeeper();

โ€ฆ

Delete ptk;

Page 17: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 7. ๋‹คํ˜•์„ฑ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ํ•„์š”ํ•ด

๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๋˜๋ฉด ์ ˆ.๋Œ€. ์•ˆ ๋จ

ex) std::string ํƒ€์ž…์€ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์Œ

STL ์ปจํ…Œ์ด๋„ˆ ํƒ€์ž…์€ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์Œvector, list, set tr1::unordered_map ๋“ฑ

Page 18: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 8. ์†Œ๋ฉธ์ž์—์„œ ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์ง„๋‹ค๋ฉด ๋ง‰์•„๋ผ!

์˜ˆ์™ธ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋‹น์—ฐํžˆ ์—†๊ฒ ์ง€๋งŒ,C++๋Š” ์˜ˆ์™ธ๋ฅผ ๋‚ด๋Š” ์†Œ๋ฉธ์ž๋ฅผ ๋‘๊ณ  ๋ณด์ง€ ์•Š์Œ

์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ•1) ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐ”๋กœ ๋๋‚ธ๋‹ค๋ฐฉ๋ฒ•2) ์˜ˆ์™ธ๋ฅผ ์‚ผ์ผœ ๋ฒ„๋ฆฐ๋‹ค

๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•!-์‚ฌ์šฉ์ž์—๊ฒŒ ๋งก๊ธฐ๊ณ  ์‹คํŒจํ•˜๋ฉด ์‚ผํ‚จ๋‹ค

Page 19: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 8. ์†Œ๋ฉธ์ž์—์„œ ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์ง„๋‹ค๋ฉด ๋ง‰์•„๋ผ!

์‚ฌ์šฉ์ž์— ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด ๋ณด์ด์ง€๋งŒ,์†Œ๋ฉธ์ž์— ์˜ˆ์™ธ๋ฅผ ๋‘์ง€ ์•Š๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ!

Class DBConn {Public:

โ€ฆVoid close(){

db.close();closed = true;

}~DBConn(){

If( !closed )Try {

db.close();}Catch ( โ€ฆ ) {

closeLogging();}

}Private:

DBConnection db;Bool closed;

};

โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ์šฐ์„  close() ํ•จ์ˆ˜ ์‹คํ–‰์œผ๋กœ ์ฒ˜๋ฆฌ

โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ๊ฒฐ์„ ์•ˆ ๋‹ซ์•˜์œผ๋ฉด ์†Œ๋ฉธ์ž์—์„œ ์žฌํ™•์ธ ํ›„ ์‚ญ์ œ

โ€ข ์†Œ๋ฉธ์ž์—์„œ ์ง์ ‘ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ

โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

Page 20: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 9. ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ ๊ณผ์ •์—์„œ ๊ฐ€์ƒํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ธˆ์ง€

์•ž์„œ ์ƒ์„ฑ ์ˆœ์„œ๊ฐ€ ๊ธฐ์–ต ๋‚œ๋‹ค๋ฉด...์ƒ์„ฑ์ž, ์†Œ๋ฉธ์ž์— ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ถ€๋ชจ, ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ/์†Œ๋ฉธ์ด ๋น„์ •์ƒ ์ž‘๋™

๋ถ€๋ชจ ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋Š” ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋ณด๋‹ค ์•ž์„œ์„œ ์‹คํ–‰๋ถ€๋ชจ์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋Š” ์ž์‹ ํด๋ž˜์Šค ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๊ธฐ ์ „์— ์š”์ฒญ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์„ ํ™œ์šฉํ•œ ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ

๋ฌธ์ œ๋Š” ํ˜ธ์ถœ ์ˆœ์„œ!ํ˜ธ์ถœ ์ˆœ์„œ์— ๋”ฐ๋ผ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ

Page 21: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 10. ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” *this๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค

๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” ์ขŒ๋ณ€ ์ธ์ž๋ฅผ *this๋กœ ๋ฐ˜ํ™˜ ํ•˜๋„๋ก ํ•จ

ex)

X = y = z = 15;

๋™์น˜

X = (y = (z = 15));

์ผ์ข…์˜ ์ปจ๋ฒค์…˜(๊ด€๋ก€)!โ€œ์ขŒ๋ณ€ ๊ฐ์ฒด์˜ ์ฐธ์กฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋งŒ๋“ค์žโ€

Page 22: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 11. operator=์—์„œ ์ž๊ธฐ ๋Œ€์ž…์„ ๊ผญ ์ฒ˜๋ฆฌํ•˜๋ผ

์ด์ƒํ•œ ์ฝ”๋“œ? ์ •์ƒ ์ฝ”๋“œ!

Class Widget { โ€ฆ };

Widget w;โ€ฆw = w;

์ž๊ธฐ ๋Œ€์ž…์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๊ฐ€์ง„ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ

Widget& Widget::operator=(const Widget& rhs){

Bitmap *pOrig = pb;pb = new Bitmap(*rhs.pb);Delete pOrig;

Return *this;}

์•ˆ์ „์ฝ”๋“œ1)Widget& Widget::operator=(const Widget& rhs){

Widget temp(rhs);

Swap(temp);

Return *this;}

์•ˆ์ „์ฝ”๋“œ2)

Page 23: Effective c++ chapter1 2_dcshin

We are!

ํ•ญ๋ชฉ 12. ๊ฐ์ฒด ๋ณต์‚ฌ๋Š” ํ˜ธ์ ์„ ์‹น ๋’ค์ ธ์„œ ์™„์ „ํžˆ ๋ณต์‚ฌ

๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€ ๋‹จ์ˆœํ•˜์ง€ ์•Š๋‹ค

1) ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋ฅผ ๋ชจ๋‘ ๋ณต์‚ฌํ•˜๊ณ 2) ํด๋ž˜์Šค๊ฐ€ ์ƒ์†ํ•œ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ณต์‚ฌ ํ•จ์ˆ˜๋„ ํ˜ธ์ถœํ•ด์•ผ ํ•จ

PriorityCustomer::PriorityCustomer( const PriorityCustomer& rhs): Customer(rhs),priority(rhs.priority)

{logCall(โ€œPriorityCustomer copy constructorโ€);

}

PriorityCustomer&PriorityCustomer::operator=( const PriorityCustomer& rhs ){

logCall(โ€œPriorityCustomer copy assignment operatorโ€);

Customer::operator = (rhs);Priority = rhs.priority;

Return *this;}

โ€ข ์ฝ”๋“œ ์ค‘๋ณต๋ณด๋‹ค ์ •ํ™•ํ•œ ๋ณต์‚ฌ๊ฐ€ ๋” ์ค‘์š”ํ•˜๋‹คโ€ข ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๋„๋ก ํ•จโ€ข ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ ํด๋ž˜์Šค ๋ถ€๋ถ„์„ ๋Œ€์ž…ํ•จ

Page 24: Effective c++ chapter1 2_dcshin

We are!

Thank you :)2014. 03. 27