U E D R , A S I H C RSS

More EffectiveC++/Basic

1. Basic

1.1. Item 1: Distinguish between pointers and references.

  • Item 1: Pointer์™€ Reference๊ตฌ๋ณ„ํ•ด๋ผ.
    Pointers use the "*" and "->" operators, references use "."

๋А๋‚Œ์ด ์˜ค๋Š” ์˜ˆ์ œ๋“ค[[BR]]
~cpp 
    char *pc = 0;
    char& rc = *pc;
ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ดˆ๊ธ‰์ž๋ฉด ์•Œ์ˆ˜ ์žˆ๋Š” ๋ฐ”๋ณด ์ง“์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฒ”ํ•˜๊ธฐ ์‰ฌ์šด๊ฒŒ ๋ฌธ์ œ๋‹ค.
~cpp 
    string& rs;        // Reference(์ฐธ์กฐ)๊ฐ€ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ ์—๋Ÿฌ

    string s("xyzzy"); // ์ด๊ฑด ๋œ๋‹ค ์‹ ๊ธฐํ•˜๋„ค 
    string& rs = s;
์•„์ง string์จ๋ณธ์  ํ•œ๋ฒˆ๋„ ์—†๋‹ค. ๋ฐ˜์„ฑ..
~cpp 
    void printDouble(const double& rd)
    {
        cout << rd;    // rd์— ๊ด€ํ•œ ํŠน๋ณ„ํ•œ ๊ฒ€์‚ฌ ํ•„์š” ์—†๋‹ค. reference๋‹ˆ๊นŒ.
    }
    ////////////////////////////////////////////////////////////////////
    void printDouble (const double* pd)
    {
        if (pd){
            cout << *pd    // pd๊ฐ€ null์ธ์ง€ ๊ฒ€์‚ฌ ํ•ด์•ผ ํ•œ๋‹ค. pointer๋‹ˆ๊นŒ.
        }
    }
pointer์˜ ์œ ์˜ ์‚ฌํ•ญ์ธ null์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ์•Œ๋ ค์ค€๋‹ค.
~cpp 
    string s1("Nancy");    // ์ด์ œ๋Š” ๋ฌด์Šจ ํ€ด์ฆˆ ๊ฐ™๋‹ค.
    string s2("Clancy");   
    string& rs = s1;
    string* ps = &s1;
    rs = s2;               // s1์˜ ์ธ์ž๊ฐ€ "Clancy" ๋กœ ๋ฐ”๋€๋‹ค๋Š” ์˜๋ฏธ๋‹ค.
    ps = &s2;              // ๊ทธ๋ƒฅ ํฌ์ธํ„ฐ๋งŒ ์„ธํŒ…ํ•˜๋Š” ๊ฑฐ๋‹ค. 
                           // ์ด๊ฑธ๋กœ ps๋Š” s2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  s1์—๋Š” ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค.
