We are!
Digging Effective C++
Chapter 1
Chapter 2
NEXT 1๊ธฐ
131039 ์‹ ๋™์ฐฌ
We are!
ํ•ญ๋ชฉ 1. United State of C++!
C++๋Š” ๋” ์ด์ƒ ๋‹จ์ˆœ C with Classes๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ์–ธ์–ด๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…
์“ฐ๋Š” ์˜์—ญ์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋„ ๋‹ค๋ณ€ํ™”
C++
๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋…์˜ C++
ํ…œํ”Œ๋ฆฟ C++ STL
โ€ข์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›
โ€ข๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›
โ€ข๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›
โ€ข๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋… ์ถ”๊ฐ€
โ€ขํด๋ž˜์Šค, ์บก์Аํ™”, ์ƒ์†์œผ๋กœ ๊ตฌํ˜„
โ€ข๋‹คํ˜•์„ฑ, ๊ฐ€์ƒ ํ•จ์ˆ˜๋กœ ๊ตฌ์ฒดํ™”
โ€ขํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ
โ€ข์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ
โ€ข์šฉ๋„์— ๋งž์ถฐ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ ์‚ฌ์šฉ
โ€ข์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
โ€ข์ปจํ…Œ์ด๋„ˆ, ๋ฐ˜๋ณต์ž, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ
C
โ€ข๊ธฐ๋ณธ์ œ๊ณต ๋ฐ์ดํ„ฐํƒ€์ž…
โ€ข์ „์ฒ˜๋ฆฌ๊ธฐ, ๋ฐฐ์—ด, ํฌ์ธํ„ฐ ๋“ฑ
โ€ข๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์˜ ์›์ฒœ
We are!
ํ•ญ๋ชฉ 2. ๋‚ญ๋น„๋ฒฝ์„ ๊ฐ€์ง„ #define
์ „์ฒ˜๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” #define์„ ๋ฒ„๋ฆฌ๊ณ  ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ž
์ด์œ 1) ์ฝ”๋“œ ์ „์ฒด ์˜์—ญ์—์„œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” #define์€ ๋‚ญ๋น„
์ด์œ 2) #define์—๋Š” ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ์—†๋‹ค
์ด์œ 3) #define ๋งคํฌ๋กœ๋ฅผ ์ž˜๋ชป ์จ ๊ทธ๋งŒ...
ํ•ด๊ฒฐ๋ถ€ํ„ฐ ๋ณด๊ณ  ๊ฐ€์‹ค๊ป˜์š”
๋ฐฉ์•ˆ1) ์ƒ์ˆ˜ ํƒ€์ž…(const)์™€ ์นœํ•ด์งˆ ๊ฒƒ
๋ฐฉ์•ˆ2) ํด๋ž˜์Šค์—์„œ๋Š” ์ •์  ๋ฉค๋ฒ„๋กœ ๋งŒ๋“ค ๊ฒƒ
๋ฐฉ์•ˆ3) inline ํ•จ์ˆ˜๋ฅผ ์“ธ ๊ฒƒ
We are!
ํ•ญ๋ชฉ 2. ๋‚ญ๋น„๋ฒฝ์„ ๊ฐ€์ง„ #define
#define MAX_BUFF 1024 const int MAX_BUFF = 1024;
โ€ข ์ปดํŒŒ์ผ ์—๋Ÿฌ์‹œ ํ™•์ธ์ด ์–ด๋ ค์›€
์ปดํŒŒ์ผ์—์„œ๋Š” ์ด๋ฏธ ์ˆซ์ž ์ƒ์ˆ˜๋กœ ๋Œ€์ฒด
โ€ข ์ฝ”๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ์กด์žฌ
ํ•ด๋‹น ๋‹จ์–ด๋ฅผ ๊ธฐ๊ณ„์ ์œผ๋กœ ๋Œ€์น˜ ํ•จ
โ€ข ์œ ํšจ๋ฒ”์œ„ ๊ฐœ๋…์ด ์—†์Œ
โ€ข ์บก์Аํ™” ๋ถˆ๊ฐ€
โ€ข ์ปดํŒŒ์ผ๋Ÿฌ ํ™•์ธ ๋ฐ ๊ธฐํ˜ธ ํ…Œ์ด๋ธ” ์ž…๋ ฅ
โ€ข ์ƒ์ˆ˜ ํƒ€์ž…์€ ์—ฌ๋Ÿฌ ๋ฒˆ ์“ฐ์ด๋”๋ผ๋„ ์‚ฌ๋ณธ์€
ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ
โ€ข ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ •์ (static) ๋ฉค๋ฒ„๋กœ
๋งŒ๋“ค์–ด ํด๋ž˜์Šค ์˜์—ญ์—์„œ๋งŒ ์‚ฌ์šฉ
โ€ข ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋Š” ์บก์Аํ™” ๋จ
We are!
ํ•ญ๋ชฉ 2. ๋‚ญ๋น„๋ฒฝ์„ ๊ฐ€์ง„ #define
ํด๋ž˜์Šค ๋‚ด๋ถ€ ์ƒ์ˆ˜ ์ƒ์„ฑ ๋ฐ ํ™œ์šฉ ๋ฐฉ๋ฒ•
//in header file
class CostEstimate {
private:
Static const double FudgeFactor;
โ€ฆ
}
// in implement file
const double CostEstimate::FudgeFactor = 1.35;
๋ฐฉ๋ฒ•1)
//in header file
class CostEstimate {
private:
Static const double FudgeFactor = 1.35;
โ€ฆ
}
// in implement file
const double CostEstimate::FudgeFactor;
๋ฐฉ๋ฒ•2) ๋ฐฉ๋ฒ•3)
//in header file
class CostEstimate {
private:
Enum { NumTurns = 5 };
Int scores[NumTurns];
โ€ฆ
}
โ€ข ์ •์  ์ƒ์ˆ˜ ์ƒ์„ฑ ํ›„ ๊ตฌํ˜„ ๋ถ€์—์„œ ์ •์˜ โ€ข ๊ตฌ์‹ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ์˜ ์„ ์–ธ๊ณผ ์ •์˜ โ€ข ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ƒ์ˆ˜๊ฐ€ ๋จผ์ € ํ•„์š”ํ•œ ๊ฒฝ์šฐ
โ€ข Enum hack ๊ธฐ๋ฒ•์œผ๋กœ ์ƒ์ˆ˜ ํ™•๋ณด
โ€ข Enum hack ํŠน์ง•
โ€– ๋™์ž‘ ๋ฐฉ์‹์ด ์ง๊ด€์ (#define ์œ ์‚ฌ)
โ€– ์“ธ๋ฐ ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์—†์Œ
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์— ๋Œ€ํ•ด ํฌ๊ธฐ ๋น„๊ต ํ•จ์ˆ˜
โ€ข ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํƒ€์ž… ์•ˆ์ •์„ฑ๊นŒ์ง€ ํ™•๋ณด
We are!
ํ•ญ๋ชฉ 3. ๋ผ๋ฉด์Šคํ”„ ๊ฐ™์€ const
Const๋Š” ๊ทธ ์–ด๋–ค ์™ธ๋ถ€ ๋ณ€๊ฒฝ๋„ ๋ง‰์•„๋ƒ„(๋ณ€๊ฒฝ ๋ถˆ๊ฐ€)
์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ์•ฝ์„ ํ™•์ธํ•˜๊ณ  ์ง€์ผœ ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
์šฉ๋„1) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ์ƒ์˜ ์—๋Ÿฌ๋ฅผ ๋Œ€์‹  ํ™•์ธ
์šฉ๋„2) ์–ด๋А ๊ณณ์—์„œ๋“  ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Œ
์šฉ๋„3) ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ์‚ฌ์šฉํ•ด ์•ˆ์ „์„ฑ,ํšจ์œจ์„ ํ™•๋ณดํ•˜๋ฉฐ ์—๋Ÿฌ ๊ฐ์†Œ
ex) ์ž˜๋ชป๋œ ๋Œ€์ž… ์—ฐ์‚ฐ ๋“ฑ
์šฉ๋„4) ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ข‹๊ฒŒ ํ•จ
์šฉ๋„5) ์‹คํ–‰ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๊ธฐ์—ฌ(reference-to-const)
์ฃผ์˜ ์‚ฌํ•ญ
์ฃผ์˜1) ๋น„ํŠธ์ˆ˜์ค€ ์ƒ์ˆ˜์„ฑ์€ ๋ชจ๋“ ๊ฑธ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ
์ฃผ์˜2) ์ƒ์ˆ˜ ๋ฉค๋ฒ„, ๋น„์ƒ์ˆ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๊ฐ™์€ ๊ฒฝ์šฐ
๋น„์ƒ์ˆ˜ ๋ฒ„์ „์ด ์ƒ์ˆ˜ ๋ฒ„์ „์„ ํ˜ธ์ถœํ•˜๋„๋ก ํ•จ
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 ๊ฐ€๋Šฅ
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์„ ์‚ฌ์šฉํ•ด ์ฒ˜๋ฆฌ
-> ๋น„๋ก ์ƒ์ˆ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—์„œ๋„ ์ˆ˜์ • ๊ฐ€๋Šฅ
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] );
}
โ€ข ์ค‘๋ณต์„ ์ œ๊ฑฐ
โ€ข ์ž…๋ ฅ ์ž๋ฃŒํ˜•๊ณผ ์ถœ๋ ฅ ์ž๋ฃŒํ˜•์„ ๊ฐ•์ œ ํ˜•๋ณ€ํ™˜์œผ๋กœ ์ผ์น˜
We are!
ํ•ญ๋ชฉ 4. ์ƒˆ์ œํ’ˆ์€ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ณ  ์“ฐ์ž
์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์ฝ๋„๋ก ๋‚ด๋ฒ„๋ ค ๋‘๋ฉด
์“ฐ๋ ˆ๊ธฐ ๊ฐ’์„ ์ฝ๊ณ  ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘(์˜ค๋ฅ˜) ๋ฐœ์ƒ
๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ ์ดˆ๊ธฐํ™”!
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 )
{
}
โ€ข ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•ด ์ดˆ๊ธฐํ™”
โ€ข ๊ทธ์— ์•ž์„œ ๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ธฐํ™” ํ›„ ํ•จ์ˆ˜์—์„œ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ
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;
}
We are!
ํ•ญ๋ชฉ 5. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ๋งŒ๋“œ๋Š” ์ˆจ๊ฒจ์ง„ ํ•จ์ˆ˜
๋น„์–ด ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋”๋ผ๋„ ์ด๋ฏธ ์ˆจ๊ฒจ์ ธ ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค
class Empty {
public:
Empty() { ... }
Empty(const Empty& rhs) { ... }
~Empty() { ... }
Empty& operator=( const Empty& rhs) { ... }
};
โ€ข ๊ธฐ๋ณธ ์ƒ์„ฑ์ž
โ€ข ๋ณต์‚ฌ ์ƒ์„ฑ์ž
โ€ข ์†Œ๋ฉธ์ž
โ€ข ๋ณต์‚ฌ ๋Œ€์ž… ์—ฐ์‚ฐ์ž
์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ๋งŒ๋“ค์ง€๋งŒ...
์‚ฌ์šฉ์ž๊ฐ€ ์šฐ์„  ์„ ์–ธํ•˜๋ฉด ๋งŒ๋“ค์ง€ ์•Š์Œ
๋™์ž‘์˜ ์ตœ์ข… ์ฝ”๋“œ๊ฐ€ ์ ๋ฒ•ํ•˜๊ณ  ์ด์น˜์— ๋‹ฟ์•„์•ผ ์ž๋™ ์ƒ์„ฑ
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:
โ€ฆ
}
We are!
ํ•ญ๋ชฉ 7. ๋‹คํ˜•์„ฑ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ํ•„์š”ํ•ด
๋™์  ๋ฐ”์ธ๋”ฉ์‹œ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์œผ๋ฉด ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ฉ”๋ชจ๋ฆฌ leak์ด ๋ฐœ์ƒ
๊ธฐ๋ณธ ํด๋ž˜์Šค ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์ž์‹ ํด๋ž˜์Šค ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ ๋  ๋•Œ,
๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์œผ๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค๋งŒ ์‚ญ์ œ
โ€ข ์ƒ์„ฑ์‹œ ์ˆœ์„œ
1. ๋ถ€๋ชจ ํด๋ž˜์Šค
2. ์ž์‹ ํด๋ž˜์Šค
โ€ข ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ ์‹œ
1. ๋ถ€๋ชจ ํด๋ž˜์Šค
2. ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ์ƒ์‹ค
โ€ข ๊ฐ€์ƒ ์†Œ๋ฉธ์ž ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ
1. ์ž์‹ ํด๋ž˜์Šค
2. ๋ถ€๋ชจ ํด๋ž˜์Šค
Class TimeKeeper {
Public:
TimeKeeper();
Virtual ~TimeKeeper();
};
TimeKeeper *ptk = getTimeKeeper();
โ€ฆ
Delete ptk;
We are!
ํ•ญ๋ชฉ 7. ๋‹คํ˜•์„ฑ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ํ•„์š”ํ•ด
๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๋˜๋ฉด ์ ˆ.๋Œ€. ์•ˆ ๋จ
ex) std::string ํƒ€์ž…์€ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์Œ
STL ์ปจํ…Œ์ด๋„ˆ ํƒ€์ž…์€ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์Œ
vector, list, set tr1::unordered_map ๋“ฑ
We are!
ํ•ญ๋ชฉ 8. ์†Œ๋ฉธ์ž์—์„œ ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์ง„๋‹ค๋ฉด ๋ง‰์•„๋ผ!
์˜ˆ์™ธ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋‹น์—ฐํžˆ ์—†๊ฒ ์ง€๋งŒ,
C++๋Š” ์˜ˆ์™ธ๋ฅผ ๋‚ด๋Š” ์†Œ๋ฉธ์ž๋ฅผ ๋‘๊ณ  ๋ณด์ง€ ์•Š์Œ
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
๋ฐฉ๋ฒ•1) ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐ”๋กœ ๋๋‚ธ๋‹ค
๋ฐฉ๋ฒ•2) ์˜ˆ์™ธ๋ฅผ ์‚ผ์ผœ ๋ฒ„๋ฆฐ๋‹ค
๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•!
-์‚ฌ์šฉ์ž์—๊ฒŒ ๋งก๊ธฐ๊ณ  ์‹คํŒจํ•˜๋ฉด ์‚ผํ‚จ๋‹ค
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() ํ•จ์ˆ˜ ์‹คํ–‰์œผ๋กœ ์ฒ˜๋ฆฌ
โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ๊ฒฐ์„ ์•ˆ ๋‹ซ์•˜์œผ๋ฉด ์†Œ๋ฉธ์ž์—์„œ ์žฌํ™•์ธ ํ›„ ์‚ญ์ œ
โ€ข ์†Œ๋ฉธ์ž์—์„œ ์ง์ ‘ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ
โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
We are!
ํ•ญ๋ชฉ 9. ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ ๊ณผ์ •์—์„œ ๊ฐ€์ƒํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ธˆ์ง€
์•ž์„œ ์ƒ์„ฑ ์ˆœ์„œ๊ฐ€ ๊ธฐ์–ต ๋‚œ๋‹ค๋ฉด...
์ƒ์„ฑ์ž, ์†Œ๋ฉธ์ž์— ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ถ€๋ชจ, ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ/์†Œ๋ฉธ์ด ๋น„์ •์ƒ ์ž‘๋™
๋ถ€๋ชจ ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋Š” ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋ณด๋‹ค ์•ž์„œ์„œ ์‹คํ–‰
๋ถ€๋ชจ์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋Š” ์ž์‹ ํด๋ž˜์Šค ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๊ธฐ ์ „์— ์š”์ฒญ
์“ฐ๋ ˆ๊ธฐ ๊ฐ’์„ ํ™œ์šฉํ•œ ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ
๋ฌธ์ œ๋Š” ํ˜ธ์ถœ ์ˆœ์„œ!
ํ˜ธ์ถœ ์ˆœ์„œ์— ๋”ฐ๋ผ
์ „ํ˜€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ
We are!
ํ•ญ๋ชฉ 10. ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” *this๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค
๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” ์ขŒ๋ณ€ ์ธ์ž๋ฅผ *this๋กœ ๋ฐ˜ํ™˜ ํ•˜๋„๋ก ํ•จ
ex)
X = y = z = 15;
๋™์น˜
X = (y = (z = 15));
์ผ์ข…์˜ ์ปจ๋ฒค์…˜(๊ด€๋ก€)!
โ€œ์ขŒ๋ณ€ ๊ฐ์ฒด์˜ ์ฐธ์กฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋งŒ๋“ค์žโ€
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)
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;
}
โ€ข ์ฝ”๋“œ ์ค‘๋ณต๋ณด๋‹ค ์ •ํ™•ํ•œ ๋ณต์‚ฌ๊ฐ€ ๋” ์ค‘์š”ํ•˜๋‹ค
โ€ข ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๋„๋ก ํ•จ
โ€ข ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ ํด๋ž˜์Šค ๋ถ€๋ถ„์„ ๋Œ€์ž…ํ•จ
We are!
Thank you :)
2014. 03. 27

