MoinMoin   More Effective C++ UserPreferences
 
Help Info Print View Search Diffs Edit
 À妽º   µµ¿ò¸»   Ã£±â   ´ë¹®   ºí·Î±×   ¹Ù²ï±Û 

Please log in before editing, or are you looking for WikiSandBox, where you don't need to login?

Clear message


  1. More Effective C++ ¿ä¾à
    1. ±âº» °³³äµé
      1. Ç׸ñ 1. Æ÷ÀÎÅÍ(pointer)¿Í ÂüÁ¶ÀÚ(reference)¸¦ ±¸ºÐÇÏÀÚ.
      2. Ç׸ñ 2. °¡´ÉÇÑ C++ ½ºÅ¸ÀÏÀÇ Ä³½ºÆ®¸¦ Áñ°Ü ¾²ÀÚ.
      3. Ç׸ñ 3. ¹è¿­°ú ´ÙÇü¼ºÀº °°Àº ¼öÁØÀ¸·Î ³õ°í º¼ °ÍÀÌ ¾Æ´Ï´Ù.
      4. Ç׸ñ 4. ¾µµ¥ ¾ø´Â ±âº» »ý¼ºÀÚ´Â ±×³É µÎÁö ¸»ÀÚ.
    2. ¿¬»êÀÚ(Operator)
      1. Ç׸ñ 5. »ç¿ëÀÚ Á¤ÀÇ Å¸ÀÔº¯È¯ ÇÔ¼ö¿¡ ´ëÇÑ ÁÖÀǸ¦ ³õÁö ¸»ÀÚ
      2. Ç׸ñ 6. Áõ°¡ ¹× °¨¼Ò ¿¬»êÀÚÀÇ ÀüÀ§(prefix)/ÈÄÀÇ(postfix) ÇüŸ¦ ¹Ýµå½Ã ±¸ºÐÇÏÀÚ.
      3. Ç׸ñ 7. &&, ||, ȤÀº , ¿¬»êÀÚ´Â ¿À¹ö·Îµù ´ë»óÀÌ Àý´ë·Î ¾Æ´Ï´Ù.
      4. Ç׸ñ 8. new¿Í deleteÀÇ Àǹ̸¦ Á¤È®È÷ ±¸ºÐÇϰí ÀÌÇØÇÏÀÚ
    3. ¿¹¿Ü (Exceptions)
      1. Ç׸ñ 9. ¸®¼Ò½º ´©¼ö¸¦ ÇÇÇÏ´Â ¹æ¹ýÀÇ Á¤°ø(ïáÍô)Àº ¼Ò¸êÀÚÀÌ´Ù.
      2. Ç׸ñ 10. »ý¼ºÀÚ¿¡¼­´Â ¸®¼Ò½º ´©¼ö°¡ ÀϾÁö ¾Ê°Ô ÇÏÀÚ.
      3. Ç׸ñ 11. ¼Ò¸êÀÚ¿¡¼­´Â ¿¹¿Ü°¡ Å»ÃâÇÏÁö ¸øÇÏ°Ô ÇÏÀÚ.
      4. Ç׸ñ 12. ¿¹¿Ü ¹ß»ýÀÌ ¸Å°³º¯¼ö Àü´Þ ȤÀº °¡»ó ÇÔ¼ö È£Ãâ°ú ¾î¶»°Ô ´Ù¸¥Áö¸¦ ÀÌÇØÇÏÀÚ.
      5. Ç׸ñ 13. ¹ß»ýÇÑ ¿¹¿Ü´Â ÂüÁ¶ÀÚ·Î ¹Þ¾Æ³»ÀÚ
      6. Ç׸ñ 14. ¿¹¿Ü ÁöÁ¤(exception specification) ±â´ÉÀº ³ÃöÇÏ°Ô »ç¿ëÇÏÀÚ.
      7. Ç׸ñ 15. ¿¹¿Ü 󸮿¡ µå´Â ºñ¿ë¿¡ ´ëÇØ Á¤È®È÷ ÆÄ¾ÇÇÏÀÚ.
    4. È¿À²(Efficiency)
      1. Ç׸ñ 16. »Ä¼Ó±îÁö ÀØÁö ¸»ÀÚ, 80-20 ¹ýÄ¢!
      2. Ç׸ñ 17. È¿À² Çâ»ó¿¡ ÀÖ¾î Áö¿¬ Æò°¡(lazy evaluation)´Â ÃæºÐÈ÷ °í·ÁÇØ º¼ ¸¸ÇÑ´Ù.
      3. Ç׸ñ 18. ¿¹»óµÇ´Â °è»ê °á°ú¸¦ ¹Ì¸® ÁغñÇϸé 󸮺ñ¿ëÀ» ±ðÀ» ¼ö ÀÖ´Ù.
      4. Ç׸ñ 19. Àӽà °´Ã¼ÀÇ ¿ø·ù(ê«×µ)¸¦ Á¤È®È÷ ÀÌÇØÇÏÀÚ.
      5. Ç׸ñ 20. ¹Ýȯ°ª ÃÖÀûÈ­(return value optimization)°¡ °¡´ÉÇÏ°Ô ÇÏÀÚ.
      6. Ç׸ñ 21. ¿À¹ö·ÎµùÀº ºÒÇÊ¿äÇÑ ¾Ï½ÃÀû ŸÀÔº¯È¯À» ¸·´Â ÇÑ ¹æ¹ýÀÌ´Ù.
      7. Ç׸ñ 22. ´Üµ¶ ¿¬»êÀÚ(op) ´ë½Å¿¡ =ÀÌ ºÙÀº ¿¬»êÀÚ(op=)¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁÀ» ¶§°¡ ÀÖ´Ù.
      8. Ç׸ñ 23. Á¤ ¾È µÇ¸é ´Ù¸¥ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏÀÚ!
      9. Ç׸ñ 24. °¡»ó ÇÔ¼ö, ´ÙÁß »ó¼Ó, °¡»ó ±âº» Ŭ·¡½º, RTTI¿¡ µé¾î°¡´Â ºñ¿ëÀ» Á¦´ë·Î ÆÄ¾ÇÇÏÀÚ.
    5. À¯¿ëÇϰí Àç¹ÌÀÖ´Â ÇÁ·Î±×·¡¹Ö ±â¹ýµé(Techniques)
      1. Ç׸ñ 25. »ý¼ºÀÚ ÇÔ¼ö¿Í ºñ(Þª)¸â¹ö ÇÔ¼ö¸¦ °¡»ó ÇÔ¼öó·³ ¸¸µå´Â ¹æ¹ý
      2. Ç׸ñ 26. Ŭ·¡½º ÀνºÅϽºÀÇ °³¼ö¸¦ Àǵµ´ë·Î Á¦ÇÑÇÏ´Â ¹æ¹ý
      3. Ç׸ñ 27. Èü(heap)¿¡¸¸ »ý¼ºµÇ°Å³ª Èü¿¡¸¸ ¸¸µé¾îÁöÁö ¾Ê´Â Ư¼öÇÑ Å¬·¡½º¸¦ ¸¸µå´Â ¹æ¹ý
      4. Ç׸ñ 28. ½º¸¶Æ® Æ÷ÀÎÅÍ(Smart pointer)
      5. Ç׸ñ 29. ÂüÁ¶ Ä«¿îÆÃ(Reference Counting)

More Effective C++ ¿ä¾à

ÀÌ·±Ã¥À» ¿ø¼­·Î º¸¸é ÁÁÀ»µí Çѵ¥..
½Ã°£»óÀÇ ÀÌÀ¯¿Í ±ÍÂ÷-_-´ÏÁòÀÇ ¹ßµ¿À¸·Î...
¹ø¿ªÀÚºÐÀÌ Effective C++°ú ´Þ¶ó¼­ ¾à°£ÀÇ ´À³¦ÀÌ ´Ù¸§.
¹ø¿ªÀº ¹Ý¿ªÀÌ´Ù!!

±âº» °³³äµé

Ç׸ñ 1. Æ÷ÀÎÅÍ(pointer)¿Í ÂüÁ¶ÀÚ(reference)¸¦ ±¸ºÐÇÏÀÚ.

°¡Àå ½±°Ô º¼¼ö ÀÖ´Â Â÷ÀÌÁ¡Àº ¿¬»êÀÚÀÇ Â÷ÀÌ´Ù.
Æ÷ÀÎÅÍÀÇ °æ¿ì *°ú ->À» ¾²°í ÂüÁ¶´Â .À» ¾´´Ù.
°³³ä»óÀÇ Â÷ÀÌÁ¡Àº Æ÷ÀÎÅÍÀÇ °æ¿ì nullÀ» °¡¸£Å³¼ö ÀÖ°í ÂüÁ¶ÀÇ °æ¿ì nullÀ» °¡¸£Å°´Â °ÍÀº ÂüÁ¶¶ó º¼¼ö ¾ø´Ù.
ÀÌ ¶§¹®¿¡ ÂüÁ¶´Â °³³ä»ó nullÀ» °Ë»çÇÒ Çʿ䰡 ¾ø¾î À¯¿ëÇÏ´Ù.
C ¾ð¾î¿¡´Â ÂüÁ¶ÀÇ °³³äÀº »ý·«µÇ¾ú´Âµ¥ C++¿¡ µé¾î¿À¸é¼­ Ŭ·¡½º°¡ »ý±â¸é¼­ ¸íÈ®ÇÑ °³³äÀ¸·Î ÀÚ¸® ÀâÈùµí ÇÏ´Ù.