์‚ฌ๊ฒฌ: Call by Value ๋ณด๋‹ค Call by Reference์™€ Const์˜ ์กฐํ•ฉ์„ ์„ ํ˜ธํ•˜์ž. ์ €์ž์˜ Effective C++์— ์ „๋ฐ˜์ ์œผ๋กœ ์–ธ๊ธ‰๋˜์–ด ์žˆ๊ณ , ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๋ณด๋‹ˆ ๊ดœ์ฐฎ์€ ํŽธ์ด์—ˆ๋‹ค. ๋‹จ return์—์„œ ๋ง์ฝ์ด ์ƒ๊ธฐ๋Š”๋ฐ, ํ˜„์žฌ ๋‚ด ์ƒ๊ฐ์€ return์— ๋Œ€ํ•ด์„œ ํšŒ์˜์ ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” COM์‹ ํ‘œํ˜„์ธ in, out ์ ‘๋‘์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•„์˜ˆ ์ธ์ž๋ฅผ ๋„˜๊ฒจ์„œ ๊ด€๋ฆฌํ•œ๋‹ค. C++์˜ ๊ฒฝ์šฐ return์— ์˜ํ•ด ๊ฐ์ฒด๋ฅผ Call by Referenceํ•˜๋ฉด {} ๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์…ˆ์ด ๋˜๋Š”๋ฐ ์–ด๋””์„œ ํŒŒ๊ดด๋˜๋Š” ๊ฒƒ์ธ๊ฐ€. ๋‹ค ๊ณต๋ถ€๊ฐ€ ๋ถ€์กฑํ•ด์„œ์•ผ ์ฉ --;
์ง€์—ญํ•จ์ˆ˜ ์•ˆ์—์„œ ์ง€์—ญ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Reference๋กœ ๋ฆฌํ„ดํ•  ๊ฒฝ์šฐ ์ง€์—ญ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ•œ๋˜๋ฉด ์ง€์—ญ ๊ฐ์ฒด๋Š” ์—†์–ด์งˆ ๊ฒƒ์ด๊ณ , ๋ฆฌํ„ด๋˜๋Š” Reference๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ด๋ฆ„์ด ๋  ๊ฒƒ์ด๋ฉฐ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ ์ปดํŒŒ์ผ์€ ๋ ์ง€๋ชจ๋ฅด๋‚˜ ๋‚˜์œ ์ฝ”๋“œ๋ผ๊ณ  ํ•˜๋„ค์š”.-์ฐจ์„ญ-
์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๋„๋ก ๊ธ€์„ ์ ์–ด ๋†จ๊ตฐ์š”. in, out ์ ‘๋‘์–ด๋ฅผ ์ด์šฉํ•ด์„œ reference๋กœ ๋„˜๊ธธ ์ธ์ž๋“ค์—์„œ๋Š” in์— ํ•œํ•˜์—ฌ reference, out์€ pointer๋กœ new, delete๋กœ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฒƒ์„ ์˜๋„ํ•œ ๋ง์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ „์— ํ”„๋กœ์ ํŠธ์— ์ด๋Ÿฐ์‹์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ ์šฉ ์‹œ์ผฐ๋Š”๋ฐ, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค in์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด ์‚ฌ์šฉ ์ฝ”๋”ฉ์ด ํŽธํ•˜๋”๊ตฐ์š”. ๊ทธ๋ฆฌ๊ณ  ๋ง์”€ํ•˜์‹ ๋Œ€๋กœ, MEC++ ์ „๋ฐ˜์— ์ง€์—ญ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•œ Refernece๋ฌธ์ œ์— ๊ด€ํ•œ ์–ธ๊ธ‰์ด ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์˜ ๊ด€๋ฆฌ๊ฐ€ C++์˜ ๊ฐ€์žฅ ํฐ ๋ฒฝ์œผ๋กœ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹๊นŒ ์ƒ๊ฐ์ด ๋ฉ๋‹ˆ๋‹ค. OOP ์ ์ด๋ ค๋ฉด ๋ฐ˜ํ™˜์„ ๊ฐ์ฒด๋กœ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํฌ์ธํ„ฐ๋กœ ๋„˜๊ธฐ๋Š” ๊ฒƒ์€ ์›์น™์ ์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋„˜๊ธด๋‹ค๊ณ  ๋ณผ์ˆ˜ ์—†๊ณ , ํ•ด์ œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, reference๋กœ ๋„˜๊ธฐ๋ฉด ๋ง์”€ํ•˜์‹ ๋ฐ๋กœ, ํ•ด๋‹น scope๊ฐ€ ๋ฒ—์–ด๋‚˜๋ฉด ์–ธ์–ด์ƒ์˜ lifetime์ด ๋๋‚œ ๊ฒƒ์ด๋ฏ€๋กœ ์˜์—ญ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ OS์—์„œ ๋ง‰์„์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋‹จ, inline์— ํ•œํ•˜์—ฌ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. (inline์˜ ์ฝ”๋“œ ๊ต์ฒด๊ฐ€ compiler์— ์˜ํ•˜์—ฌ ๊ฒฐ์ •๋˜๋ฏ€๋กœ ์ด๊ฒƒ๋„ ์—ญ์‹œ ๋ชจํ˜ธํ•ด ์ง‘๋‹ˆ๋‹ค.) ์•„์˜ˆ COM์—์„œ๋Š” OOP์—์„œ ๋ฒ—์–ด ๋‚˜๋”๋ผ๋„, ๋ฒ”์šฉ์ ์œผ๋กœ ์“ฐ์ผ์ˆ˜ ์žˆ๋„๋ก C์ŠคํŽ™์˜ ํ•จ์ˆ˜์™€ ๊ฐ™์ด in, out ์˜ ์ ‘๋‘์–ด์™€ ํ•ด๋‹น ์ ‘๋‘์–ด๋Š” pointer๋กœ ํ•˜๋Š” ๊ทœ์น™์„ ์„ธ์›Œ๋†“์•˜์ง€์š”. ์ด ์„ค๊ณ„๊ฐ€ C#์—์„œ buil-in type์˜ scalarํ˜•์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ๋ฐ˜์˜๋œ ๊ฒƒ์ด ์ธ์ƒ์ ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.(MS๊ฐ€ ์ดˆ๊ธฐ .net์„ธ๋ฏธ๋‚˜์—์„œ ์ด ๋•Œ๋ฌธ์— String ์—ฐ์‚ฐ ์ฐจ์ด๊ฐ€ 10~20๋ฐฐ ์ •๋„ ๋‚œ๋‹ค๊ณ  ๊ด‘๊ณ ํ•˜๊ณ  ๋‹ค๋…”์—ˆ๋Š”๋ฐ, ์ง€๊ธˆ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋‹ค ๋ถ€์งˆ์—†๋Š” ์ด์•ผ๊ธฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.) -์ƒ๋ฏผ

