U E D R , A S I H C RSS

More EffectiveC++/Operator

1. Operator

1.1. Item 5: Be wary of user-defined conversion functions.

  • Item 5: ์‚ฌ์šฉ์ž ์ •์˜ ํ˜•๋ณ€ํ™˜(conversion) ํ•จ์ˆ˜์— ์ฃผ์˜ํ•˜๋ผ!

  • C++๋Š” ํƒ€์ž…๊ฐ„์˜ ์•”์‹œ์  type casting์„ ํ—ˆ์šฉํ•œ๋‹ค. ์ด๊ฑด C์˜ ์œ ์‚ฐ์ธ๋ฐ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด char๊ณผ int ์—์„œ short๊ณผ double ๋“ค์ด ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ์—†์ด ๋ฐ”๋€Œ์–ด ์ง„๋‹ค. ๊ทธ๋Ÿฐ๋ฐ C++๋Š” ์ด๊ฒƒ ๋ณด๋‹ค ํ•œ์ˆ˜ ๋”๋– ์„œ type casting์‹œ์— ์ž๋ฃŒ๋ฅผ ์žƒ์–ด ๋ฒ„๋ฆฌ๊ฒŒ ๋˜๋Š” int์—์„œ short๊ณผ dougle์—์„œ char์˜ ๋ณ€ํ™˜๊นŒ์ง€ ํ—ˆ์šฉํ•œ๋‹ค.

์ผ๋‹จ ์ด๋Ÿฐ ๊ธฐ๋ณธ ๋ณ€ํ™˜์— ๋Œ€ํ•ด์„œ ๊ฐœ๋ฐœ์ž๋Š” ์–ด์ฐŒ ๊ด€์—ฌ ํ• ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ, C++์—์„œ class์˜ ํ˜•๋ณ€ํ™˜์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜•๋ณ€ํ™˜์— ๊ด€ํ•˜์—ฌ ๊ด€์—ฌํ• ์ˆ˜ ์žˆ๋‹ค. ๋ณ€ํ™˜์— ๊ด€ํ•˜์—ฌ ๋…ผํ•œ๋‹ค.

  • C++์—์„œ๋Š” ํฌ๊ฒŒ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์˜ ํ•จ์ˆ˜๋กœ ํ˜•๋ณ€ํ™˜์„ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ˆ˜ํ–‰ ์‹œํ‚คํ‚จ๋‹ค:
    single-argument constructors ์™€ implicit type conversion operators ์ด ๊ทธ๊ฒƒ์ด๋‹ค.
  • single-argument constructors ์€ ์ธ์ž๋ฅผ ํ•˜๋‚˜์˜ ์ธ์ž๋งŒ์œผ๋กœ ์„ธํŒ…๋ ์ˆ˜ ์žˆ๋Š” ์ƒ์„ฑ์ž์ด๋‹ค. ์—ฌ๊ธฐ ๋‘๊ฐ€์ง€์˜ ์˜ˆ๋ฅผ ๋ณด์ž

~cpp 
class Name {
public:
    Name( const string& s);
    ...
};
class Rational {
public:
    Rational( int numerator = 0, int denominator = 1);
    ...
};

  • implicit type conversion operator ์€ ํด๋ž˜์Šค๋กœ ํ•˜์—ฌ๊ธˆ ํ•ด๋‹น ํƒ€์ž…์œผ๋กœ return ์„ ์›ํ• ๋•Œ ์•”์‹œ์ ์ธ ๋ณ€ํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ operator์ด๋‹ค. ์•„๋ž˜๋Š” double๋กœ์˜ ํ˜•๋ณ€ํ™˜์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

~cpp 
class Rational{
public:
    ...
    operator double() const;
};

Rational r(1,2);
dougle d = 0.5 * r;
์ฐธ ๊ดœ์ฐฎ์€ ๋ฐฉ๋ฒ•์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ํ˜•๋ณ€ํ™˜๋งˆ์ ธ ์‹œํ‚ค๋Š” ๊ฒƒ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋‹ค์Œ์„ ๋ณด์ž
~cpp 
Rational (1,2);
cout << r;      // should print "1/2"
operator<<๋Š” ์ฒ˜์Œ Raional ์ด๋ผ๋Š” ํ˜•์— ๋Œ€ํ•œ ์ž์‹ ์˜ ๋Œ€์‘์„ ์ฐพ์ง€๋งŒ ์—†๊ณ , ์ด๋ฒˆ์—๋Š” r์„ operator<<๊ฐ€ ์ฒ˜๋ฆฌํ• ์ˆ˜ ์žˆ๋Š” ํ˜•์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋ ค๋Š” ์ž‘์—…์„ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋Š” ์™€์ค‘์— r์€ double๋กœ ์•”์‹œ์  ๋ณ€ํ™˜์ด ์ด๋ฃจ์–ด ์ง€๊ณ  ๊ฒฐ๊ณผ double ํ˜•์œผ๋กœ ์ถœ๋ ฅ์ด ๋œ๋‹ค.

๋ญ ์ด๋Ÿฐ ์•”์‹œ์  ํ˜•๋ณ€ํ™˜์„ ๋ง‰์„๋ ค๋ฉด, ํ˜•์ „ํ™˜ ์‹œํ‚ค๊ณ  ํ•˜๋Š” ์•”์‹œ์  ์‚ฌ์šฉ์„ ํ•˜์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ๋ช…์‹œ์ ์œผ๋กœ ํ•ด ์ค„์ˆ˜ ์žˆ๋‹ค.
~cpp 