Ç׸ñ 2. °¡´ÉÇÑ C++ ½ºÅ¸ÀÏÀÇ Ä³½ºÆ®¸¦ Áñ°Ü ¾²ÀÚ.

´Ü¼øÇÑ C ½ºÅ¸ÀÏÀÇ Ä³½ºÆ®ÀÎ °ýÈ£()´Â ³Ê¹«³ªµµ ¹ü¿ëÀûÀÎ Àǹ̸¦ Áö³à¼­ ÇØ¼®»ó ¿À·ù°¡ »ý±â±â ½±´Ù.
´õ¿íÀÌ C++·Î ³Ñ¾î¿À¸é¼­ Ŭ·¡½º¿Í »ó¼ÓÀ¸·Î ÀÎÇØ Àǹ̸¦ ½Äº°Çϱâ Èûµç °æ¿ìµµ »ý±æ¼ö ÀÖ´Ù.

±×·¡¼­ C++¿¡¼­´Â static_cast, const_cast, dynamic_cast, reinterpret_cast ÀÌ ³×°¡Áö ¿¬»êÀÚ°¡ Ãß°¡ µÇ¾ú´Ù.

static_cast´Â C ½ºÅ¸ÀÏÀÇ Ä³½ºÆ®¿Í µ¿ÀÏÇÑ ÀÇ¹Ì¿Í Çüº¯È¯ ´É·ÂÀ» °¡Áö°í ÀÖ´Ù.
longÇüÀ» intÇüÀ¸·Î ¿ì°Ü ³Ö´Â´Ù´øÁö doubleÇüÀ» floatÇüÀ¸·Î ³ÖÀ»¶§ »ç¿ëÇÏ¸é µÈ´Ù.

const_cast´Â »ó¼ö¼ºÀ̳ª Èֹ߼º(volatile)À» Á¦°ÅÇϴµ¥ ¾²ÀδÙ.
const int¸¦ intÇüÀ¸·Î ¹Ù²Ù´Â °æ¿ì³ª volatile int¸¦ intÇüÀ¸·Î ¹Ù²Ù´Â °æ¿ì¿¡ ¾²ÀδÙ.

dynamic_cast´Â »ó¼ÓÀÇ °æ¿ì¿¡¼­ °¡»óÇÔ¼ö°¡ »ç¿ëµÇ´Â °æ¿ì ÆÄ»ý(derived)Ŭ·¡½º³ª ÇüÁ¦(sibling)Ŭ·¡½º·Î º¯È¯ÇÒ¶§ ¾²ÀδÙ.
class Widget { ... };
class SpecialWidget? : public Widget { ... };

...

SpecialWidget? *psw;
Widget pw;

psw = dynamic_cast<SpecialWidget? *>(&pw);

reinterpret_cast´Â static_cast¿¬»êÀÚ°¡ ó¸® ¸øÇÏ´Â ´ëºÎºÐÀ» Çüº¯È¯ ½Ãų¼ö ÀÖ´Ù.
±×·¯³ª ÀÌ ¿¬»êÀÚ´Â ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸£°Ô Á¤ÀǵǹǷΠÀ̽ļº¿¡ ¹®Á¦°¡ ÀÖ´Ù.
structÇüÀ» long *ÇüÀ¸·Î ¹Ù²Ü¼öµµ ÀÖ°í floatÇüÀ» boolÇüÀ¸·Î ¹Ù²Ù´Âµî ÀÚÀ¯ÀÚÀç·Î »ç¿ëÇÑ´Ù.

À§ÀÇ ¿¬»êÀÚµéÀº º¯È¯ÀÌ ºÒ°¡´ÉÇÒ¶§´Â ¿¹¿Ü¸¦ ¹ß»ýÇÑ´Ù.

Ç׸ñ 3. ¹è¿­°ú ´ÙÇü¼ºÀº °°Àº ¼öÁØÀ¸·Î ³õ°í º¼ °ÍÀÌ ¾Æ´Ï´Ù.

¹è¿­Àº ¿¬¼ÓµÈ ¸Þ¸ð¸®»óÀÇ ÁÖ¼Ò¸¦ °¡¸£Å°±â ¶§¹®¿¡ ÁöÁ¤µÈ ¹üÀ§³»¿¡¼­ »ó¼ö½Ã°£À¸·Î Á¢±ÙÀÌ °¡´ÉÇÏ´Ù.
¸¸¾à ¹è¿­ÀÌ Å¬·¡½ºÀ϶§ ¹è¿­»óÀÇ ´ÙÀ½À§Ä¡´Â (¹è¿­½ÃÀÛÀ§Ä¡ + Ŭ·¡½ºÀÇÅ©±â * ´ÙÀ½À妽º)À¸·Î »ý°¢ÇÒ ¼ö ÀÖ´Ù.
±×·¸Áö¸¸ Çüº¯È¯À» ÅëÇØ ÆÄ»ýŬ·¡½º°¡ ¹è¿­ÀÇ °ªÀ¸·Î µé¾î¿Â´Ù¸é ÆÄ»ýŬ·¡½º³»ÀÇ ¸â¹öµéÀÇ Å©±â·Î ÀÎÇØ ´ÙÀ½ À§Ä¡¿¡ ´ëÇÑ Á¢±ÙÀÌ ºÒ°¡´ÉÇØÁø´Ù.

Ç׸ñ 4. ¾µµ¥ ¾ø´Â ±âº» »ý¼ºÀÚ´Â ±×³É µÎÁö ¸»ÀÚ.

±âº» »ý¼ºÀڴ Ŭ·¡½º Á¤Àǽà »ý¼ºÀÚ°¡ »ý·«µÇ¾úÀ» °æ¿ì¿¡ ÀÚµ¿À¸·Î ¸¸µé¾î ÁØ´Ù.
±×·¯³ª ±âº» »ý¼ºÀÚ¿¡´Â ¾àÁ¡ÀÌ ¸¹´Ù. °´Ã¼ÀÇ ¸â¹ö¿¡ ´ëÇÑ ÃʱâÈ­¿¡ ´ëÇÑ º¸ÀåÀÌ ¾ø±â ¶§¹®ÀÌ´Ù.
ÇÏÁö¸¸ ±âº» »ý¼ºÀÚ°¡ ¾øÀ¸¸é ¹è¿­ÀÇ ¼±¾ðÀÌ ¾î·Á¿ö Áø´Ù.
¹°·Ð ÇÇÇØ°¡´Â ¹æ¹ýÀ» ãÀ¸¸é ¾øÁö´Â ¾ÊÀ¸³ª º¹ÀâÇÏ°í ±¸Çö»óÀÇ ¾î·Á¿òÀÌ µû¸¥´Ù.
±×·¸´Ù°í ±âº» »ý¼ºÀÚ¸¦ ¾øÀÌ ¸¸µé°Ô µÇ¸é °¡»ó ±âº» Ŭ·¡½º¸¦ ¸¸µé¶§ ¾î·Á¿òÀÌ µû¸¥´Ù.
ÀÌ´Â ±¸ÇöÇÏ´Â ÂÊ¿¡¼­ ¹Ì¸® ±âº» Ŭ·¡½ºÀÇ ¸â¹ö¸¦ ÃʱâÈ­ ÇØÁà¾ß Çϴµ¥ À̰ÍÀº ¾î¶² »ó¼Ó½ÃŰ´Â Àǹ̸¦ Èñ¼® ½Ã۱⠶§¹®ÀÌ´Ù.

°á·ÐÀº Â÷¶ó¸® ±âº» »ý¼ºÀÚ¸¦ »ý±âµµ·Ï ³ªµÎÁö ¸»°í ±×³É »ý¼ºÀÚ¸¦ ¸¸µé¾î ¾²ÀÚ.

¿¬»êÀÚ(Operator)

Ç׸ñ 5. »ç¿ëÀÚ Á¤ÀÇ Å¸ÀÔº¯È¯ ÇÔ¼ö¿¡ ´ëÇÑ ÁÖÀǸ¦ ³õÁö ¸»ÀÚ

±âº»ÀûÀÎ C¾ð¾î ŸÀÔÀÇ ¾Ï½ÃÀû ŸÀÔ º¯È¯¿¡ ´ëÇØ¼­´Â º¯°æÇÒ¼ö ¾ø´Ù.(hard-coding µÇ¾î ÀÖÀ½)
±×·¯³ª C++ÀÇ È®Àå¿¡ ÀÇÇÑ Å¸ÀÔÀÇ º¯È¯Àº »ç¿ëÀÚ°¡ ¸íÈ®ÇÏ°Ô Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

ÄÄÆÄÀÏ·¯°¡ Á¤ÀÇÇÑ Å¸ÀÔº¯È¯Àº µÎ°¡Áö Á¾·ù°¡ ÀÖ´Ù.
Çϳª´Â ´ÜÀÏ ÀÎÀÚ »ý¼ºÀÚ(single-argument constructor)À̰í
class Name
{
    Name(const string &s); // string ŸÀÔÀ» Name ŸÀÔÀ¸·Î ¹Ù²ß´Ï´Ù.

    ...

};

´Ù¸¥ Çϳª´Â ¾Ï½ÃÀû ŸÀÔº¯È¯ ¿¬»êÀÚ(implicit type conversion)ÀÌ´Ù.
class Rational
{
    public:

      ...