1.2. Item 2 : Prefer C++ style casts.

  • Item 2 : C++ ์Šคํƒ€์ผ์˜ ํ˜•๋ณ€ํ™˜์„ ๊ถŒ์žฅํ•œ๋‹ค.
C style cast ๋ฐฉ๋ฒ•
~cpp 
(type) expression 
C++ style cast
~cpp 
static_cast<type>(expression) 

const_cast<type>(expression)

dynamic_cast<type>(expression)

reinterpret_cast<type>(expression)

  • static_cast<type>(expression)๋Š” ๊ธฐ์กด์˜ C style์—์„œ ์‚ฌ์šฉํ•˜๋Š” (type)expression ์™€ ๋™์ผํ•˜๋‹ค.

๋‹ค๋ฅธ cast ๋ฌธ๋ฒ•์€ const์™€ class๊ฐ€ ๊ณ ๋ ค๋œ C++ style cast์—ฐ์‚ฐ์ž ์ด๋‹ค.

  • const_cast<type>(expression)์˜ˆ์ œ

~cpp 
class Widget{ ...}
class SpecialWidget:public Widget{...}
void update( SpecialWidget *psw);
SpecialWidget sw;
const SpecialWidget& csw = sw;

update(&csw);	// ๋‹น์—ฐํžˆ ์•ˆ๋จ const์ธ์ž์ด๋ฏ€๋กœ ๋ณ€ํ™˜(ํ’€์–ด์ฃผ๋Š” ์ผ) ์‹œ์ผœ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

update(const_cast<SpecialWidget*>(&csw));	// ์˜ณํƒ€์ฟ ๋‚˜ 
update((SpecialWidget*)&csw);        // C style์ธ๋ฐ ์ž˜ ๋Œ์•„๊ฐ„๋‹ค. 
                                     // C++๋Š” C์™€์˜ ํ˜ธํ™˜์„ฑ ๊ณ ๋ ค๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ์œ„์™€ ๊ฐ™์ด
                                     // ๋™์ž‘ ํ•˜์ง€๋งŒ ๋ช…์‹œ์ ์ด์ง€ ๋ชปํ•œ๋ฉด์ด ์ง€์ ๋œ๋‹ค.


Widget *pw = new SpecialWidget;
update(pw);

update(const_cast<SpecialWidget*>(pw));       // error!
                                              // const_cast<type>(expression) ๋Š” 
                                              // ์˜ค์ง ์ƒ์ˆ˜(constness)๋‚˜ ๋ณ€์ˆ˜(volatileness)์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.
                                              // ์ด๋Ÿฐ๋ง ํ•˜๋ฉด ๋‹ค ๊ฐ€๋Šฅํ•œ ๋“ฏ ์‹ถ๊ณ  static_cast ์™€ ์ฐจ์ด๊ฐ€ ์—†๋Š” ๊ฒƒ
                                              // ๊ฐ™์€๋ฐ ์˜†์˜ ์†Œ์Šค ์ฒ˜๋Ÿผ down cast๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. 


์œ„์— ์˜ˆ์ œ ์ด์–ด์„œ ์ƒ๊ฐ

  • dynamic_cast<type>(expression) ์˜ˆ์ œ