class Raional{
public:
    ...
    double asDouble() const;
};

Rational r(1,2);
cout << r;                // error!
cout << r.asDouble();     // double๋กœ์˜ ์ „ํ™˜์˜ ์˜๋„๊ฐ€ ํ™•์‹คํžˆ ์ „ํ•ด ์ง„๋‹ค.

์ด๋Ÿฐ ์˜ˆ๋กœ C++ std library์— ์žˆ๋Š” string์ด char*๋กœ ์•”์‹œ์  ํ˜•๋ณ€ํ™˜์ด ์—†๊ณ  c_str์˜ ๋ช…์‹œ์  ํ˜•๋ณ€ํ™˜ ์‹œํ‚จ๋‹ค.

  • single-argument constructor ๋Š” ๋” ์–ด๋ ค์šด ๋ฌธ์ œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ด๋ฌธ์ œ๋“ค์€ ์•”์‹œ์  ํ˜•๋ณ€ํ™˜ ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•˜๋Š” ์•”์‹œ์  ํ˜•๋ณ€ํ™˜์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๋œ๋‹ค.

~cpp 
template<class T>
class Array{
public:
    Array ( int lowBound, int highBound );
    Array ( int size )

    T& operator[] (int index)
    ...
};

์ฒซ๋ฒˆ์งธ ์ƒ์„ฑ์ž๋Š” ๋ฐฐ์—ด์˜ lowBound~highBound ์‚ฌ์ด๋กœ์˜ ํฌ๊ธฐ ์ œํ•œ์ž์ด๊ณ , ๋‘๋ฒˆ์งธ ์ƒ์„ฑ์ž๋Š” ํ•ด๋‹น ํฌ๊ธฐ๋กœ ๋ฐฐ์—ด ๊ณต๊ฐ„ ์ƒ์„ฑ์ธ๋ฐ, ์ด ๋‘๋ฒˆ์งธ์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ˜•๋ณ€ํ™˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ๋ฌดํ•œํ•œ ์‚ฝ์งˆ์— ์„ธ๊ณ„์— ๋‹น์‹ ์„ ์ดˆ๋Œ€ํ•œ๋‹ค. (์‹ค์ œ๋กœ ์ด๋Ÿฐ ์˜๋ฏธ๋กœ ์จ์žˆ๋‹ค. --์ƒ๋ฏผ)

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋‹ค์Œ์„ ๋ณด์ž
~cpp 
bool operator==( const Array< int >& lhs, const Array<int>& rhs);

Array<int> a(10);
Array<int> b(10);
...
for ( int i = 0; i<10; ++i)
    if( a == b[i] ) {           // ํ—‰์Šค! ์ด๋Ÿฐ "a"๋Š” "a[i]" ์จ์•ผ ํ•  ์ฝ”๋“œ์˜€๋‹ค!. (๊ฐœ๋ฐœ์ž์˜ ์‹ค์ˆ˜ ์˜๋ฏธ, ํ•œ๋ฏธ ์–‘๊ตญ์—์„œ ๊ฐ™์€ ๋ฐœ์Œ์˜ oops! --;;  --์ƒ๋ฏผ)
        a[i]์™€ b[i]๊ฐ€ ๊ฐ™์„๋•Œ ์ด ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.;
    }
    else {
        ์œ„์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ด ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.;
    }
7์ค„ if ( a == bi ) ๋ถ€๋ถ„์˜ ์ฝ”๋“œ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ž์‹ ์˜ ์˜๋„์™€๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ๋ฒ• ์ž˜๋ชป์€ ๋‹น์—ฐํžˆ! ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ๋ ค์ค˜์•ผ ๊ฐœ๋ฐœ์ž์˜ ์‹œ๊ฐ„์„ ์•„๋‚„์ˆ˜ ์žˆ์œผ๋ฆฌ, ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์˜ˆ์ œ๊ฐ€ ๊ผญ ๊ทธ๋ ‡์ง€๋งŒ์€ ์•Š๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ž…์žฅ์—์„œ ๋ณด๋ฉด ์˜ณ์€ ์ฝ”๋“œ๊ฐ€ ๋ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ”๋กœ Array class์—์„œ ์ •์˜ ํ•˜๊ณ  ์žˆ๋Š” single-argument constructor ์— ์˜ํ•˜์—ฌ ์ปดํŒŒ์ผ์‹œ ์ด๋Ÿฐ ์ฝ”๋“œ๋กœ์˜ ๋ณ€ํ™˜์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.

~cpp 
for ( int i = 0; i < 10; ++i)
    if ( a == static_cast< Array<int> >(b[i]) )...
bi ๋Š” intํ˜•์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ์ฆ‰์„์—์„œ ๋งž์ถค ์ƒ์„ฑ์ž๋กœ type casting(ํ˜•๋ณ€ํ™˜)์„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•”์‹œ์ ์œผ๋กœ ํ•ด์ค„์ˆ˜ ์žˆ๋‹ค. ์ด์ œ ์‚ฌํƒœ์˜ ์‹ฌ๊ฐ์„ฑ์„ ์•Œ๊ฒ ๋Š”๊ฐ€?

  • explicit