      operator double() const; // Rational ÇüÀ» double ÇüÀ¸·Î ¾Ï½ÃÀûÀ¸·Î ¹Ù²ß´Ï´Ù.

};
ÀÌ ¹æ¹ýÀº ºÐ¸í ÆíÇÒ¼öµµ ÀÖÀ¸³ª ¸¸¾àÀÇ °æ¿ì ¸ðÈ£ÇÏ°Ô ³Ñ¾î°¡¹ö¸®´Â °æ¿ì°¡ »ý°Ü ¹ö±×ÀÇ ¿øÀÎÀÌ µÉ¼öµµ ÀÖ´Ù.
C++Ç¥ÁØÀÇ stringÇü¿¡´Â char *ÇüÀ¸·Î ¾Ï½ÃÀûÀΠŸÀÔº¯È¯À» Çã¿ëÇÏÁö ¾Ê°í ¸â¹öÀÎ c_str()À» µÎ¾î º¯È¯À» ÇÏ°Ô ÇÑ´Ù.
¾Ï½ÃÀûÀΠŸÀÔº¯È¯Àº ±×´ÙÁö ÃßõÇÏÁö ¾Ê´Âµ¥ ÃÖ±Ù C++¿¡ Ãß°¡µÈ ³»¿ëÁß explicit Ű¿öµå¸¦ »ç¿ëÇÏ¿© ¾Ï½ÃÀû ŸÀÔº¯È¯À» ¸·À»¼ö ÀÖ´Ù.
(±×·¯³ª ¸í½ÃÀû ŸÀÔº¯È¯Àº ¿©ÀüÈ÷ Çã¿ëÇϰí ÀÖ´Ù.)

±×·¸´Ù¸é ¶Ç ´Ù¸¥ ¹æ¹ýÀº ÇÁ·Ï½Ã Ŭ·¡½º(proxy class)¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
C++ÀÇ ±ÔÄ¢¿¡ µÎ¹øÀÇ ¾Ï½ÃÀû ŸÀÔº¯È¯Àº ÀÌ·ç¾î Áú¼ö°¡ ¾ø´Ù´Â ±¸¹®ÀÌ Àֱ⠶§¹®¿¡.
´ÜÀÏ ÀÎÀÚ »ý¼ºÀÚÀÇ °æ¿ì ÀÌ³Ê Å¬·¡½º(inner-class)¸¦ µÎ¾î ÇÁ·Ï½Ã·Î »ç¿ëÇÏ¸é °£´ÜÇÏ°Ô ÇØ°áµÈ´Ù.

Ç׸ñ 6. Áõ°¡ ¹× °¨¼Ò ¿¬»êÀÚÀÇ ÀüÀ§(prefix)/ÈÄÀÇ(postfix) ÇüŸ¦ ¹Ýµå½Ã ±¸ºÐÇÏÀÚ.

±¸Çö µÇ¾î ÀÖ´Â ÇüŰ¡ ´Ù¸£°í ¾²ÀÓÀÌ ´Ù¸£´Ù.
class UPInt
{
    public:
      UPInt& operator++(); // ˟ˤ ++
      const UPInt operator++(int); // ÈÄÀ§ ++ int°ªÀº ¹«!Á¶!°Ç! 0ÀÓ

      UPInt& operator--(); // ˟ˤ --
      const UPInt operator--(int); // ÈÄÀ§ -- int°ªÀº ¹«!Á¶!°Ç! 0ÀÓ

    ...

};

³»ºÎÀû ±¸ÇöÀº ¹Ø°ú °°´Ù. C++ °ø½ÄÀûÀÎ ±¸Çö ¹æ¹ý
UPInt& UPInt::operator++() // ˟ˤ
{
    (*this) += 1;
    return *this;
}

const UPInt UPInt::operator(int)
{

    const UPInt oldValue = *this;
    ++(*this);

    return oldValue;

}

È¿À²À» À§Çؼ­¶ó¸é ÀüÀ§ ¿¬»êÀÚÀÇ »ç¿ëÀ» ±ÇÇÑ´Ù.

Ç׸ñ 7. &&, ||, ȤÀº , ¿¬»êÀÚ´Â ¿À¹ö·Îµù ´ë»óÀÌ Àý´ë·Î ¾Æ´Ï´Ù.

&&°ú ||Àº ´ÜÃàÆò°¡ Àṉ̀¸Á¶(short-circuit semantics)ÀÇ ÇüÅÂÀÌ´Ù.
±×·¯³ª ¿À¹ö·ÎµùÀ» ÇϰԵǸé À̰ÍÀº ÇÔ¼öÈ£ÃâÀÇ ÇüÅ·Π¹Ù²î°Ô µÈ´Ù.

¸â¹ö ÇÔ¼öÀÏ °æ¿ì
if(expression1.operator&&(expression2))
    ...
Àü¿ª ÇÔ¼öÀÏ °æ¿ì
if(operator&&(expression1,expression2))
    ...

ÀÌ·¸°Ô ¹Ù²î°Ô µÇ´Âµ¥ ÀÌ´Â expression1°ú expression2°¡ ÀÌ¹Ì Æò°¡¸¦ ¸¶Ä£»óÅ¿¡¼­ ÀÌ·ç¾îÁö±â ¶§¹®¿¡ ´ÜÃàÆò°¡°¡ ºÒ°¡´ÉÇØÁø´Ù.

¶ÇÇÑ ½°Ç¥(,) ¿¬»êÀÚÀÇ °æ¿ìµµ ¸¶Âù°¡ÁöÀÇ ÀÌÀ¯·Î ¸ÕÀú Æò°¡µÇ°í ±× ´ÙÀ½ ¼øÂ÷ÀûÀ¸·Î ÀÌ·ç¾îÁ®¾ß ÇÏ´Â ¹Ý¸é ¿À¹ö·ÎµùÀ» ÇϰԵǸé
¿ÞÂʺÎÅÍ ¼øÂ÷ÀûÀ¸·Î ÀÌ·ç¾îÁø´Ù´Â º¸ÀåÀÌ ¾ø´Ù. (ÄÄÆÄÀÏ·¯°¡ Áö¿øÇÏ´ÂÁö Á¶Â÷ ¸ð¸¥´Ù-_-;)

¿À¹ö·Îµù ºÒ°¡´ÉÇÑ ¿¬»êÀÚ.
. .* :: ?: new delete sizeof typeid static_cast dynamic_cast const_cast reinterpret_cast

¿À¹ö·Îµù °¡´ÉÇÑ ¿¬»êÀÚ.
operator new
operator delete
operator new[]
operator delete[]
+ - * / % ^ & | ~ ! = < > += *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> () []

Ç׸ñ 8. new¿Í deleteÀÇ Àǹ̸¦ Á¤È®È÷ ±¸ºÐÇϰí ÀÌÇØÇÏÀÚ

new¿¬»êÀÚ´Â ¿À¹ö·ÎµùÀ» ÇÒ¼ö ¾ø´Ù.
ÇÏÁö¸¸ operator new´Â ¿À¹ö·ÎµùÀÌ °¡´ÉÇÏ´Ù.

ÀϹÝÀûÀ¸·Î new¿¬»êÀÚ¸¦ »ç¿ëÇÏ¸é ´ÙÀ½°ú °°Àº Äڵ尡 »ý¼ºµÈ´Ù.
string *ps = new string("Memory Management");

¾Æ·¡¿Í °°ÀÌ º¯ÇÑ´Ù.

void *memory = operator new(sizeof(string)); // ¹ÌÃʱâÈ­µÈ ¸Þ¸ð¸®¸¦ ¹ÝȯÇÑ´Ù.
string::string("Memory Management"); // »ý¼ºÀÚ·Î ÃʱâÈ­ÇÑ´Ù.
string *ps = static_cast<string*>(memory); // ij½ºÆ®

¿©±â¼­ operator new°¡ ¾²À̴µ¥ ÀÌ ¿¬»êÀÚ´Â ¿À¹ö·ÎµùÀÌ °¡´ÉÇÏ´Ù.
µû¶ó¼­ »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ ¸Þ¸ð¸® ¿µ¿ªÀ» ¼³Á¤ÇÏ¿© ±× ºÎºÐÀ» ÇÒ´çÇÏ¿© ÁÙ¼ö Àִµ¥
À̸¦ ¸Þ¸ð¸® ÁöÁ¤ new(Placement new)¶ó°í ºÎ¸¥´Ù.

»ç¿ë¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
new (»ç¿ëÀÚ ÁöÁ¤ ¸Þ¸ð¸®)ÇÒ´çÇÒ °´Ã¼(°´Ã¼ÀÇ Å©±â);

±×¸®°í operator new´Â ´ÙÀ½°ú °°ÀÌ ¿À¹ö·ÎµùÇÑ´Ù.
void *operator new(size_t, void *location)
{
    return location;
}

new¿Í ¸¶Âù°¡Áö·Î delete ¿¬»êÀÚµµ ¿ª½Ã À¯»çÇÑ Äڵ带 »ý¼ºÇÑ´Ù.
string *ps;

...

delete ps;

¾Æ·¡¿Í °°ÀÌ º¯ÇÑ´Ù.

ps->~string(); // °´Ã¼ÀÇ ¼Ò¸êÀÚ°¡ È£ÃâµÈ´Ù.
operator delete(ps); // ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÑ´Ù.

ÀÌ¿Í °°ÀÌ operator new¿Í operator delete´Â C¾ð¾îÀÇ malloc°ú free¿Í À¯»çÇÏ´Ù.
´ÜÁö ¸Þ¸ð¸®¸¦ »ý¼ºÇØÁÙ»Ó ³»ºÎÀûÀÎ »ý¼ºÀÚÀÇ È£ÃâÀº new ¿¬»êÀÚ¿¡ Á¸ÀçÇÑ´Ù.