~cpp 
Widget *pw
...
update( dynamic_cast<SpecialWidget*>(pw));    // ์˜ณ๋‹ค. 
                                              // const_cast ๊ฐ€ down cast๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ํ•œ ๋Œ€์‹ ์— dynamic_cast ๋Š” ๋ง๊ทธ๋Œ€๋กœ
                                              // ํ•ด๋‹น ๋ถ€๋ชจ ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ์— ์ž์‹ ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋ฅด์ผœ ์žˆ์œผ๋ฉด ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
                                              // ๋ถˆ๊ฐ€๋Šฅ ํ•˜๋ฉด null ์„ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๊ธฐํŠนํ•œ ์—ญํ• ์ด ํ•ต์‹ฌ์ด๋‹ค.

void updateViaRef(SpecialWidget& rsw);
updateViaRef(dynamic_cast<SpecialWidget&>(*pw)); // ์˜ณ๋‹ค.
                                                 // reference์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค? ๊ทธ๋Ÿผ ๋ถˆ๊ฐ€๋Šฅ ํ• ์‹œ์˜ ์ฒ˜๋ฆฌ๋Š”?
                                                 // ์ด๋Ÿด๋•Œ๋Š” ์˜ˆ์™ธ(exception)์„ ๋ฐœ์ƒ์‹œ์ผœ ์ค€๋‹ค.

  • reinterpret_cast<type>(expression) ์€ ์ฐจํ›„ ๋‹ค์‹œ ์ฝ์€๋’ค ์ •๋ฆฌํ•œ๋‹ค.

  • C ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋‹ค์Œ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

~cpp 
#define static_cast(TYPE, TEXPR)           ((TYPE) (EXPR))
#define const_cast(TYPE, TEXPR)            ((TYPE) (EXPR))
#define reinterpret_cast(TYPE, TEXPR)      ((TYPE) (EXPR))
์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ ํ•ด์„œ ๋Œ€๋น„ํ•˜๋Š”๊ฑธ ์ถ”์ฒœํ•œ๋‹ค. (dynamic_cast ๋Š” C์˜ ์ ˆ์ฐจ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋“ฑ์žฅ ๋ถˆ๊ฐ€)

~cpp 
    double result = static_cast(double, firstNumber)/ secondNumber;
    update(const_cast(SpecialWidget*, &sw));
    funcPtrArray[0] = reinterpret_cast(FuncPtr, &doSomething);

1.3. Item 3: Never treat arrays polymorphically

  • Item 3: ์ ˆ๋Œ€๋กœ! ํด๋ž˜์Šค ๊ฐ„์˜ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•œ ๋ฐฐ์—ด ์ทจ๊ธ‰์„ ํ•˜์ง€ ๋ง๋ผ

๋‹ค๋ฅธ๊ฑฐ ํ•„์š” ์—†๋‹ค ์ด ์˜ˆ์ œ ๋ณด๋ฉด ์•„์ฐจ ์‹ถ๋‹ค.
~cpp 
class BST { ... };
class BalancedBST : public BST { ... };
์ด๋Ÿฐ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž
~cpp 
void printBSTArray( ostream& s, const BST array[], int numElements)
{
    for ( int i = 0; i < numElements; ++i ){
        s << array[i]; 
    }
}
๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.
~cpp 
    BST BSTArray[10];
    ...
    printBSTArray(cout, BSTArray, 10);    // ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•œ๋‹ค. ์•„๋ฌด ๋ฌธ์ œ ์—†๋‹ค.

    //////////////////////////////////////

    BalancedBST bBSTArray[10];
    ...
    printBSTArray(cout, bBSTArray, 10);   // ๊ณผ์—ฐ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€?

์œ„์˜ ๋‘๋ฒˆ์งธ ํ˜ธ์ถœ์˜ ํด๋ž˜์Šค ์ƒ์†์˜ ๋‹คํ˜•์  ์„ฑ์งˆ์„ ์ด์šฉํ•œ ํ•จ์ˆ˜ ์ด์šฉ ์ฆ‰
~cpp 
   printBSTArray( cout, bBSTArray, 10 );
์€ ์ •๋ง ์ตœ์•…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ถˆ๋Ÿฌ ๋“ค์ธ๋‹ค.

C++์—์„œ์˜ ๋ฐฐ์—ด์€ arrayi ์˜ ์˜๋ฏธ๋Š” *(array+i) ์ธ๋ฐ ์ด๊ฒƒ์˜ ์ฃผ์†Œ ์ถ”์ ์„ ์œ„ํ•ด์„œ ์—„๋ฐ€ํžˆ ๋”ฐ์ง€๋ฉด