์ด๋Ÿฐ ์• ๋งคํ•œ ์ƒํ™ฉ์„ ํ”ผํ• ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์€ C++์—์„œ ๋“ฑ์žฅํ•œ ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ์ธ explicit ์˜ ์‚ฌ์šฉ์ด๋‹ค. ์ด ํ‚ค์›Œ๋“œ๊ฐ€ ๋ถ™์€ ์ƒ์„ฑ์ž๋กœ์˜ ํ˜•๋ณ€ํ™˜์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ช…์‹œ์ ์ธ ์„ ์–ธ์ด ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ explicit์˜ ์‚ฌ์šฉ์„ ์•Œ์•„๋ณด๊ณ  ๋ฌธ๋ฒ•์ƒ ์œ ์˜ ์‚ฌํ•ญ๋„ ์•Œ์•„ ๋ณด์ž

~cpp 
template<class T>
class Array{
public:
    ...
    expicit Array ( int size )   
    ...
};

Array<int> a (10); 
Array<int> b (10);       // ๋‘๊ฐœ ๋ชจ๋‘ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค

if ( a == Array<int>(b[p])) ...                  // ์ด ์ฝ”๋“œ ์—ญ์‹œ ์˜ฌ๋ฐ”๋ฅด๋‹ค. 
                                                 // ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด์„์— ์‚ฌ์šฉ์ž์˜ ์˜๋„๊ฐ€ ์•ฝ๊ฐ„ ์˜๋ฌธ์ด ๊ฐ„๋‹ค.
if ( a == static_cast< Array<int> >(b[p])) ...   // ๋งž๋‹ค. ์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋•€ํ˜๋ฆฐ๋‹ค
if ( a == (Array<int>) b[i] )                    // C-style ์˜ ํ˜•๋ณ€ํ™˜์ธ๋ฐ ์—ญ์‹œ๋‚˜ ๋‹ค๋ฅธ์‚ฌ๋žŒ์ด ์—ด๋ฐ›๋Š”๋‹ค.
์ด๋ ‡๊ฒŒ explicit๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…์‹œ์ ์œผ๋กœ๋งŒ ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋˜ ํ•˜๋‚˜ ๋ฌธ๋ฒ•์ƒ ์œ ์˜ ํ•ด์•ผ ํ• ์‚ฌํ•ญ์€
~cpp 
static_cast< Array<int> >(b[p])
์ด ๊ตฌ๋ถ„์—์„œ > > ์ด ๋‘๊ฐœ๋ฅผ ๋ถ™์—ฌ์“ฐ๋ฉด >> operator๋กœ ํ•ด์„ํ•˜๋‹ˆ ์œ ์˜ํ•ด๋ผ

์—ฌ๊ธฐ์— ํ•œ๊ฐ€์ง€ ๋” ์ƒ๊ฐํ•ด ๋ณด์ž.

๋งŒ์•ฝ ๋‹น์‹ ์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์—„์ฒญ ๋‚ก์€ ๊ฑฐ๊ฑฐ๋‚˜ ์ œ์ž‘์ž๊ฐ€ ๊นœ๋นกํ•ด์„œ, ํ˜น์€ explicit๋ฅผ ์ฃฝ์–ด๋„ ๋„ฃ๊ธฐ ์‹ซ๋‹ค๊ณ  ํ• ๋•Œ์—๋Š”?

์—ฌ๊ธฐ์— ๋‚˜์˜จ Array ์˜ˆ์ œ๋ฅผ ํ•œ๋ฒˆ ๊ณ ์ณ์„œ ๋งˆ์น˜ explicit ๋ฅผ ์“ด๊ฒƒ์ฒ˜๋Ÿผ ํ•ด๋ณด์ž
~cpp 
template<class T>
class Array{
public:
    class ArraySize{
    public:
        ArraySize(int numElements):theSize(numElements){}
        int size() const { return theSize; }
    private:
        int theSize;
    }
    Array( int lowBound, int highBound);
    Array( ArraySize size );                      // ์ƒˆ๋กœ์šด ์„ ์–ธ!
    ...
}

์ด๋ ‡๊ฒŒ Array ์•ˆ์ชฝ์— ArraySize ๋ฅผ ์„ ์–ธํ•˜๊ณ  public์œผ๋กœ ๋ถˆ์–ด์„œ ์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•˜๋ฉด
~cpp 
Array<int> a(10);

์ปดํŒŒ์ผ๋Ÿฌ ๋‹จ์—์„œ a์ƒ์„ฑ์ž์ธ Array( ArraySize size) ์—์„œ ArraySize ๋กœ์˜ single-argument constructor๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ
~cpp 
bool operator==( const Array< int >& lhs, const Array<int>& rhs);

Array<int> a(10);
Array<int> b(10);
...
for ( int i = 0; i<10; ++i)
    if( a == b[i] ) 
์ด๋Ÿฐ ๊ฒฝ์šฐ์— operator==์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ธ์ž๋Š” int๊ฐ€ single-argument constructor์— ๊ฑฐ์น ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๋ฅผ ๋ฐท์–ด ๋‚ธ๋‹ค.

*ํ›„๊ธฐ:์ด๋ฒˆ๊ป€ ๋„ˆ๋ฌด ๊ธธ๋‹ค. ๋‹ค๋ฅธ๊ฑฐ์— ๋‘๋ฐฐ์— ํ•ด๋‹นํ•˜๋Š”๊ฑฐ ๊ฐ™์€๋ฐ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๋”ด์ฒญ ํ”ผ์šฐ์ง€ ๋ง๊ณ  ํ•ด์•ผ์ง€ --์ƒ๋ฏผ

1.2. Item 6: Distinguish between prefix and postfix forms of increment and decrement operators.

  • Item 6: prefix์™€ postfix๋กœ์˜ ์ฆ๊ฐ ์—ฐ์‚ฐ์ž ๊ตฌ๋ถ„ํ•˜๋ผ!