¶ÇÇÑ ¹è¿­ÀÇ °æ¿ìµµ ¸¶Âù°¡ÁöÀÌ´Ù.
´ÜÁö operator new ] ¿Í operator delete [
?°¡ È£ÃâµÈ´Ù´Â Á¡¸¸ ´Ù¸£´Ù.

¿¹¿Ü (Exceptions)

Ç׸ñ 9. ¸®¼Ò½º ´©¼ö¸¦ ÇÇÇÏ´Â ¹æ¹ýÀÇ Á¤°ø(ïáÍô)Àº ¼Ò¸êÀÚÀÌ´Ù.

µ¿Àû ÇÒ´ç ¸®¼Ò½º´Â °´Ã¼·Î Æ÷ÀåÇ϶ó!

°´Ã¼°¡ ¾Æ´Ñ Æ÷ÀÎÅÍ·Î Á¶ÀÛÇϰí ÀÖÀ»¶§ ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù¸é ¸®¼Ò½º ´©±¸°¡ ¹ß»ýÇÑ´Ù.
ÀÌ·²¶§´Â ½º¸¶Æ® Æ÷ÀÎÅÍ(smart pointer)¿Í °°Àº ¹æ¹ýÀ¸·Î °´Ã¼È­ ½ÃÄÑÁØ´Ù.

C++Ç¥ÁØ ¶óÀ̺귯¸®Áß auto_ptr Ŭ·¡½º°¡ ÀÖ´Ù.
template <class T>
class auto_ptr
{
    public:
      auto_ptr(T *p = 0) : ptr(0) {}
      ~auto_ptr() { delete ptr; }
    private:
      T *ptr;

};
´ë·«ÀûÀÎ ±¸Á¶´Â À§¿Í °°Àºµ¥ À̰ÍÀº Áö¿ª°´Ã¼·Î Á¸ÀçÇϸ鼭 Æ÷ÀÎÅ͸¦ ¹Þ¾Æ ¿¹¿Ü¹ß»ý½Ã È®½ÇÇÑ ¸®¼Ò½º ÇØÁ¦¸¦ º¸ÀåÇÏ¿© ÁØ´Ù.

Ç׸ñ 10. »ý¼ºÀÚ¿¡¼­´Â ¸®¼Ò½º ´©¼ö°¡ ÀϾÁö ¾Ê°Ô ÇÏÀÚ.

¸¸¾à »ý¼ºÀÚ¿¡¼­ ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù°í »ý°¢Çغ¸ÀÚ.
C++¿¡¼­´Â »ý¼º °úÁ¤ÀÌ ¿Ï·áµÈ(full constructed) °´Ã¼¸¸À» ¾ÈÀüÇÏ°Ô ¼Ò¸ê½Ã۱⠶§¹®¿¡ »ý¼ºÀÚ¿¡ ¿¹¿Ü°¡ ÀϾ °´Ã¼ÀÇ Á¤»óÀûÀÎ
¼Ò¸êÀ» º¸Àå ¹ÞÀ»¼ö ¾ø´Ù.

»ý¼ºÀÚ¿¡¼­ try - catch¹®À¸·Î ¿¹¿Ü±¸¹®À» ó¸®ÇÏ¿©µµ µÇÁö¸¸ ¾ÕÀÇ Ç׸ñÀÇ auto_ptrÀ» »ç¿ëÇϴ°͵µ ÁÁÀº ¹æ¹ýÀÌ´Ù.

Ç׸ñ 11. ¼Ò¸êÀÚ¿¡¼­´Â ¿¹¿Ü°¡ Å»ÃâÇÏÁö ¸øÇÏ°Ô ÇÏÀÚ.

Àý´ë·Î ¼Ò¸êÀÚ¿¡¼­ ¿¹¿Ü°¡ ¹ß»ý½Ã Àý´ë Å»ÃâÇÏÁö ¸øÇϵµ·Ï ¸·¾Æ¾ßÇÑ´Ù.
¸¸¾à ÀÌ¹Ì ¿¹¿Ü ¹ß»ýÀ¸·Î ¼Ò¸êÀÚ°¡ È£Ãâ½Ã ´Ù½Ã ¼Ò¸êÀÚ ³»ºÎÀÇ ÄÚµå·Î ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù¸é terminate µÇ¾î ½ÇÇàÀÌ ¹Ù·Î Á¾·áµÇ¾î ¹ö¸°´Ù.
±×¸®°í ¼Ò¸êÀÚ¿¡¼­ ¿¹¿Ü°¡ ¹ß»ýÀÌ ÀüÆÄµÇ¾îÁø´Ù¸é ¿ª½Ã³ª ±× °´Ã¼ÀÇ Á¤»óÀûÀÎ Á¾·á°¡ µÇÁö ¸øÇÑ´Ù.

...

Session::~Session()
{

    try
    {
      logDestruction(this);
    }
    catch(...) // ÀÌ¿Í °°ÀÌ Â÷¶ó¸® ¾Æ¹«·± 󸮰¡ ¾ø´õ¶óµµ Àý´ë ¼Ò¸êÀÚÀÇ ¿¹¿Ü°¡ ¿ÜºÎ·Î ÀüÆÄµÇ´Â°ÍÀº ¸·¾Æ¾ß ÇÑ´Ù.
    {
    }
}

Ç׸ñ 12. ¿¹¿Ü ¹ß»ýÀÌ ¸Å°³º¯¼ö Àü´Þ ȤÀº °¡»ó ÇÔ¼ö È£Ãâ°ú ¾î¶»°Ô ´Ù¸¥Áö¸¦ ÀÌÇØÇÏÀÚ.

ÇÔ¼ö·ÎÀÇ ¸Å°³º¯¼ö Àü´Þ°ú catch¹®À¸·ÎÀÇ ¿¹¿Ü Àü´ÞÀÇ °¡Àå Å« Â÷ÀÌÁ¡Àº
¿¹¿ÜÀÇ °æ¿ì¿¡´Â Áö¿ª º¯¼öÀÇ Àü´Þ½Ã ¿µ¿ªÀÇ ¹þ¾î³­ °æ¿ì¿¡µµ º¸ÀåÀ» ÇØÁà¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù.
´Ù½Ã ¸»Çϸé catch¹®À¸·Î ÆÄ¶ó¹ÌÅ͸¦ ³Ñ°ÜÁÙ¶§
±× °´Ã¼ÀÇ ¹üÀ§¸¦ ¹þ¾î³­ ÀÎÀÚ°¡ Àü´ÞµÉ¼öµµ Àִµ¥ ÀÚÄ© À߸øÇϸé Áö¿ª°´Ã¼ÀÇ °æ¿ì ½ºÅØ µÇ°¨±â¸¦ ÅëÇÏ¿© »ç¶óÁ® ¹ö¸±¼öµµ ÀÖ´Ù.
±×·¸±â ¶§¹®¿¡ ¿¹¿ÜÀÇ ÆÄ¶ó¹ÌÅÍÀÇ °æ¿ì¿¡´Â ¹Ýµå½Ã ¿øº»ÀÇ º¹»ç¹°ÀÇ ÇüÅ·ΠÀü´ÞµÇ¾î¾ß ÇÑ´Ù.

¿¹¿Ü ¹ß»ýÀÇ ¸Å°³º¯¼ö Àü´ÞÀÇ °æ¿ì¸¦ ¾Ë¾Æº¸ÀÚ¸é

...

catch(Widget w)

...

ÀÌ¿Í °°Àº °æ¿ì Àü´ÞµÇ´Â °´Ã¼¿¡ ´ëÇÏ¿© µÎ °³ÀÇ »çº»ÀÌ ¸¸µé¾îÁø´Ù.
Çϳª´Â ¿¹¿Ü º¹»ç ¸ÅÄ¿´ÏÁò¿¡ ÀÇÇØ »ý±â´Â Àӽà °´Ã¼ÀÌ°í ¶Ç Çϳª´Â w·Î ÀúÀåµÉ¶§ »ý±â´Â Àӽð´Ã¼ÀÌ´Ù.

...

catch(Widget &w)

...

catch(const Widget &w)

...

À§¿Í °°Àº °æ¿ì´Â ÇѹøÀÇ º¹»ç¸¸ ÀÌ·ç¾îÁø´Ù.
¿¹¿Ü º¹»ç ¸ÅÄ¿´ÏÁòÀÇ ÇѹøÀÇ º¹»ç¿Í ±× °´Ã¼¾Ö ´ëÇÑ ÂüÁ¶ÀÌ´Ù.

±×¸®°í catch¹® ¾ÈÀÇ throw´Â ¿¹¿Ü¸¦ ÀüÆÄ(propagate)ÇϰíÀÚ ÇÒ¶§ ¾²ÀδÙ.
...

catch(Widget &w)
{

    ...

    throw;

}
ÀÌ °æ¿ì¿¡´Â ¿¹¿Ü ÀÚü¸¦ ±×´ë·Î ÀüÆÄÇϱ⠶§¹®¿¡ º¹»ç°¡ ÀϾÁö ¾Ê´Â´Ù.

...

catch(Widget &w)
{

    ...

    throw w;

}
¸¸¾à À̰æ¿ì¶ó¸é ¿¹¿Ü ó¸® ¸ÅÄ¿´ÏÁòÀ¸·Î ´Ù½Ã Çѹø »çº»°ú ÇÔ²² ÀüÆÄ°¡ ÀÌ·ç¾îÁø´Ù.

ÀÌÁ¦ °¡»ó ÇÔ¼öÀÇ È£Ãâ °æ¿ì¸¦ º¸±âÀü¿¡
¿¹¿ÜÀÇ ÆÄ¶ó¹ÌÅʹ ŸÀÔº¯È¯À» Çã¿ëÇÏÁö ¾Ê´Â´Ù´Â°ÍÀ» ¾Ë¾ÆµÎ¾î¾ß ÇÑ´Ù.
¸¸¾à catch¹®¿¡ doubleÀÇ ÀÎÀÚ¸¦ ¹Þ¾ÆµéÀÌ´Â ±¸¹®ÀÌ ÀÖÀ»¶§ intÇüÀÇ ÀÎÀÚ¸¦ ³Ñ°ÜÁØ´Ù¸é ±× catch¹®Àº ½ÇÇàµÇÁö ¾Ê´Â´Ù.

±×·¯³ª »ó¼Ó ±â¹Ý(inheritance-based)ÀÇ Àü´ÞÀº »óÀ§ ȣȯ¼ºÀ» °¡Áø´Ù.
¿¹¸¦ µé¸é Ç¥ÁØ C++¶óÀ̺귯¸®ÀÇ ¿¹¿Ü Ŭ·¡½ºÀÇ °æ¿ì exceptionÀÇ ÃÖ»óÀ§ Ŭ·¡½ººÎÅÍ ½ÃÀÛÇÏ¿© logic_error°ú runtime_errorµé·Î ³ª´¶´Ù.
¸¸¾à catch¹®ÀÌ runtime_error¸¦ ¹Þ¾ÆµéÀδٰí ÇÒ¶§ exceptionÀÇ ¿¹¿Ü¸¦ Àü´ÞÇÑ´Ù¸é runtime_error¸¦ ¹Þ¾ÆµéÀÌ´Â catch¹®¿¡¼­
exceptionÀ» °¨ÁöÇÏ°í ¿¹¿Ü¸¦ ó¸®ÇÏ°Ô µÈ´Ù.

±×¸®°í ¶Ç Çϳª ¾Ë¾ÆµÑÁ¡Àº ¿¹¿Ü´Â °¡Àå ù°(first fit)¸¦ ¼±ÅÃÇÏ´Â ¹æ½ÄÀ¸·Î ÁøÇàµÇ´Âµ¥ »óÀ§ ¿¹¿Ü·Î ºÎÅÍ ÇÏÀ§ ¿¹¿Ü·Î À̾îÁö´Â ÄÚµùÀ»
ÇÏÁö ¾Ê¾Æ¾ßÇÑ´Ù.

Ç׸ñ 13. ¹ß»ýÇÑ ¿¹¿Ü´Â ÂüÁ¶ÀÚ·Î ¹Þ¾Æ³»ÀÚ

¿¹¿Ü¸¦ ¹Þ¾Æ³¾¼ö ÀÖ´Â ¹æ¹ýÀº ¼¼°¡Áö°¡ ÀÖ´Ù.
ù¹øÂ°·Î Æ÷ÀÎÅÍ·Î ¹Þ¾Æ³»±âÀε¥ À̰ÍÀº Áö¿ª °´Ã¼ÀÇ Àü´ÞÀ̳ª Èü¿µ¿ªÀÇ »ý¼ºµîÀÇ ¹®Á¦·Î ¾²¿©ÁöÁö ¾Ê´Â´Ù.
µÎ¹øÂ°´Â °ªÀ» ÀÌ¿ëÇÑ Àü´ÞÀε¥ ¾Õ¼­ Æ÷ÀÎÅÍÀÇ Àü´Þ°ú´Â ´Þ¸® °ÅÀÇ ¹®Á¦°¡ ¾ø¾î º¸ÀÌÁö¸¸ ´ÜÇϳª Àß·ÁÁö´Â ¹®Á¦(slicing problem)°¡ »ý±æ¼ö ÀÖ´Ù.

¹ØÀº Àß·ÁÁö´Â ¹®Á¦ÀÇ ¿¹ÀÌ´Ù.
...

class Validation_error:public exception
{

    public:
      virtual const char *what() throw();

    ...
}

void someFunction()
{

    ...

    if(À¯È¿¼º °Ë»ç°¡ ½ÇÆÐÇßÀ» °æ¿ì)

      throw Validation_error();
}

void doSomething()
{

    try
    {
      someFunction();
    }
    catch(exception ex)
    {
      cerr << ex.what(); // exception.what()À» È£ÃâÇϰí Validation_error::what()Àº È£ÃâµÇÁö ¾Ê´Â´Ù.
    }
    ...
}

¸¶Áö¸·À¸·Î ¼¼¹øÂ°´Â ÂüÁ¶¸¦ ÀÌ¿ëÇÑ °æ¿ìÀε¥ À§ÀÇ ½½¶óÀÌ½Ì ¹®Á¦µµ »ý±âÁö ¾Ê°í °¡Àå C++ Ç¥ÁØ¿¡ ±ÙÁ¢ÇÑ ¿¹¿Üó¸® ¹æ¹ýÀÌ´Ù.

Ç׸ñ 14. ¿¹¿Ü ÁöÁ¤(exception specification) ±â´ÉÀº ³ÃöÇÏ°Ô »ç¿ëÇÏÀÚ.

¿¹¿Ü ÁöÁ¤À̶õ ÇÔ¼ö°¡ ¹ß»ý½Ãų ¿¹¿Ü¸¦ ¹Ì¸® ÁöÁ¤ÇÏ´Â ¹æ¹ýÀÌ´Ù.
¹Ì¸® ÀϾ ¿¹¿Ü¸¦ ÁöÁ¤ÇÔÀ¸·Î ¹Ì¸® ÀϾ ¿¹¿Ü¸¦ ¿¹°ßÇØ¼­ ´ëóÇÒ¼ö Àִٴµ¥ Àǹ̰¡ ÀÖ´Ù.
ÇÏÁö¸¸ ¸¸¾à ÁöÁ¤µÈ ¿¹¿Ü°¡ ¾Æ´Ñ ´Ù¸¥ ¿¹¿Ü°¡ ¹ß»ý½Ã ·±Å¸ÀÓ ¿¡·¯°¡ ¹ß»ýÇϸ鼭 unexpected¶ó´Â Ư¼ö ÇÔ¼ö°¡ ÀÚµ¿À¸·Î È£ÃâµÈ´Ù.
unexpectedÀÇ ±âº» µ¿ÀÛÀº terminte¸¦ È£ÃâÇϰí ÀÌ ÇÔ¼ö´Â ´Ù½Ã abort¸¦ È£ÃâÇϸ鼭 ÇÁ·Î±×·¥Àº Áö¿ª°´Ã¼Á¶Â÷ ÇØÁ¦ µÇÁö ¾Ê°í ¹Ù·Î Á¾·áµÇ¾î ¹ö¸°´Ù.

Ȥ½Ã¶óµµ ÅÛÇø´¿¡ ¿¹¿Ü ÁöÁ¤À» »ç¿ëÇϰíÀÚ ÇÑ´Ù¸é Æ÷±âÇÏ´Â°Ô ÁÁ´Ù. ÅÛÇø´ÀÇ µ¥ÀÌÅÍ ±¸Á¶¸¦ ¾Ë¼ö ¾øÀ¸¹Ç·Î ¾î¶² ¿¹¿Ü°¡ ¹ß»ýÇÒÁö ¿¹ÃøÇÏ´Â°Ç ³Ê¹« ¸¹Àº ¿ä¼Ò°¡ Á¸ÀçÇϱ⠶§¹®ÀÌ´Ù.
°°Àº ÀÌÀ¯·Î ÄݹéÇÔ¼ö¿¡ ¿¹¿Ü ÁöÁ¤À» »ç¿ëÇϴ°͵µ ÈûµéÁö¸¸ ÄݹéÇÔ¼ö ŸÀÔ¿¡ ¹Ì¸® ¿¹¿Ü ÁöÁ¤À» »ç¿ëÇÔÀ¸·Î Á¤»óÀûÀÎ µ¿ÀÛÀ» ÇÒ¼ö ÀÖ´Ù.

±×·¸´õ¶óµµ ¶æÇÏÁö ¾Ê°Ô ·±Å¸ÀÓ ¿¡·¯°¡ ¹ß»ýµÇ´Â°ÍÀº Âü±â ÈûµçÀÏÀÌ´Ù.
À̰ÍÀ» ÇÇÇÒ·Á¸é unexpected°¡ È£ÃâÇÏ´Â ÇÔ¼ö¸¦ º¯°æÇÏ¿© ÁÖ¸é ½±°Ô ÇØ°á°¡´ÉÇÏ´Ù.
void ¿¹¿Ü ¹ß»ý ÇÔ¼ö()
{
    ... // throw¸¦ »ç¿ëÇÏ¿© ±×³É Áß°³Çϴ°͵µ ÇϳªÀÇ ¹æ¹ýÀÌ´Ù.
}

...

set_unexpected(¿¹¿Ü ¹ß»ý ÇÔ¼ö);

Ç׸ñ 15. ¿¹¿Ü 󸮿¡ µå´Â ºñ¿ë¿¡ ´ëÇØ Á¤È®È÷ ÆÄ¾ÇÇÏÀÚ.

Äڵ尡 ¾à°£(5~10%?) »ý¼ºµÈ´Ù°í ÇÑ´Ù. ±×¸®°í ¿¹¿Ü ¹ß»ýÀ¸·Î ÇÔ¼ö°¡ º¹±Íµµ´Â ½Ã°£Àº ÀϹÝÀûÀÎ ½Ã°£º¸´Ù 1000¹è °¡·® ´Ã¾î³­´Ù°í ÇÑ´Ù.
ÇÏÁö¸¸ Áß¿äÇÑ Á¡Àº ¿¹¿Ü¶õ ¶æÇÏÁö ¾Ê´Â »óȲÀ̱⠶§¹®¿¡ °ÅÀÇ ÀϾÁö ¾Ê´Â´Ù°í »ý°¢ÇÒ¶§ ÀÌ ½Ã°£¿¡ ºÎ´ãÀ» °¡Áú ÇÊ¿ä´Â ¾ø´Ù.
¸¸¾à ¿¹¿Ü°¡ ¾Æ´Ñ »óȲÀ̶ó¸é ºÎ´ãµÇ´Â ½Ã°£Àº ¾ø´Ù°í ºÁµµ µÇ±â ¶§¹®ÀÌ´Ù.

È¿À²(Efficiency)

Ç׸ñ 16. »Ä¼Ó±îÁö ÀØÁö ¸»ÀÚ, 80-20 ¹ýÄ¢!

"ÇÁ·Î±×·¥ ¸®¼Ò½ºÀÇ 80%´Â Àüü ½ÇÇà ÄÚµåÀÇ ¾à 20%¸¸ÀÌ »ç¿ëÇÑ´Ù."
"½ÇÇà ½Ã°£ÀÇ 80%´Â ½ÇÇà ÄÚµåÀÇ ¾à 20%¸¸ÀÌ ¼Ò¸ðÇÑ´Ù."

Ç׸ñ 17. È¿À² Çâ»ó¿¡ ÀÖ¾î Áö¿¬ Æò°¡(lazy evaluation)´Â ÃæºÐÈ÷ °í·ÁÇØ º¼ ¸¸ÇÑ´Ù.

´çÀå ÇÊ¿äÇØÁö±â Àü±îÁö´Â ÃÖ´ëÇÑ ½ÇÇà ½Ã°£À» ´ÊÃá´Ù.

¸î°¡Áö ¿ä¼Ò·Î ¾Ë¾Æº¸¸é
ÂüÁ¶ Ä«¿îÆÃ(Reference Counting) ¸¸¾à ¹®ÀÚ¿­ µÎ°³¸¦ ÇÕÄ£´Ù¸é º¹»ç°¡ ÀÌ·ç¾îÁö°Ô µÈ´Ù.
ÇÏÁö¸¸ ÃÖ´ëÇÑ ´ÊÃç¼­ ¿ì¼± ¹®ÀÚ¿­ µÎ°¡Áö¸¦ Æ÷ÀÎÅÍ µîÀ¸·Î À̾îµÎ±â¸¸ ÇÏ¸é ¿ì¼± ´çÀåÀº µÎ ¹®ÀÚ¿­ÀÌ ÇÕÃÄÁø°Í°ú °°Àº È¿°ú¸¦ Áö´Ñ´Ù.
¸¸¾à µÎ ¹®ÀÚ¿­Áß Çϳª°¡ ¼öÁ¤ÀÌ °¡ÇØ¾ß ÇÑ´Ù¸é ±×Á¦¼­¾ß º¹»ç¸¦ ÇØµµ ÃæºÐÇÏ´Ù.

µ¥ÀÌÅÍ Àбâ¿Í ¾²±â¸¦ ±¸ºÐÇϱ⠳ªÁß!!!!!!!!!!!!! Ç׸ñ30À» ÂüÁ¶

Áö¿¬ ¹æ½ÄÀÇ µ¥ÀÌÅÍ °¡Á®¿À±â(lazy fetching) ¸¸¾à µ¥ÀÌÅͺ£À̽º¿¡¼­ Çʵ带 Àоî¿Â´Ù°í °¡Á¤ÇÏ¸é µÎ¹øÂ° Çʵ尡 ¿ì¼± ÇÊ¿äÇÒ°æ¿ì µÎ¹øÂ° Çʵ常 µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ Àоî¿Â´Ù.
Â÷ÈÄ ³ªÁß¿¡ ÇÊ¿äÇÒ´ë ´Ù¸¥ Çʵ嵵 Àоî¿À´Â ¹æ½ÄÀ¸·Î ÃÖ¼ÒÇÑÀÇ ½Ã°£À¸·Î ¹Ù·Î ´ÙÀ½ ¸í·ÉÀ» ó¸®ÇÒ¼ö ÀÖ´Ù.

ÇØ´ç ¸â¹ö º¯¼öµé¿¡ mutable¸¦ ½á³ÖÀ¸¸é ½±°Ô ±¸Çö°¡´ÉÇÏ´Ù.

Áö¿¬ ¹æ½ÄÀÇ Ç¥Çö½Ä Æò°¡(lazy expression evaluation) ¾ÕÀÇ À̾߱â¿Í ºñ½ÁÇѵ¥ ¸¸¾à µ¥ÀÌÅÍ °è»êµÈ ºÎºÐ¸¸ ÇÊ¿äÇÒ °æ¿ì ºÎºÐ ºÎºÐ¸¸ ÇÊ¿äÇÒ¶§ °è»êÇÏ´Â°Ô À¯¸®ÇÏ´Ù.

Ç׸ñ 18. ¿¹»óµÇ´Â °è»ê °á°ú¸¦ ¹Ì¸® ÁغñÇϸé 󸮺ñ¿ëÀ» ±ðÀ» ¼ö ÀÖ´Ù.

À§¿Í´Â Á¶±Ý ´Ù¸¥ ½Ã¼±À¸·Î º¸¸é ¸¸¾à Áߺ¹µÇ¾î ¸¹ÀÌ »ç¿ëµÇ´Â ºÎºÐÀ̶ó¸é À§¿Í´Â ¹Ý´ë·Î ¿ÀÈ÷·Á ¹Ì¸® °è»ê ÇØµÎ´Â°Ô ij½Ã¿Í °°Àº È¿°ú¸¦ ¹Þ¾Æ ÃÑ ½ÇÇà½Ã°£À» ´ÜÃà ½Ãų¼ö ÀÖ´Ù.

Ç׸ñ 19. Àӽà °´Ã¼ÀÇ ¿ø·ù(ê«×µ)¸¦ Á¤È®È÷ ÀÌÇØÇÏÀÚ.

Àӽà °´Ã¼´Â ¶æÇÏÁö ¾ÊÀº ¿©·¯°÷¿¡¼­ ¾²Àϼöµµ ÀÖ´Ù.

size_t countChar(const string &str, char ch);

...

char bufferMAX_STRING_LEN?;
char c;

...

countChar(buffer, c);

À̰ÍÀº Á¤»óÀûÀ¸·Î ½ÇÇàÀÌ µÈ´Ù.
bufferÀº charÇü ¹è¿­ÀÌÁö¸¸ stringÇüÀ¸·Î ¾Ï½ÃÀûÀ¸·Î ¹Ù²î¾î Àӽð´Ã¼°¡ »ý¼ºµÈÈÄ °Å±â¿¡ ´ëÇÑ ·¹ÆÛ·±½º°¡ ³Ñ¾î°£´Ù.
¸¸¾à ÀÎÀÚÀÇ Å¸ÀÔÀÌ const string &strÀÌ ¾Æ´Ï¶ó string &strÀ̾ú´Ù¸é ½ÇÇàÀÌ ºÒ°¡´ÉÇß°ÚÁö¸¸ À§¿Í °°Àº ÄÚµå´Â Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÑ´Ù.

»ý°¢Áö ¸øÇÑ Àӽð´Ã¼ »ý¼ºÀ» ÁÖÀÇÇÏÀÚ.

Ç׸ñ 20. ¹Ýȯ°ª ÃÖÀûÈ­(return value optimization)°¡ °¡´ÉÇÏ°Ô ÇÏÀÚ.

¹Ýȯ°ª ÃÖÀûÈ­ RVO´Â °ÅÀÇ ´ëºÎºÐÀÇ ÄÄÆÄÀÏ·¯°¡ Áö¿øÇÏ´Â ±â´ÉÀÌ´Ù.
¿¹»óµÇ¾îÁö´Â Àӽð´Ã¼¸¦ »ý¼ºÀ» ¾ïÁ¦ÇÒ¼ö Àִµ¥ ¹æ¹ýÀº
¿ì¼± ÇÔ¼ö´Â ÀζóÀÎÀ¸·Î µÎ°í ¹Ýȯ°ªÀ» »ý¼ºÀÚ·Î ¸¸µé¾îÁÖ¸é ¹Ýȯ ¹Þ´Â °´Ã¼·Î ´ëüµÇ¾î Áø´Ù.
inline const Rational operator*(const Rational &lhs, const Rational *rhs)
{
    return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator() );
}
ÀÌ¿Í °°ÀÌ ¸¸µé¾î µÎ¸é ÄÄÆÄÀÏ·¯°¡ ¹Ýȯ°´Ã¼¸¦ ÇÔ¼ö¿¡¼­ ¹Ýȯ¹Þ´Â °´Ã¼·Î ´ëüÇÏ¿© Àӽð´Ã¼°¡ »ç¶óÁú¼ö ÀÖ´Ù.