Effective c++ chapter1 2_dcshin

  • 1.
    We are! Digging EffectiveC++ Chapter 1 Chapter 2 NEXT 1๊ธฐ 131039 ์‹ ๋™์ฐฌ
  • 2.
    We are! ํ•ญ๋ชฉ 1.United State of C++! C++๋Š” ๋” ์ด์ƒ ๋‹จ์ˆœ C with Classes๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ์–ธ์–ด๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐœ๋… ์“ฐ๋Š” ์˜์—ญ์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋„ ๋‹ค๋ณ€ํ™” C++ ๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋…์˜ C++ ํ…œํ”Œ๋ฆฟ C++ STL โ€ข์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์› โ€ข๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์› โ€ข๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์› โ€ข๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋… ์ถ”๊ฐ€ โ€ขํด๋ž˜์Šค, ์บก์Аํ™”, ์ƒ์†์œผ๋กœ ๊ตฌํ˜„ โ€ข๋‹คํ˜•์„ฑ, ๊ฐ€์ƒ ํ•จ์ˆ˜๋กœ ๊ตฌ์ฒดํ™” โ€ขํ…œํ”Œ๋ฆฟ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ โ€ข์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ โ€ข์šฉ๋„์— ๋งž์ถฐ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ ์‚ฌ์šฉ โ€ข์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ โ€ข์ปจํ…Œ์ด๋„ˆ, ๋ฐ˜๋ณต์ž, ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ C โ€ข๊ธฐ๋ณธ์ œ๊ณต ๋ฐ์ดํ„ฐํƒ€์ž… โ€ข์ „์ฒ˜๋ฆฌ๊ธฐ, ๋ฐฐ์—ด, ํฌ์ธํ„ฐ ๋“ฑ โ€ข๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์˜ ์›์ฒœ
  • 3.
    We are! ํ•ญ๋ชฉ 2.๋‚ญ๋น„๋ฒฝ์„ ๊ฐ€์ง„ #define ์ „์ฒ˜๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” #define์„ ๋ฒ„๋ฆฌ๊ณ  ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ž ์ด์œ 1) ์ฝ”๋“œ ์ „์ฒด ์˜์—ญ์—์„œ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” #define์€ ๋‚ญ๋น„ ์ด์œ 2) #define์—๋Š” ์œ ํšจ ๋ฒ”์œ„๊ฐ€ ์—†๋‹ค ์ด์œ 3) #define ๋งคํฌ๋กœ๋ฅผ ์ž˜๋ชป ์จ ๊ทธ๋งŒ... ํ•ด๊ฒฐ๋ถ€ํ„ฐ ๋ณด๊ณ  ๊ฐ€์‹ค๊ป˜์š” ๋ฐฉ์•ˆ1) ์ƒ์ˆ˜ ํƒ€์ž…(const)์™€ ์นœํ•ด์งˆ ๊ฒƒ ๋ฐฉ์•ˆ2) ํด๋ž˜์Šค์—์„œ๋Š” ์ •์  ๋ฉค๋ฒ„๋กœ ๋งŒ๋“ค ๊ฒƒ ๋ฐฉ์•ˆ3) inline ํ•จ์ˆ˜๋ฅผ ์“ธ ๊ฒƒ
  • 4.
    We are! ํ•ญ๋ชฉ 2.๋‚ญ๋น„๋ฒฝ์„ ๊ฐ€์ง„ #define #define MAX_BUFF 1024 const int MAX_BUFF = 1024; โ€ข ์ปดํŒŒ์ผ ์—๋Ÿฌ์‹œ ํ™•์ธ์ด ์–ด๋ ค์›€ ์ปดํŒŒ์ผ์—์„œ๋Š” ์ด๋ฏธ ์ˆซ์ž ์ƒ์ˆ˜๋กœ ๋Œ€์ฒด โ€ข ์ฝ”๋“œ์˜ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ์กด์žฌ ํ•ด๋‹น ๋‹จ์–ด๋ฅผ ๊ธฐ๊ณ„์ ์œผ๋กœ ๋Œ€์น˜ ํ•จ โ€ข ์œ ํšจ๋ฒ”์œ„ ๊ฐœ๋…์ด ์—†์Œ โ€ข ์บก์Аํ™” ๋ถˆ๊ฐ€ โ€ข ์ปดํŒŒ์ผ๋Ÿฌ ํ™•์ธ ๋ฐ ๊ธฐํ˜ธ ํ…Œ์ด๋ธ” ์ž…๋ ฅ โ€ข ์ƒ์ˆ˜ ํƒ€์ž…์€ ์—ฌ๋Ÿฌ ๋ฒˆ ์“ฐ์ด๋”๋ผ๋„ ์‚ฌ๋ณธ์€ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ โ€ข ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ์ •์ (static) ๋ฉค๋ฒ„๋กœ ๋งŒ๋“ค์–ด ํด๋ž˜์Šค ์˜์—ญ์—์„œ๋งŒ ์‚ฌ์šฉ โ€ข ํด๋ž˜์Šค์˜ ์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋Š” ์บก์Аํ™” ๋จ
  • 5.
    We are! ํ•ญ๋ชฉ 2.๋‚ญ๋น„๋ฒฝ์„ ๊ฐ€์ง„ #define ํด๋ž˜์Šค ๋‚ด๋ถ€ ์ƒ์ˆ˜ ์ƒ์„ฑ ๋ฐ ํ™œ์šฉ ๋ฐฉ๋ฒ• //in header file class CostEstimate { private: Static const double FudgeFactor; โ€ฆ } // in implement file const double CostEstimate::FudgeFactor = 1.35; ๋ฐฉ๋ฒ•1) //in header file class CostEstimate { private: Static const double FudgeFactor = 1.35; โ€ฆ } // in implement file const double CostEstimate::FudgeFactor; ๋ฐฉ๋ฒ•2) ๋ฐฉ๋ฒ•3) //in header file class CostEstimate { private: Enum { NumTurns = 5 }; Int scores[NumTurns]; โ€ฆ } โ€ข ์ •์  ์ƒ์ˆ˜ ์ƒ์„ฑ ํ›„ ๊ตฌํ˜„ ๋ถ€์—์„œ ์ •์˜ โ€ข ๊ตฌ์‹ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ์˜ ์„ ์–ธ๊ณผ ์ •์˜ โ€ข ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ ์ƒ์ˆ˜๊ฐ€ ๋จผ์ € ํ•„์š”ํ•œ ๊ฒฝ์šฐ โ€ข Enum hack ๊ธฐ๋ฒ•์œผ๋กœ ์ƒ์ˆ˜ ํ™•๋ณด โ€ข Enum hack ํŠน์ง• โ€– ๋™์ž‘ ๋ฐฉ์‹์ด ์ง๊ด€์ (#define ์œ ์‚ฌ) โ€– ์“ธ๋ฐ ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์—†์Œ
  • 6.
    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์— ๋Œ€ํ•ด ํฌ๊ธฐ ๋น„๊ต ํ•จ์ˆ˜ โ€ข ๋™์ž‘ ๋ฐฉ์‹๊ณผ ํƒ€์ž… ์•ˆ์ •์„ฑ๊นŒ์ง€ ํ™•๋ณด
  • 7.
    We are! ํ•ญ๋ชฉ 3.๋ผ๋ฉด์Šคํ”„ ๊ฐ™์€ const Const๋Š” ๊ทธ ์–ด๋–ค ์™ธ๋ถ€ ๋ณ€๊ฒฝ๋„ ๋ง‰์•„๋ƒ„(๋ณ€๊ฒฝ ๋ถˆ๊ฐ€) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ œ์•ฝ์„ ํ™•์ธํ•˜๊ณ  ์ง€์ผœ ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ ์šฉ๋„1) ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ์ƒ์˜ ์—๋Ÿฌ๋ฅผ ๋Œ€์‹  ํ™•์ธ ์šฉ๋„2) ์–ด๋А ๊ณณ์—์„œ๋“  ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Œ ์šฉ๋„3) ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’์— ์‚ฌ์šฉํ•ด ์•ˆ์ „์„ฑ,ํšจ์œจ์„ ํ™•๋ณดํ•˜๋ฉฐ ์—๋Ÿฌ ๊ฐ์†Œ ex) ์ž˜๋ชป๋œ ๋Œ€์ž… ์—ฐ์‚ฐ ๋“ฑ ์šฉ๋„4) ํด๋ž˜์Šค์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ข‹๊ฒŒ ํ•จ ์šฉ๋„5) ์‹คํ–‰ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๊ธฐ์—ฌ(reference-to-const) ์ฃผ์˜ ์‚ฌํ•ญ ์ฃผ์˜1) ๋น„ํŠธ์ˆ˜์ค€ ์ƒ์ˆ˜์„ฑ์€ ๋ชจ๋“ ๊ฑธ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ ์ฃผ์˜2) ์ƒ์ˆ˜ ๋ฉค๋ฒ„, ๋น„์ƒ์ˆ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๊ฐ™์€ ๊ฒฝ์šฐ ๋น„์ƒ์ˆ˜ ๋ฒ„์ „์ด ์ƒ์ˆ˜ ๋ฒ„์ „์„ ํ˜ธ์ถœํ•˜๋„๋ก ํ•จ
  • 8.
    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 ๊ฐ€๋Šฅ
  • 9.
    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์„ ์‚ฌ์šฉํ•ด ์ฒ˜๋ฆฌ -> ๋น„๋ก ์ƒ์ˆ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์—์„œ๋„ ์ˆ˜์ • ๊ฐ€๋Šฅ
  • 10.
    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] ); } โ€ข ์ค‘๋ณต์„ ์ œ๊ฑฐ โ€ข ์ž…๋ ฅ ์ž๋ฃŒํ˜•๊ณผ ์ถœ๋ ฅ ์ž๋ฃŒํ˜•์„ ๊ฐ•์ œ ํ˜•๋ณ€ํ™˜์œผ๋กœ ์ผ์น˜
  • 11.
    We are! ํ•ญ๋ชฉ 4.์ƒˆ์ œํ’ˆ์€ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ณ  ์“ฐ์ž ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ ๊ฐ’์„ ์ฝ๋„๋ก ๋‚ด๋ฒ„๋ ค ๋‘๋ฉด ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์„ ์ฝ๊ณ  ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘(์˜ค๋ฅ˜) ๋ฐœ์ƒ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ ์ดˆ๊ธฐํ™”!
  • 12.
    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 ) { } โ€ข ๋ฉค๋ฒ„ ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•ด ์ดˆ๊ธฐํ™” โ€ข ๊ทธ์— ์•ž์„œ ๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ธฐํ™” ํ›„ ํ•จ์ˆ˜์—์„œ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ
  • 13.
    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; }
  • 14.
    We are! ํ•ญ๋ชฉ 5.์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ๋งŒ๋“œ๋Š” ์ˆจ๊ฒจ์ง„ ํ•จ์ˆ˜ ๋น„์–ด ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋”๋ผ๋„ ์ด๋ฏธ ์ˆจ๊ฒจ์ ธ ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค class Empty { public: Empty() { ... } Empty(const Empty& rhs) { ... } ~Empty() { ... } Empty& operator=( const Empty& rhs) { ... } }; โ€ข ๊ธฐ๋ณธ ์ƒ์„ฑ์ž โ€ข ๋ณต์‚ฌ ์ƒ์„ฑ์ž โ€ข ์†Œ๋ฉธ์ž โ€ข ๋ณต์‚ฌ ๋Œ€์ž… ์—ฐ์‚ฐ์ž ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ๋งŒ๋“ค์ง€๋งŒ... ์‚ฌ์šฉ์ž๊ฐ€ ์šฐ์„  ์„ ์–ธํ•˜๋ฉด ๋งŒ๋“ค์ง€ ์•Š์Œ ๋™์ž‘์˜ ์ตœ์ข… ์ฝ”๋“œ๊ฐ€ ์ ๋ฒ•ํ•˜๊ณ  ์ด์น˜์— ๋‹ฟ์•„์•ผ ์ž๋™ ์ƒ์„ฑ
  • 15.
    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: โ€ฆ }
  • 16.
    We are! ํ•ญ๋ชฉ 7.๋‹คํ˜•์„ฑ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ํ•„์š”ํ•ด ๋™์  ๋ฐ”์ธ๋”ฉ์‹œ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์œผ๋ฉด ์ž์‹ ํด๋ž˜์Šค์—์„œ ๋ฉ”๋ชจ๋ฆฌ leak์ด ๋ฐœ์ƒ ๊ธฐ๋ณธ ํด๋ž˜์Šค ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์ž์‹ ํด๋ž˜์Šค ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ ๋  ๋•Œ, ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์œผ๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค๋งŒ ์‚ญ์ œ โ€ข ์ƒ์„ฑ์‹œ ์ˆœ์„œ 1. ๋ถ€๋ชจ ํด๋ž˜์Šค 2. ์ž์‹ ํด๋ž˜์Šค โ€ข ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ ์‹œ 1. ๋ถ€๋ชจ ํด๋ž˜์Šค 2. ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ์ƒ์‹ค โ€ข ๊ฐ€์ƒ ์†Œ๋ฉธ์ž ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ 1. ์ž์‹ ํด๋ž˜์Šค 2. ๋ถ€๋ชจ ํด๋ž˜์Šค Class TimeKeeper { Public: TimeKeeper(); Virtual ~TimeKeeper(); }; TimeKeeper *ptk = getTimeKeeper(); โ€ฆ Delete ptk;
  • 17.
    We are! ํ•ญ๋ชฉ 7.๋‹คํ˜•์„ฑ์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ํ•„์š”ํ•ด ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๋˜๋ฉด ์ ˆ.๋Œ€. ์•ˆ ๋จ ex) std::string ํƒ€์ž…์€ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์Œ STL ์ปจํ…Œ์ด๋„ˆ ํƒ€์ž…์€ ๊ฐ€์ƒ ์†Œ๋ฉธ์ž๊ฐ€ ์—†์Œ vector, list, set tr1::unordered_map ๋“ฑ
  • 18.
    We are! ํ•ญ๋ชฉ 8.์†Œ๋ฉธ์ž์—์„œ ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์ง„๋‹ค๋ฉด ๋ง‰์•„๋ผ! ์˜ˆ์™ธ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋‹น์—ฐํžˆ ์—†๊ฒ ์ง€๋งŒ, C++๋Š” ์˜ˆ์™ธ๋ฅผ ๋‚ด๋Š” ์†Œ๋ฉธ์ž๋ฅผ ๋‘๊ณ  ๋ณด์ง€ ์•Š์Œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๋ฐฉ๋ฒ•1) ํ”„๋กœ๊ทธ๋žจ์„ ๋ฐ”๋กœ ๋๋‚ธ๋‹ค ๋ฐฉ๋ฒ•2) ์˜ˆ์™ธ๋ฅผ ์‚ผ์ผœ ๋ฒ„๋ฆฐ๋‹ค ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•! -์‚ฌ์šฉ์ž์—๊ฒŒ ๋งก๊ธฐ๊ณ  ์‹คํŒจํ•˜๋ฉด ์‚ผํ‚จ๋‹ค
  • 19.
    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() ํ•จ์ˆ˜ ์‹คํ–‰์œผ๋กœ ์ฒ˜๋ฆฌ โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ๊ฒฐ์„ ์•ˆ ๋‹ซ์•˜์œผ๋ฉด ์†Œ๋ฉธ์ž์—์„œ ์žฌํ™•์ธ ํ›„ ์‚ญ์ œ โ€ข ์†Œ๋ฉธ์ž์—์„œ ์ง์ ‘ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • 20.
    We are! ํ•ญ๋ชฉ 9.์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ ๊ณผ์ •์—์„œ ๊ฐ€์ƒํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ธˆ์ง€ ์•ž์„œ ์ƒ์„ฑ ์ˆœ์„œ๊ฐ€ ๊ธฐ์–ต ๋‚œ๋‹ค๋ฉด... ์ƒ์„ฑ์ž, ์†Œ๋ฉธ์ž์— ๊ฐ€์ƒ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ถ€๋ชจ, ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ/์†Œ๋ฉธ์ด ๋น„์ •์ƒ ์ž‘๋™ ๋ถ€๋ชจ ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋Š” ์ž์‹ ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋ณด๋‹ค ์•ž์„œ์„œ ์‹คํ–‰ ๋ถ€๋ชจ์˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋Š” ์ž์‹ ํด๋ž˜์Šค ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๊ธฐ ์ „์— ์š”์ฒญ ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์„ ํ™œ์šฉํ•œ ํ•จ์ˆ˜ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ ๋ฌธ์ œ๋Š” ํ˜ธ์ถœ ์ˆœ์„œ! ํ˜ธ์ถœ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ
  • 21.
    We are! ํ•ญ๋ชฉ 10.๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” *this๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋Š” ์ขŒ๋ณ€ ์ธ์ž๋ฅผ *this๋กœ ๋ฐ˜ํ™˜ ํ•˜๋„๋ก ํ•จ ex) X = y = z = 15; ๋™์น˜ X = (y = (z = 15)); ์ผ์ข…์˜ ์ปจ๋ฒค์…˜(๊ด€๋ก€)! โ€œ์ขŒ๋ณ€ ๊ฐ์ฒด์˜ ์ฐธ์กฐ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋งŒ๋“ค์žโ€
  • 22.
    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)
  • 23.
    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; } โ€ข ์ฝ”๋“œ ์ค‘๋ณต๋ณด๋‹ค ์ •ํ™•ํ•œ ๋ณต์‚ฌ๊ฐ€ ๋” ์ค‘์š”ํ•˜๋‹ค โ€ข ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๋„๋ก ํ•จ โ€ข ๋Œ€์ž… ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ ํด๋ž˜์Šค ๋ถ€๋ถ„์„ ๋Œ€์ž…ํ•จ
  • 24.
    We are! Thank you:) 2014. 03. 27