์šฐ๋ฆฌ๋Š” ++์™€ --์—ฐ์‚ฐ์ž(์ดํ•˜ ๊ฐ€์นญ ๊ฐ€๊ฐ ์—ฐ์‚ฐ์ž)๋ฅผ ์ฆ๊ฒจ ์“ด๋‹ค. ์ด ์—ฐ์‚ฐ์ž ์—ญ์‹œ ํด๋ž˜์Šค์—์„œ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด ๊ฐ€๊ฐ ์—ฐ์‚ฐ์ž๋Š” ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ƒ๊ฐํ•˜๋ฉด ๊ฐ‘์ž๊ธฐ ๋‚œ๊ฐํ•ด ์ง„๋‹ค. ์„ค๋งˆ ์„ค๊ณ„์ž๊ฐ€ ๊ทธ๋Ÿฐ ๋‹จ!์ˆœ!ํ•œ! ๋ฌธ์ œ๋ฅผ ๊ฐ„๊ณผํ• ๋ฆฌ ์—†๋‹ค.

~cpp 
class UPInt{  //๋ฌดํ•œ ์ •์ˆ˜ํ˜•
public:
    UPInt& opertrator++(int);         // prefix++
    const UPInt operator++(int);      // postfix++

    UPInt& opertrator--(int);         // prefix--
    const UPInt operator--(int);      // postfix--

    UPInt& operator+=(int);           // a += operator ๋Š” UPInt์™€ ints ์ถ”๊ฐ€ ์œ„ํ•ด
...
};
UPInt i;

++i;        // i.operator++();
i++;        // i.operator++(0);

--i;        // i.operator--();
i--;        // i.operator--(0);

๋ณด๊ณ  ์žˆ์ž๋ฉด ์ •๋ง ์•„์ด๋””์–ด ๊ดœ์ฐฎ์€๋“ฏ ๊ทธ๋Ÿผ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„๋ถ€์— ๊ด€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ๋…ผํ•œ๋‹ค.
~cpp 
// prefix ์ฆ๊ฐ€ ์—ฐ์‚ฐ์ž ๋ถ€๋ถ„๊ณผ fetch
UPInt& UPInt::operator++()
{
    *this += 1;       // ์ฆ๊ฐ€
    return *this      // fetch!
}

// postfix ์ฆ๊ฐ€ ์—ฐ์‚ฐ์ž ๋ถ€๋ถ„๊ณผ fetch
const UPInt& UPInt::operator++(int)
{
    UPInt oldValue = *this;             // fetch
    ++(*this);                          // prefix ์ฆ๊ฐ€ ์‹œํ‚จ๋‹ค.
    return oldValue;
}

*์ž‘์„ฑ์ž ์‚ฌ์„ค: ์•„ ๋‚˜๋Š” ์ •๋ง ์ด๋Ÿฐ ๋ฆฌํ„ด์ด ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ„๋‹ค. ์ฐธ์กฐ๋กœ ๋„˜๊ฒจ ๋ฒ„๋ฆฌ๋ฉด ๋Œ€์ฒด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์–ด๋А ์‹œ์ ์—์„œ oldValue์˜ ํŒŒ๊ดด๋ฅผ ํ•˜๋ƒ” ๋ง์ด๋‹ค. C++์ด reference counting์œผ๋กœ ์ž์› ๊ด€๋ฆฌ๋ฅผ ๋”ฐ๋กœ ํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ์•„๋‹Œ๋Œ€ ๋ง์ด๋‹ค. 1ํ•™๋…„๋•Œ ๋ถ€ํ„ฐ์˜ ๊ณ ๋ฏผ์ด๋‹จ ๋ง์ด๋‹ค. ์ข€ ๋ช…์พŒํ•œ ์„ค๋ช…์„ ๋ˆ„๊ฐ€ ํ•ด์คฌ์œผ๋ฉด..

์•”ํŠผ ์ € ์œ„์™€ ๊ฐ™์ด ํ•˜๋ฉด ์ดํ•ด๊ฐ€ ๊ฐˆ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿด ๊ฒฝ์šฐ ์š” ์ง“๊ฑฐ๋ฆฌ๋ฅผ ๋ชปํ•œ๋‹ค.

~cpp 
    UPint i;
    i++++;                 
์ด ์˜๋ฏธ๋Š”
~cpp 
    i.operator++(0).operator++(0);
๊ณผ ๊ฐ™๋‹ค. ๋‹น์—ฐํžˆ ์•ˆ๋˜๊ฒ ์ง€?

  • ์ž‘์„ฑ์ž ์‚ฌ์„ค:๋ณธ๋ฌธ์—์„œ๋Š” ๊ทธ ๋’ค๋ถ€ํ„ฐ๋Š” ์•„์˜ˆ ์ด๋Ÿฐ๊ฑธ ์“ฐ์ง€ ๋ง์ž๋Š” ํ•„์š”์„ฑ์˜ ์–ธ๊ธ‰๋‹ˆ๋‹ค. ์ฐจํ›„ ์ถ”๊ฐ€์˜ ํ•„์š”์„ฑ์ด ์žˆ์„๋•Œ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    ๊ทธ๋ƒฅ i++ ๋‘๋ฒˆ ์“ฐ๊ณ  ๋ง์ง€..