Ç׸ñ 21. ¿À¹ö·ÎµùÀº ºÒÇÊ¿äÇÑ ¾Ï½ÃÀû ŸÀÔº¯È¯À» ¸·´Â ÇÑ ¹æ¹ýÀÌ´Ù.

class UPInt
{
    public:
      UPInt();
      UpInt?(int value);

    ...
};

const UPInt operator+(const UPInt &lhs, consst UPInt &rhs);

UPInt upi1, upi2;

...

UPInt upi3 = upi1 + upi2; // ¿À¹ö·ÎµùµÈ +¿¬»êÀÚ°¡ Á¤»ó ÀÛµ¿
UPInt upi4 = 10 + upi2 // ¶æÇÏÁö ¾Ê°Ô ¾Ï½ÃÀû ŸÀÔº¯È¯À» ÅëÇØ UPIntÇüÀ¸·Î º¯È¯ÈÄ Àü´Þ

ÀÌ·¸±â ¶§¹®¿¡ À§ÀÇ ¿¹Á¦¿¡¼­ ¾Ï½ÃÀû ŸÀÔº¯È¯ÀÌ µÉ¼ö ÀÖ´Â intÇü°ú UPIntÇüÀ» ¿¹»óÇØ ÃÖÀûÈ­µÈ ¿À¹ö·ÎµùÀ» Ãß°¡ÇÏ¿©ÁÖ¸é µÈ´Ù.