*(array+ ( i *sizeof(an object in the array) )

๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋А๋‚Œ์ด ์˜ค๊ฒ ์ง€! ๋‹น์—ฐํžˆ ์ƒ์†์‹œ child๋Š” parent๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ๊ฐ€ ๋‹ค๋ฐ˜์‚ฌ์ด๊ณ  ๋ฐฐ์—ด์˜ ์œ„์น˜ ์ถ”์ ์ด ์—‰๋ง ์ง„์ฐฝ์ด ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค.

* ๊ฐ์ฒด์˜ ์ผ๊ด€์ ์ธ ์‚ญ์ œ์— ๊ด€ํ•ด์„œ๋„ ์•Œ์•„ ๋ณด๋ฉด
~cpp 
    void deleteArray( ostream& logStream, BST array[])
    {
        logStream << "Deleting array at address " 
                  << static_cast<void*>(array) << '\n';
        delete [] array;
    }

    BalanceBST *balTreeArray = new BalancedBST[50];
    ...
    deleteArray(cout, balTreeArray);  // ์ด๊ฒƒ ์—ญ์‹œ ์ œ๋Œ€๋กœ ์ง€์›Œ์ง€๋ฆฌ๊ฐ€ ์—†๋‹ค.
์ž ์œ„์™€ ๊ฐ™์ด ๊ฐ์ฒด์˜ ์ง€์›€์„ ๋‹ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ์„๋•Œ ์—ญ์‹œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
~cpp 
    delete [] array
๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ๊ต์ฒด๋˜๋Š”๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
~cpp 
    for( int i = the number of elements in the array -1; i>0; --i)
    {
        array[i].BST::~BST();
    }
๋ถ€๋ชจ ๊ฐ์ฒด์˜ ํŒŒ๊ดด์ž๋งŒ ๋ถ€๋ฅด๋ฏ€๋กœ ์—ญ์‹œ memory leak ํ˜„์ƒ์„ ์ผ์œผํ‚จ๋‹ค.

1.4. Item 4: Avoid gratuitous default constructors.

  • Item 4: ์•”์‹œ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ”ผํ•˜๋ผ. ํ˜น์€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์˜ ๋ชจํ˜ธ์„ฑ์„ ํŒŒ์•…ํ•˜๋ผ.

C++์—์„œ class templete๋ฅผ ๋งŒ๋“œ๋Š” ์ค‘ ์ƒ์„ฑ์ž๋ฅผ ๋นผ๋จน์œผ๋ฉด compiler์—์„œ ๊ธฐ๋ณธ์ ์ธ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด ์ƒ์„ฑํ•ด ์ค€๋‹ค. ์—ญ์‹œ, ๋‹น์—ฐํžˆ ์ดˆ๊ธฐํ™”์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ์•ฝ๊ฐ„ ์ž์„ธํ•œ ๋ถ€๋ถ„์„ ์–ธ๊ธ‰ํ•œ๋‹ค.

์˜ˆ์ œ์—์„œ ์‹œ์ž‘ํ•˜์ž
~cpp 
    class EquipmentPiece {
        public:
            EquipmentPiece(int IDNumber);
            ...
    }

ํ•ด๋‹น EquipmentPiece ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ๋ถ€์‹ค(?) ํ•˜๋‹ค. ์ด๊ฑด ํฌ๊ฒŒ 3๊ฐ€์ง€์˜ ์ฃผ์ œ๋กœ ์„ค๋ช…ํ• ์ˆ˜ ์žˆ๋‹ค.

  • ์ฒซ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ์ƒ์„ฑ ํ• ๋•Œ์ด๋‹ค. . ( The first is the creation of arrays )


~cpp 
    EquipmentPiece bestPieces[10];  
    EquipmentPiece bestPieces = new EquipmentPiece[10]; 
// ๋‘๊ฒฝ์šฐ ์ดˆ๊ธฐํ™” ํ•ด์ค„ ๋ฐฉ๋„๊ฐ€ ์—†์–ด์„œ ์—๋Ÿฌ์ด๋‹ค.
์ด๊ฑธ ์ด๋ ‡๊ฒŒ ํ’€์–ด ๋ณด์ž
~cpp 
    int ID1, ID2, ID3, ... ID10;
    ...
    EquipmentPiece bestPiece[] = {
    EquipmentPiece(ID1),
    EquipmentPiece(ID2),
    EquipmentPiece(ID3),
    ...,
    EquipmentPiece(ID10),
}
ํ•˜์ง€๋งŒ ์ด๋Ÿด ๊ฒฝ์šฐ์—๋Š” array๋ฅผ heap arrays(heap์˜์—ญ ์‚ฌ์šฉ array๋ผ๋Š” ์˜๋ฏธ๋กœ ๋ฐ›์•„๋“ค์ž„)๋กœ์˜ ํ™•์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ณ ์ •๋œ ๋ฐฉ๋ฒ•์ด๋‹ค.

์กฐ๊ธˆ ๋” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด pointer๋ฅผ ์ด์šฉํ•œ ์ ‘๊ทผ์„ ์ œ์‹œํ•œ๋‹ค.
~cpp 
    typedef EquipmentPiece* PEP;
    PEP bestPieces[10];
    PEP *bestPieces = new PEP[10];

    for ( int i = 0; i< 10; ++i)
        bestPiece[1] = new EquipmentPiece( ID Number );
ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ํ•œ๋ˆˆ์— ๋ด๋„ ๋ฌธ์ œ๊ฐ€ ์˜ˆ์ƒ๋œ๋‹ค. ๋ฐ”๋กœ delete๋ฌธ์ œ

๋‘๊ฐ€์ง€๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ด์•ผ๊ธฐ ํ•ด๋ณด๋ฉด, ์ฒซ๋ฒˆ์งธ๋กœ for ๋ฌธ์‹œ์—์„œ ํ• ๋‹น๋˜๋Š” ๊ฐ์ฒด์˜ ์ˆซ์ž๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์žƒ์–ด๋ฒ„๋ฆฌ๋ฉด ์ฐจํ›„ resouce leak์ด ๋ฐœ์ƒ ํ• ๊ฒƒ์ด๋‹ค. ๋‘๋ฒˆ์งธ๋กœ๋Š” pointer๋ฅผ ์œ„ํ•œ ๊ณต๊ฐ„ ํ• ๋‹น์œผ๋กœ ์‹ค์ œ ํ•„์š”ํ•œ memory ์šฉ๋Ÿ‰๋ณด๋‹ค ๋” ์“ด๋‹ค.


๊ทธ๋Ÿผ ๋” ์›ƒ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์‹œํ•ด ๋ณด์ž. (์ด ์ฑ…์„ ๋ณด๊ณ  ์žˆ๋…ธ๋ผ๋ฉด, ์ด๋ ‡๊ฒŒ๋„ ์“ธ์ˆ˜ ์žˆ๋‹ค๋ž€๊ฑธ ๋ณด์—ฌ์ฃผ๋Š”๊ฑฐ ๊ฐ™๋‹ค.)
~cpp 
    void *rawMemory = operator new[](10*sizeof(EquipmentPiece));
    EquipmentPiece *bestPieces = static_cast<EquipmentPiece*>(rawMemory);
    for ( int i = 0; i< 10; ++i)
        new (bestPieces+1) EquipmentPiece ( ID Number );  // ์ด๊ฑด placement new ๋ผ๊ณ  ํ•˜์—ฌ Item 8 ์—์„œ ์–ธ๊ธ‰ํ•œ๋‹ค. 
                                                          // ์ฒ˜์Œ ๋ณด๊ณ  ๋†€๋ž๋‹ค. ์–ด์„œ ์‚ฌ๊ธฐ์•ผ ํ•˜๋ฉด์„œ --;;
                                                          // ์ด ์ฑ… ์ฃผํŠน๊ธฐ๋‹ค. ๋’ค์— ์„ค๋ช…ํ•˜๋‹ˆ๊นŒ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€ ํ•˜๋Š”๊ฑฐ
                                                          // ์•”ํŠผ ์˜๋ฏธ๋Š” ์ดํ•ด ๊ฐˆ๊ฒƒ์ด๋‹ค.
์ฐธ ๊ฑฐ์ง€ ๊ฐ™์€ ์ง“ ์ž˜ํ•ด ๋†“๋Š”๋‹ค.

์ผ๋‹จ ํ™•๋ณดํ•œ ์˜์—ญ์„ ์ง€์šฐ๊ธฐ๋Š” ์‰ฝ๋‹ค. ์ด๋ ‡๊ฒŒ
~cpp 
    delete [] rawMemory;
์—ญ์‹œ๋‚˜ ์ด๊ฒƒ๋„ delete์— ๊ด€ํ•œ ๋ชจํ˜ธ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ฌธ์ œ์‹œ ๋˜๋Š” ์ ์€ rawMemory์ƒ์— ๋ฐฐ์น˜๋œ EquipmentPiece์˜ destructor ํ˜ธ์ถœ ์œ ๋ฌด์ด๋‹ค. ์˜ˆ์ƒ๋Œ€๋กœ destructor๋ฅผ ๊ฐ•์ œ ํ˜ธ์ถœํ•ด ์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ, ์ด๋Ÿฐ์‹์˜ ์‚ญ์ œ๊ฐ€ ๋œ๋‹ค.
~cpp 
    for ( int i = 9; i>= 0; --i)
        bestPieces[i].~EquipmentPiece();    // ์–ธ์ œ๋‚˜ ๋А๋ผ๋Š” ๊ฑฐ์ง€๋งŒ C++์„ ๋ฐฉ์ข…์„ ๊ฐ€์ ธ๋‹ค ์ค„์ˆ˜ ์žˆ๋‹ค.
    operator delete[](rawMemory);
์ฐธ๊ณ ๋กœ
~cpp 
    delete [] bestPieces; // ์ด๋ ‡๊ฒŒ ์ง€์šฐ๋Š”๊ฑด new operator๊ฐ€ ๊ฑด๋“ค์ง€ ์•Š์•„์„œ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๋‘๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ๋งŽ์€ template class(ํŠนํžˆ STL์—์„œ) ๋“ค์—๊ฒŒ ์•„ํ””์„ ์•ˆ๊ฒจ์ค€๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์€ template class ๋ฅผ ์„ ์–ธํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด,
~cpp 
template<class T>
class Array{
public:
    Array(int size);
    ...
private:
    T *data;
};
template<class T>
Array<T>::Array(int size)
{
    data = new T[size];
    ....
}
์ฒซ๋ฒˆ์งธ์—์„œ ์ œ๊ธฐ๋œ ๋ฌธ์ œ๊ฐ€ ์ด๋ฒˆ์—๋Š” template class ๋‚ด๋ถ€์—์„œ ์ผ์–ด ๋‚˜๊ณ  ์žˆ๋Š” ์…ˆ์ด๋‹ค. ๊ฑฐ์ฐธ ์•”๋‹ดํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ก€ํ•œ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ template class ๊ฐ€ ์ด์ œ๋Š” ์•„์˜ˆ STL๊ฐ™์€ library๋กœ ๊ตฌ์ถ•๋˜์—ˆ๋‹จ ์‚ฌ์‹ค. ์•Œ์•„์„œ ์ž˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋งŒ๋“ค์–ด ์ ์šฉํ•˜์‹œ๋ผ. ๋‹ค๋ฅธ ๋ฐฉ๋„ ์—†๋‹ค.

DeleteMe ์ด ๋ถ€๋ถ„์ด ๋ถ€์‹คํ•˜๋‹ค ์ฐจํ›„ ๋ณด๊ฐ• ํ•„์š”
  • ์„ธ๋ฒˆ์งธ(๋งˆ์ง€๋ง‰) ๋ฌธ์ œ๋Š” virtual base class์™€ ๊ฐ™์ด ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋‚˜ ๋ง์•„์•ผ ํ•˜๋‚˜ ๋ฏธ๋ฌ˜ํ•œ ๋”œ๋ ˆ๋งˆ์˜ ์—ฐ์ถœ์ด๋‹ค.
์ƒ๊ฐํ•ด ๋ณด๋ผ Virtual base class๊ฐ€ ์™œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š”๊ฐ€. ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด ๋†“์œผ๋ฉด ์ƒ์†ํ•˜๋Š” ์ดํ›„ ๋ชจ๋“  ํด๋ž˜์Šค๋“ค์—๊ฒŒ ๋กœ๋“œ๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์…ˆ์ด ๋œ๋‹ค. ๊ทผ์›์ด ํ”๋“ค๋ ค ๋ชจ๋‘๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์‚ฌํƒœ์ด๋‹ค. ๋งŒ์•ฝ? ์ˆ˜๋งŒ๊ฐœ์˜ ๊ฐ์ฒด ์ƒ์„ฑ์ด๋ผ๋ฉด ์ด๊ฑด ๊ต‰์žฅํ•œ ๋ฌธ์ œ๊ฐ€ ๋ ์ˆ˜ ์žˆ๋‹ค.


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:49
Processing time 0.0552 sec