1.3. Item 7: Never overload &&, ||, or ,.

  • Item 7: ์ ˆ๋Œ€๋กœ! &&, ||, ',' ์ด ์—ฐ์‚ฐ์ž๋“ค์„ overload ํ•˜์ง€ ๋ง์•„๋ผ


~cpp 
    char *p;
    ...
    if ((p != 0) && (strlen(p) > 10) ) ...
์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” strlen() ํ•จ์ˆ˜๋‚ด๋ถ€์—์„œ p์— ๊ด€๋ จํ•œ null pointer ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ์™œ๋ƒํ•˜๋ฉด && ์—์„œ๋Š” ์•ž์˜ ์กฐ๊ฑด์ด ๋ถ€์ • ์ฆ‰, ( false && anything ) ์˜ ๊ฒฝ์šฐ์—๋Š” ๋’ค์˜ ์กฐ๊ฑด(anything)์€ ์ˆ˜ํ–‰์กฐ์ฐจ ์•ˆํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. operator ||์˜ ๊ฒฝ์šฐ๋„ ํŠน์ • ์กฐ๊ฑด์—์„œ,(true || anything) ๋’ค์— ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์€๋‹ค๋Š” ๊ฒƒ์€ ๋น„์Šทํ•˜๋‹ค.
~cpp 
    int rangeCheck( int index)
    {
        if ((index < lowerBound) || (index > upperBound)) ...
        ...
    }

์ˆ˜๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด๋Ÿฐ ๋‹จ์ˆœํ•œ ์›๋ฆฌ๋ฅผ ํ”„๋กœ๊ทธ๋žจ ์ƒ์—์„œ์˜ ์งง์€ ์ง„ํ–‰(short-circuit)์„ ์ถ”๊ตฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด C++์—์„œ์˜ ๊ฐ์ฒด๋“ค์—๊ฒŒ operator ||, && ๋ฅผ overload ์‹œํ‚ค๋ฉด ์งง์€ ์ง„ํ–‰์„ ์ถ”๊ตฌํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์„๊นŒ? ๊ทธ๋Ÿฐ๋ฐ ํ•˜์ง€ ๋ง๋ผ๋‹ˆ ์™œ์ผ๊นŒ?

์ผ๋‹จ operator &&, ||๋Š” ์ด๋ ‡๊ฒŒ ๋‘๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๋กœ ๋‘˜๋ฆด์ˆ˜ ์žˆ๋‹ค.
~cpp 
    if (expression1 && expression2) ...
์ด ๋ฌธ์žฅ์˜ ํ•ด์„์„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ ‡๊ฒŒ ๋ฐ›์•„ ๋“ค์ธ๋‹ค.
~cpp 
    1. if (expression1.operator&&(expression2))...   // when operator && is member function.
    2. if (operator&&(expression1 , expression2))... // global function

์ž ์ด ๋‘๊ฒฝ์šฐ ๋ชจ๋‘๋ฅผ ์ƒ๊ฐํ•ด ๋ณด๋ฉด 1,2 ์–‘์ชฝ ๋‹ค expression1, expression2 ์˜ ๊ฒฐ๊ณผ ๊ฐ’์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๋‹ค. ์ฆ‰, operator && ๋‚˜ operator || ์˜ ๊ฒฝ์šฐ ์–‘์ชฝ์ด class์ธ์ž๋“ , ์–ด๋–ค ํ˜•ํƒœ์ด๋“  ๋ฐ˜๋“œ์‹œ ๊ฒฐ๊ณผ ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค. ์œ„์—๋„ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ, ์ด๋ฏธ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด &&์™€ ||์˜ ํŠน์„ฑ์„ ์ž˜ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, operator &&, ||์˜ overload๋Š” ๊ตฌ๋™๋˜์ง€ ๋ง์•„์•ผํ•  ์ฝ”๋“œ๊ฐ€ ๊ตฌ๋™๋˜๋Š” ์˜๋„ํ•˜์ง€ ์•Š์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ ์†Œ์ง€๊ฐ€ ์žˆ๋‹ค.

"comma operator" ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. comma operator๊ฐ€ ๋Œ€์ฒด ๋ญ๋ƒ๊ณ ?