Ç׸ñ 22. ´Üµ¶ ¿¬»êÀÚ(op) ´ë½Å¿¡ =ÀÌ ºÙÀº ¿¬»êÀÚ(op=)¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁÀ» ¶§°¡ ÀÖ´Ù.

¿¬»êÀÚ ¿À¹ö·ÎµùÀÇ ÃÖÀûÀÇ °á°ú´Â ¹Ù·Î Àӽð´Ã¼°¡ ¾ø´Â °æ¿ìÀÌ´Ù.
result = a + b + c; // a + bÀÇ °á°ú°ªÀÌ Àӽð´Ã¼ »ý¼º ´Ù½Ã (a + b) + c¿¡ Àӽð´Ã¼ »ý¼º
result = a;
result += b;
result += c; // ÀüºÎ Àӽð´Ã¼ »ý¼º ºÒÇÊ¿ä
ÀÌ¿Í °°ÀÌ ´Üµ¶ ¿¬»êÀÚº¸´Ù ÃÖÀûÈ­°¡ °¡´ÉÇÏ´Ù.

±×¸®°í ´Üµ¶ ¿¬»êÀÚ¸¦
const Rational operator+(const Rational &lhs, const Rational &rhs)
{
    return Rational(lhs) += rhs;
}
ÀÌ¿Í °°ÀÌ =ÀÌ ºÙÀº ¿¬»êÀÚ¿Í ¿¬°ü ½ÃÄÑÁÖ¸é ´Üµ¶ ¿¬»êÀÚ¸¦ ½±°Ô ±¸ÇöÇÒ¼ö ÀÖ´Ù.

¶ÇÇÑ
const T operator+(const T& lhs, const T& rhs)
{
    return T(lhs) += rhs;
}
ÇÁ·»Áî ÇÔ¼ö·Î ¾î·Æ°Ô ±¸ÇöÇÒ ³»¿ëÀÌ ±ò²ûÇÏ°Ô ÇØ°á µÈ´Ù.

Ç׸ñ 23. Á¤ ¾È µÇ¸é ´Ù¸¥ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏÀÚ!

¼Óµµ°¡ ºü¸¥ C¶óÀ̺귯¸® ¾à°£Àº ´À¸®Áö¸¸ ŸÀÔ ¾ÈÀü¼º°ú ¿¹¿Ü 󸮵µ °¡´ÉÇÑ C++¶óÀ̺귯¸®
¸ðµç ¶óÀ̺귯¸® ¸¶´Ù ¼³°èÀÚÀÇ »ý°¢ÀÌ ´Ù¸£±â ¶§¹®¿¡ ±¸ÇöÇϱâ Èûµé°Å³ª ½Ã°£ÀÌ ¸¹ÀÌ °É¸±¶§
¶óÀ̺귯¸®¸¦ ã¾Æº¸´Â°Í ¶ÇÇÑ ÁÁÀº ¹æ¹ýÀÌ´Ù.

Ç׸ñ 24. °¡»ó ÇÔ¼ö, ´ÙÁß »ó¼Ó, °¡»ó ±âº» Ŭ·¡½º, RTTI¿¡ µé¾î°¡´Â ºñ¿ëÀ» Á¦´ë·Î ÆÄ¾ÇÇÏÀÚ.

°¡»ó ÇÔ¼ö´Â °¡»ó Å×À̺í(virtual table)°ú °¡»ó Å×ÀÌºí Æ÷ÀÎÅÍ(virtual table pointer)·Î ±¸ÇöµÇ¾î ÀÖ´Ù.
°¡»ó Å×À̺íÀº °´Ã¼ ÇÔ¼ö Æ÷ÀÎÅÍÀÇ ¹è¿­À̳ª ¸®½ºÆ®µîÀ¸·Î ÀÌ·ç¾î Áö´Âµ¥ °¡»ó ÇÔ¼ö³ª »ó¼Ó ¹ÞÀº Ŭ·¡½º´Â ¹«Á¶°Ç »ý¼ºµÈ´Ù.
ÀÌ °¡»ó Å×À̺íÀº ´ÙÁß »ó¼Ó½Ã¿¡µµ °¡»ó ±âº» Ŭ·¡½º´Â ¹°·Ð RTTI¿¡µµ ¾²ÀδÙ.
RTTIÀÇ °æ¿ì °¡»ó Å×À̺íÀÇ ¾Õ¿¡ ÀÚ½ÅÀÇ ½Äº° Äڵ尡 ÀÖ°í ÀÌ ½Äº°ÄÚµå·Î È®ÀÎÀ» ÇÏ°í ½ÇÇàÀ» ÇÑ´Ù.

À¯¿ëÇϰí Àç¹ÌÀÖ´Â ÇÁ·Î±×·¡¹Ö ±â¹ýµé(Techniques)

Ç׸ñ 25. »ý¼ºÀÚ ÇÔ¼ö¿Í ºñ(Þª)¸â¹ö ÇÔ¼ö¸¦ °¡»ó ÇÔ¼öó·³ ¸¸µå´Â ¹æ¹ý

»ý¼ºÀÚ´Â °¡»óÇÔ¼ö·Î ¸¸µé¼ö°¡ ¾ø´Ù.
±×·¯¹Ç·Î »ó¼Ó¹ÞÀº Ŭ·¡½º¿¡¼­ °¡»ó ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¹æ½ÄÀ¸·Î °¡»ó »ý¼ºÀÚ(virtual constructor)·Î ¸¸µé¼ö ÀÖ´Ù.
°¡»ó »ý¼ºÀÚÁß¿¡¼­ °¡Àå ³Î¸® ¾²ÀÌ´Â ¿¹´Â °¡»ó º¹»ç »ý¼ºÀÚ(virtual copy constructor)ÀÌ´Ù.
class NLComponent
{
    public:
      NLComponent(const NLComponent &rhs);
      virtual NLComponent * clone() const = 0; // º¹»ç »ý¼ºÀÚ¿¡ ÀÌ ÇÔ¼ö°¡ »ç¿ëµÇ¾îÁø´Ù.

    ...
}

class TextBlock? : public NLComponent
{

    public:
      virtual TextBlock? * clone() const // cloneÇÔ¼öÀÇ °æ¿ì °¡»ó ÇÔ¼öÀ̱⶧¹®¿¡ º¹»ç »ý¼ºÀÚ¿¡¼­ cloneÀÇ È£ÃâÀº °¢ °´Ã¼¿¡ ¸Â´Â ÇÔ¼ö°¡ ½ÇÇàµÈ´Ù.
      {
        return new TextBlock?(*this);
      }

    ...
}

ÀÌ·± ¹æ¹ýÀ¸·Î ºñ¸â¹ö ÇÔ¼öµµ °¡»ó ÇÔ¼öó·³ µ¿ÀÛÇÏ°Ô ÇÒ¼ö ÀÖ´Ù.
class NLComponent
{
    ...

    public:

      virtual ostream& operator<<(ostream &str) const = 0;
}

class TextBlock? : public NLComponent
{

    ...

    public:

      virtual ostream& operator<<(ostream &str) const;
};

...

TextBlock? t;
t << cout; // Àϰü¼º¹× °¡µ¶¼ºÀÌ ¶³¾îÁø´Ù.

class NLComponent
{
    ...

    public:

      virtual ostream& print(ostream &s) const = 0;
}

class TextBlock? : public NLComponent
{

    ...

    public:

      virtual ostream& print(ostream &s) const;
};

ostream &operator<<(ostream &s, const NLComponent&c)
{

    return c.print(s);
}
Àϰü¼º¹× °¡»óÇÔ¼ö ó·³ »ç¿ë °¡´ÉÇÏ´Ù.

Ç׸ñ 26. Ŭ·¡½º ÀνºÅϽºÀÇ °³¼ö¸¦ Àǵµ´ë·Î Á¦ÇÑÇÏ´Â ¹æ¹ý