comma operator๋Š” ํ‘œํ˜„(form expression)์— ์‚ฌ์šฉ๋œ๋‹ค. ์•„๋ž˜๋ฅผ ๋ณด์ž
~cpp 
void reverse(char s[])
{
    for (int i = 0, j = strlen(s)-1;
        i < j;
        ++i, --j)                   // ์ด๋…€์„๋“ค์ด ๋ฐ”๋กœ comma operator๋“ค์ด๋‹ค. ๊ธฐ๊ฐ€ ๋ง‰ํ˜€..
    {
        int c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}
๊ฒฐ๋ก ์€ overload๋กœ ์–ธ์–ด์ƒ์˜ ์ด๋…€์„๋“ค ์›๋ž˜์˜ ๋Šฅ๋ ฅ ๋ฐœํœ˜ํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค. ์ด๋Ÿฐ ์œ„ํ—˜์€ ๊ฐ์ˆ˜ํ•  ํ•„์š” ์—†์ง€ ์•Š์€๊ฐ€? ์ฐธ๊ณ ๋กœ ๋‹ค์Œ์„ ์•Œ์ž

overloadํ• ์ˆ˜ ์—†๋Š” operator
~cpp 
    .                .*                ::                ?:
    new              delete            sizeof            typeid
    static_cast      dynamic_cast      const_cast        reinterpret_cast
overlod ํ• ์ˆ˜ ์žˆ๋Š” operator
~cpp 
    operator new     operator delete
    operator new[]   operator delete[]
    +    -    *    /    %    ^    &    |    ~
    !    =    >    <    +=   -=   *=   /=   &=
    ^=   &=   |=   <<   >>   >>=  <<=  ==   !=
    <=   >=   &&   ||   ++   --   ,    ->*  ->
    ()   []

1.4. Item 8: Understand the differend meanings of new and delete

  • Item 8: new์™€ delete๊ฐ€ ์“ฐ์ž„์— ๋”ฐ๋ฅธ ์˜๋ฏธ๋“ค์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๋ผ.

๋ณดํ†ต C++์—์„œ ์šฉ์–ด๋“ค์„ ์ •ํ™•ํžˆ ์ดํ•ด ๋ชปํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ newoperator์™€ operator new๊ฐ€ ๊ทธ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๊ฐ€ ๋ ์ˆ˜์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž
~cpp 
    string *ps = new string("Memory Management");

์ด ์ฝ”๋“œ๋Š” new operator๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๋‹ค. new operator๋Š” sizeof ์ฒ˜๋Ÿผ ์–ธ์–ด ์ƒ์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ์ด์ƒ ๊ทธ ์˜๋ฏธ์˜ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๊ฑด ๋‘๊ฐ€์ง€์˜ ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ์ฒซ์งธ๋กœ ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐˆ ๋งŒํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋‘˜์งธ๋กœ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž๋ฅผ ๋ถˆ๋Ÿฌ์ฃผ๋Š” ์—ญํ• ์ด๋‹ค. new operator๋Š” ํ•ญ์ƒ ์ด ๋‘๊ฐ€์ง€์˜ ์˜๋ฏธ๋ผ ์ž‘๋™ํ•˜๋ฉฐ ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ๋“ฏ ๋ณ€๊ฒฝ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ณดํ†ต operator new๋Š” ์ด๋ ‡๊ฒŒ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค.
~cpp 
    void * operator new(size_t size);
์ด๊ฑด ๊ณผ๊ฑฐ C์—์„œ์˜ malloc์ฒ˜๋Ÿผ ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ size๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์„œ ๊ทธ๊ฑธ ๊ฐ€๋ฆฌํ‚ค๋Š” voidํ˜•์˜ pointer๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ธกํ• ์ˆ˜ ์žˆ๊ฒ ๋‹ค.(๋งž๋‹ค) ๊ฐœ๋ฐœ์ž๋Š” operator new๋ฅผ overloadํ• ์ˆ˜ ์žˆ์ง€๋งŒ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ํ•ญ์ƒ size_t๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

์•„๋งˆ ์—ฌ๋Ÿฌ๋ถ„์€ operator new๋ฅผ ์ง์ ‘ ๋ถ€๋ฅด๋Š”๊ฑธ ๊ฒฐ์ฝ” ์›ํ•˜์ง€ ์•Š๊ฒ ์ง€๋งŒ(์ƒ์„ฑ์ž, ํŒŒ๊ดด์ž๋ฅผ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋ง์ด์ง€), ์จ๋จน์„์ˆ˜ ์žˆ๋Š”๋ฐ ํ•œ๋ฒˆ ํ•ด๋ณด์ž.
~cpp 
    void *rawMemory = operator new(sizeof(string));

string ๊ฐ์ฒด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋งŒํผ์ด ํ• ๋‹น๋œ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์˜ ์˜๋ฏธ์ฒ˜๋Ÿผ malloc, operator new๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋Š” ์•–๋Š”๋‹ค. ์ƒ์„ฑ์ž์˜ ํ˜ธ์ถœ์€ new operator ๋ชซ์ด๋‹ค.

new operator๋ฅผ ๋ณด๋ฉด
~cpp 
    string *ps = new string("Memory Management");
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋‹จ์—์„œ ์ด๋ ‡๊ฒŒ ๊ต์ฒด๋œ๋‹ค๊ณ  ๋ณผ์ˆ˜ ์žˆ๋‹ค.
~cpp 
    void *memory = operator new(sizeof(string));

    call string::string("Memory Management") on *memory;

    string *ps = static_cast<string*>(memory);

ํ•ด๋‹น ์ฝ”๋“œ ๋‘๋ฒˆ์งธ ๋ถ€๋ถ„์˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์„ ๋ˆˆ์—ฌ๊ฒจ ๋ด๋ผ.

  • Placement new
๋‹น์‹ ์€ ์ƒ์„ฑ์ž๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ธฐ๋ฅผ ์›ํ• ๋•Œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ƒ์„ฑ์ž๋Š” ๊ฐ์ฒด(object)๋ฅผ ์ดˆ๊ธฐํ™” ์‹œํ‚ค๊ณ , ๊ฐ์ œ(object)๋Š” ์˜ค์ง ์ฒ˜์Œ ์ฃผ์–ด์ง€๋Š” ๋‹จ ํ•œ๋ฒˆ์˜ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด ์งˆ์ˆ˜์žˆ๊ธฐ ๋•Œ๋ฌธ์— (์˜ˆ-const ์ธ์ˆ˜๋“ค ์ดˆ๊ธฐํ™”์— ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ) ์ƒ์„ฑ์ž๋ฅผ ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด์— ํ˜ธ์ถœํ•œ๋‹ค๋Š”๊ฑด ์ƒ๊ฐ์˜ ์—ฌ์ง€๊ฐ€ ์—†์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„์ด raw memory๋กœ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•œ๋‹ค๋ฉด ์ดˆ๊ธฐํ™” ๋ฃจํ‹ด์ด ํ•„์š”ํ•˜๋‹ค.

(์—ฌ๋‹ด-ํ›„ํ›„ ๋‚˜๋„ ์ƒ๋‹จ์˜ operator new๋ฅผ ๋ณด๋Š” ์ˆœ๊ฐ„ ์ด ์ƒ๊ฐํ–ˆ๋‹ค.)

๋ฐ”๋กœ operator new์˜ ํŠนํ™” ๋ฒ„์ „์ธ placement new๋กœ ํ• ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€ placement new๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์ด๋‹ค.
~cpp 
    cass Widget {
        public:
            Widget(int widgetSize);
            ...
    };
    Widget* constructWidgetInBuffer(void * buffer, int widgetSize)
    {
        return new(buffer) Widget(widgetSize);
    }

ํ•ด๋‹น ํ•จ์ˆ˜(construcWidgetInBuffer())๋Š” ๋ฒ„ํผ์— ๋งŒ๋“ค์–ด์ง„ Widget ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ๊ฐ์ฒด๋ฅผ ์ž„์˜ ์œ„์น˜์— ํ• ๋‹นํ• ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ ๋•Œ๋ฌธ์— shared memory๋‚˜ memory-mapped I/O ๊ตฌํ˜„์— ์šฉ์ดํ•˜๋‹ค constructorWidget์— ๋ณด์ด๋Š”๊ฑด ๋ฐ”๋กœ
~cpp 
    return new (buffer) Widget(widgetSize);
์ด ๋ฌธ์ธ๋ฐ , ์•„๋งˆ ์ฒ˜์Œ ๋ณด๊ธฐ์— ์ƒ์†Œํ•  ๊ฒƒ์ด๋‹ค. ์ž์„ธํžˆ ๋œฏ์–ด ๋ณด๋ฉด, (buffer)์— ์˜ํ•ด์„œ ์•”์‹œ์ ์œผ๋กœ new๋Š” operator new๋กœ ํ˜ธ์ถœ๋˜์–ด ์ง„๋‹ค. ๋ง๋ถ™์—ฌ, ์•„๋ž˜์˜ void*๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ์œ„์น˜๋ฅผ size_t๋Š” ๋ฉ”๋ชจ๋ฆฌ์ƒ ๊ฐ์ฒด๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ์˜์—ญ์ด๋‹ค. ์ž, ์œ„์™€ ๋น„๊ตํ•ด ๋ณด๋ผ ์ด operator๋Š” new๋ฅผ overloadํ•œ ๋ฒ„์ „์ด๋‹ค.
~cpp 
    void* operator new(size_t, void *location)
    {
        return location;
    }

์ด๊ฑฐ ๊ฐ„๋‹จํžˆ ๋ณด์ด์ง€๋งŒ placement new์˜ ์ „๋ถ€์ด๋‹ค. operator new์˜ ์—ญํ• ์€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐพ๊ณ (ํ• ๋‹น), ํ•ด๋‹น ํฌ์ธํ„ฐ์˜ ๋ฐ˜ํ™˜์ด๊ณ  placement new์˜ ๊ฒฝ์šฐ์—๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ์ด๋ฏธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™•๋ณดํ•˜์˜€๊ณ , ๋‹จ์ˆœํžˆ ํฌ์ธํ„ฐ ๋ฐ˜ํ™˜๋งŒ ํ•ด์ค€๋‹ค. ๋ชจ๋“  placement new๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ด๋Ÿฐ pointer์˜ ์ „๋‹ฌ ์—ญํ• ์„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  size_t ์ธ์ž๊ฐ€ ์•„๋ฌด๋Ÿฐ ์ด๋ฆ„์ด ์—†์–ด๋„ ๋ฐ˜ํ•ญ ์•ˆํ•œ๋‹ค. ์ž์„ธํ•œ๊ฑด Item 6์„ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๊ฐˆ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฐ placement new๋Š” C++ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•œ ๋ถ€๋ถ„์œผ๋กœ placement new๋ฅผ ์“ฐ๊ณ ์ž ํ•œ๋‹ค๋ฉด #include<new> ๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  • new ๊ฒฐ๋ก !
์ž์ž new ๊ฒฐ๋ก ์ด๋‹ค.

the new operator : heap ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด์™€ ์ƒ์„ฑ์ž ํ˜ธ์ถœ ๋™์‹œ์—

operator new : ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด๋งŒ

placement new : ์ด๋ฏธ ํ™•๋ณด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๊ณ  ๊ฐ์ฒด ์ดˆ๊ธฐํ™”๋ฅผ ์›ํ•œ๋‹ค๋ฉด

์ด๋‹ค ์–ด์„คํ”„๊ฒŒ ์ •๋ฆฌํ–ˆ๊ณ  ์ฐจํ›„ ์ถ”๊ฐ€ ํ• ๊ฒƒ์ด๋‹ค.

  • Deletion and Memory Deallocation
๋™์  ํ• ๋‹น์— ๋Œ€ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์ƒˆ๋Š”๊ฑธ ๋ฐฉ์ง€ํ• ๋ ค๋ฉด ํ•ด๋‹น ๋™์  ํ• ๋‹น์— ์ƒ์‘ํ•˜๋Š” ์‘์ง•(?)์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด์„œ new๋‚˜ operator new์—๋Š” ์ด๋Ÿฐ๊ฑฐ
~cpp 
    string *ps;
    ...
    delete ps;      // delete operator ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
๋‹น์‹ ์ด ์“ฐ๊ณ  ์žˆ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ์ฒด ps point๋ฅผ ํŒŒ๊ดดํ•˜๊ณ  ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ(deallocaion)์€ operator deleteํ•จ์ˆ˜์— ํ–‰ํ•ด์ง€๋Š”๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค.
~cpp 
    void operator delete(void * memoryToBeDeallocated);
๊ทธ๋Ÿฌ๋ฏ€๋กœ
~cpp 
    delete ps;
๋Š” ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
~cpp 
    ps->~string();
    operator delete(ps);
(์ž‘์„ฑ์ž ์ฃผ: ์ด๊ฑธ๋กœ new์™€ delete์˜ ํ™˜์ƒ,์‹ ๋น„์„ฑ์ด ๊นจ์กŒ๋‹ค. )

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์˜ ์˜๋ฏธ๋Š” ๋‹น์‹ ์ด ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ raw๋กœ์˜ ์‚ฌ์šฉ์˜ ๊ฒฝ์šฐ์—๋Š” new์™€ delete operator๋กœ ๊ทธ๋ƒฅ ๋„˜๊ฒจ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค. ์ฆ‰ ์ด์ฝ”๋“œ ๋Œ€์‹ ์— ๋‹ค์Œ์˜ ์˜ˆ๋ฅผ ๋ณผ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
~cpp 
    void * buffer = operator new(50*iszeof(char));
    ...
    operator delete(buffer);
์œ„์˜ ์ฝ”๋“œ๋Š” C++์ƒ์—์„œ malloc ๊ณผ free ๋ฅผ ํ˜ธ์ถœ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์ด๋ฒˆ์— ๋‹น์‹ ์€ placement new๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด delete๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ์—†์„ ๊บผ๋ผ๋Š” ์˜ˆ์ธก์„ ํ• ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ž ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋ช…์‹œ์ ์ธ delete๋ฅผ ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋“ค์„ ๋ณด์ž
~cpp 
    void * mallocShared(size_t size);
    void freeShared(void *memory);

    void *shareMemory = mallocShared(sizeof(Widget));
    Widget *pw = constructWidgetInBuffer(shareMemory, 10);  // placement new์ด๋‹ท!

    ...
    delete pw;  // ์ด๋ ‡๊ฒŒ ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. sharedMemory๋Š” mallocShared์—์„œ ํ• ๋‹น๋˜๋Š”๋ฐ ์–ด์ฐŒ ํ• ์ˆ˜ ์žˆ์œผ๋ฆฌ์š”.
                // ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ํ•ด์•ผ ํ•œ๋‹ค.

    pw->~Widget();  // ๋จผ์ € ์ž„์˜๋กœ ํŒŒ๊ดด์ž๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด pw๊ณผ ๊ด€๋ จ๋œ ์ž์›์„ ๋ฐ˜ํ™˜ํ• ๊ฒƒ์ด๊ณ .
    freeShared(pw); // ์ตœ์ข…์ ์œผ๋กœ pw๊ฐ€ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ํ•ด์ œ ์‹œํ‚จ๋‹ค.

  • Arrays
๋ณ„๋‹ค๋ฅธ ํŠน๋ณ„ํ•œ ์ง€์ ์‚ฌํ•ญ์ด ์—†๋‹ค. ์—ฌํƒœ ๊นŒ์ง€์˜ ์—ฐ์žฅ์„ ์ด๊ณ  ๋‹จ new๋ฅผ ์ด์šฉํ•œ ๋ฐฐ์—ด ํ• ๋‹น์„ ์‚ญ์ œํ•  ๊ฒฝ์šฐ
~cpp 
    string *ps = new string[10];
    delete [] ps;
์™€ ๊ฐ™์ด ์ง์„ ๋งž์ถ”์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. placement๋Š” ๋‹น๊ทผ ์œ„์˜ ์ง€์‹œ ์‚ฌํ•ญ์— ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด๊ณ  operator delete๋Š” item 6์—์„œ์™€ ๊ฐ™์ด for๋ฌธ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ์ง€์›Œ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์—ฌ๊ธฐ์„œ ๋ณด๋‹ค ์‹œํ”ผ new์™€ delete๋ฅผ ๋งŒ๋“œ๋Š” ์ž์ฒด๋Š” ๋‹น์‹ ์ด ์กฐ์ • ํ• ์ˆ˜ ์—†๋Š” ์˜์—ญ์— ์กด์žฌํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์€ ๋‹น์‹ ์˜ ์†์•„๋ž˜ ์žˆ๋‹ค. new์™€ delete๋ฅผ ์ตœ์ ํ™”๋‚˜ ์ˆ˜์ • ํ• ๋•Œ ๊ผญ ๊ธฐ์–ตํ•ด๋ผ ๋‹น์‹ ์ด ์ •๋ง๋กœ ๊ทธ๊ฑธ ํ• ์ˆ˜ ์—†๋Š”๊ฐ€์— ๊ด€ํ•ด์„œ ๋ง์ด๋‹ค. ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์˜ ๋ฐฉ๋ฒ•(new,delete๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฐฉ๋ฒ•)์€ ๋ณ€๊ฒฝํ• ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์€ ์–ธ์–ด์— ์˜ํ•ด์„œ ๊ทœ์ •๋˜์–ด ์ ธ ์žˆ๋Š” ์˜์—ญ์ด๋‹ค.


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