°´Ã¼¸¦ »ý¼ºÀÌ ÀÌ·ç¾îÁö´Â ¼¼ °¡Áö »óȲÀ» ¾Ë¾Æº¸¸é
ù¹øÂ°´Â ±× ÀÚ½ÅÀÌ °´Ã¼·Î ¸¸µé¾î Áú¶§ÀÌ´Ù. ÀÌ°Ç ´ç¿¬ÇÏ´Ù.
µÎ¹øÂ°´Â »ó¼Ó ¹ÞÀ»¶§ °´Ã¼ »ý¼ºÀÌ ÀÌ·ç¾îÁø´Ù. ´Ù½Ã ¸»ÇÏ¸é ºÎ¸ðŬ·¡½ºÀÇ °´Ã¼µµ »ý¼ºÀÌ µÈ´Ù´Â À̾߱â´Ù.
¼¼¹øÂ°´Â ´Ù¸¥ °´Ã¼¿¡ Æ÷ÇԵɶ§ÀÌ´Ù. À̰͵µ ¿ª½Ã³ª °´Ã¼°¡ »ý¼ºµÈ´Ù.

¿ì¼± °´Ã¼¸¦ Çϳª¸¸ »ý¼ºÇØ¾ß ÇÒ¶§´Â ÀÚ½ÅÀÌ °´Ã¼·Î ¸¸µé¾îÁú °æ¿ì Çϳª»ÓÀÌ´Ù.
(µÎ¹øÂ°¿Í ¼¼¹øÂ°ÀÇ °æ¿ì´Â °´Ã¼¸¦ Çϳª¸¸ »ý¼ºÇØ¾ß µÇ´Â ¹üÀ§°¡ ´Ù¸¥ Ŭ·¡½º¿¡°Ôµµ ³Ñ¾î°£´Ù.)
»ý¼ºÀÚ¸¦ privateÀ¸·Î Çϰí Á¤Àû °´Ã¼¸¦ friends³ª staticÇÔ¼ö·Î Á¢±ÙÇÏ¸é ½±°Ô Çϳª¸¸ »ý¼ºÇÒ¼ö ÀÖ´Ù.

À̹ø¿¡´Â Á¦ÇÑµÈ ¿©·¯°³ÀÇ °´Ã¼¸¦ »ý¼ºÇÒ °æ¿ì »ý¼ºÀÚ¸¦ private·Î Çϰí À¯»ç »ý¼ºÀÚ(pseudo-constructor)·Î ¸¸µé¸é¼­ Ä«¿îÆ® ÇÏ¸é µÈ´Ù.
class FSA
{
    public:
      static FSA *make FSA();
      static FSA *make FSA(const FSA& rhs);

    ...

    private:

      FSA();
      FSA(const FSA& rhs);
};

FSA *FSA::make FSA()
{

    return new FSA();
}

FSA *FSA::make FSA(const FSA &rhs)
{

    return new FSA(rhs);
}
À̰ÍÀº À¯»ç »ý¼ºÀÚÀÇ ¿¹Á¦ÀÌ´Ù. È£ÃâÇÑ ÂÊ¿¡¼­ delete¸¦ ÇØÁÖ¾î¾ß ÇÏ´Â ºÎ´ãÀÌ ÀÖÀ¸¹Ç·Î auto_ptrÀ» Àß È°¿ëÇÏÀÚ.

ÇÏÁö¸¸ ÀÌ·± »ý¼º¹æ¹ýÀ» »ç¿ëÇϸé ÄÚµåÀÇ Áߺ¹µÈ ºÎºÐÀÌ ¸¹¾ÆÁú °ÍÀ̶ó´Â °ÍÀ» ½±°Ô ¾Ë¼öÀÖ´Ù.
±×·¸±â ¶§¹®¿¡ Ä«¿îÆ® ºÎºÐÀ» ÅÛÇø´°ú »ó¼ÓÀ» Ȱ¿ëÇÏ¿© »ý¼ºÇÏ¸é µÈ´Ù.
Ä«¿îÆ® ºÎºÐÀÇ Å¬·¡½º¸¦ ¸¸µé°í ÅÛÇø´ÀÇ Å¸ÀÔÀ» ¹Þ´Â ºÎºÐ¿¡ ¸¸µé°íÀÚ Çϴ Ŭ·¡½º¸¦ ³Ö¾î¼­ private·Î »ó¼ÓÀ» ÇÑ´Ù.
Ä«¿îÆ® º¯¼ö¿Í ÃÖ´ë ¸¸µé°íÀÚ ÇÏ´Â º¯¼öµéÀº Ä«¿îÆ® ºÎºÐ Ŭ·¡½º¿¡ ÀÖÀ¸¹Ç·Î usingÀ» »ç¿ëÇÏ¿ä private»ó¼ÓÀÌÁö¸¸ »ç¿ëÇÑ´Ù´Â °ÍÀ» Ç¥½ÃÇÏ¿©ÁÖ°í
À¯»ç »ý¼ºÀÚ·Î »ç¿ëÇϸé Ä«¿îÆÃ ºÎºÐÀ» ¸ðÀ»¼ö ÀÖ´Ù.

Ç׸ñ 27. Èü(heap)¿¡¸¸ »ý¼ºµÇ°Å³ª Èü¿¡¸¸ ¸¸µé¾îÁöÁö ¾Ê´Â Ư¼öÇÑ Å¬·¡½º¸¦ ¸¸µå´Â ¹æ¹ý

Èü¿µ¿ª¿¡ »ý¼ºÀ» Çϱâ À§Çؼ­´Â ¹Ýµå½Ã new¸¦ ÅëÇÏ¿© »ý¼ºÇÏ¿©¾ß ÇÑ´Ù.
±×·¸±â À§Çؼ­´Â Áö¿ª°´Ã¼¿Í Á¤Àû°´Ã¼ÀÇ »ý¼ºÀ» ¸·¾Æ¾ß Çϴµ¥ °¡Àå ½¬¿î ¹æ¹ýÀº ¼Ò¸êÀÚ¸¦ private³ª protected·Î ¸¸µé¾î ¹ö¸®°í À¯»ç ¼Ò¸êÀÚ¸¦ »ç¿ëÇÑ´Ù.

±ÍÂ÷³ª

Ç׸ñ 28. ½º¸¶Æ® Æ÷ÀÎÅÍ(Smart pointer)

Æ÷ÀÎÅͺ¸´Ù ½º¸¶Æ® Æ÷ÀÎÅͰ¡ ³ªÀºÁ¡.
»ý¼º(construction)°ú ¼Ò¸ê(destruction) ÀÛ¾÷À» Á¶ÀýÇÒ ¼ö ÀÖ´Ù.
º¹»ç(copy)¿Í ´ëÀÔ(assignment) µ¿ÀÛÀ» Á¶ÀýÇÒ ¼ö ÀÖ´Ù.
¿ªÂüÁ¶(dereferencing) µ¿ÀÛÀ» Á¶ÀýÇÒ ¼ö ÀÖ´Ù.

template <class T> class SmartPtr?
{
    public:
      // »ý¼ºÀÚ¿Í º¹»ç »ý¼ºÀÚ¿Í ¼Ò¸êÀÚ
      SmartPtr?(T *realPtr = 0);
      SmartPtr?(const SmartPtr? &rhs);
      ~SmartPtr?();

      // ´ëÀÔ ¿¬»êÀÚ
      SmartPtr? &operator=(const SmartPtr? &rhs);

      // ¿ªÂüÁ¶
      T *operator->() const;
      T &operator*() const;

      // ºñ±³ ¿¬»êÀÚ
      operator void*(); // bool¿¬»êÀÚÀÇ true¿Í ´ëºÎºÐÀÇ ºñ±³ ¿¬»êÀÚ¸¦ Áö¿ø
      bool operator !() const; // bool ¿¬»êÀÚÀÇ false¸¦ Áö¿ø

      // ½º¸¶Æ® Æ÷ÀÎÅÍ °´Ã¼¸¦ Æ÷ÀÎÅÍ·Î º¯È¯
      operator T* ();

      // »ó¼ÓÀÇ °æ¿ì
      template<class newType> operator SmartPtr?<newType>();

    private:
      T *pointee;
};

´ëÀÔÀ̳ª º¹»ç »ý¼ºÀÚÀÇ °æ¿ì ºñÆ® ´ÜÀ§ º¹»ç½Ã µÎ°³ÀÇ Æ÷ÀÎÅͰ¡ »ý±â¸ç ½º¸¶Æ® Æ÷ÀÎÅ͸¦ »èÁ¦½Ã µÎ¹ø »èÁ¦µÇ´Â À§ÇèÇÑ °æ¿ì¿¡ µµ´ÞÇÏ°Ô µÈ´Ù.
±×·¯¹Ç·Î ÇϳªÀÇ ¹æ¹ýÀº ´ëÀÔ°ú °°Àº ¿¬»ê½Ã ¼ÒÀ¯±ÇÀ» ÀÌÀüÇÏ¿© ÁØ´Ù. ´ëÀÔÇÏ´Â °´Ã¼´Â Æ÷ÀÎÅ͸¦ NULL·Î ¸¸µé°í ´ëÀÔ ¹Þ´Â °´Ã¼´Â Æ÷ÀÎÅͰ¡ Àü´ÞµÈ´Ù.

Ç׸ñ 29. ÂüÁ¶ Ä«¿îÆÃ(Reference Counting)


PythonPowered EditText of this page (last modified 2008-11-05 11:01:00)
FindPage by browsing, searching, or an index
Or try one of these actions: DeletePage, DeleteUploadedFile, LikePages, SpellCheck, UploadFile