More Effective C++ ¿ä¾à
ÀÌ·±Ã¥À» ¿ø¼·Î º¸¸é ÁÁÀ»µí Çѵ¥..
½Ã°£»óÀÇ ÀÌÀ¯¿Í ±ÍÂ÷-_-´ÏÁòÀÇ ¹ßµ¿À¸·Î...
¹ø¿ªÀÚºÐÀÌ Effective C++°ú ´Þ¶ó¼ ¾à°£ÀÇ ´À³¦ÀÌ ´Ù¸§.
¹ø¿ªÀº ¹Ý¿ªÀÌ´Ù!! ±âº» °³³äµé
Ç׸ñ 1. Æ÷ÀÎÅÍ(pointer)¿Í ÂüÁ¶ÀÚ(reference)¸¦ ±¸ºÐÇÏÀÚ.
°¡Àå ½±°Ô º¼¼ö ÀÖ´Â Â÷ÀÌÁ¡Àº ¿¬»êÀÚÀÇ Â÷ÀÌ´Ù.
Æ÷ÀÎÅÍÀÇ °æ¿ì *°ú ->À» ¾²°í ÂüÁ¶´Â .À» ¾´´Ù.
°³³ä»óÀÇ Â÷ÀÌÁ¡Àº Æ÷ÀÎÅÍÀÇ °æ¿ì nullÀ» °¡¸£Å³¼ö ÀÖ°í ÂüÁ¶ÀÇ °æ¿ì nullÀ» °¡¸£Å°´Â °ÍÀº ÂüÁ¶¶ó º¼¼ö ¾ø´Ù.
ÀÌ ¶§¹®¿¡ ÂüÁ¶´Â °³³ä»ó nullÀ» °Ë»çÇÒ Çʿ䰡 ¾ø¾î À¯¿ëÇÏ´Ù.
C ¾ð¾î¿¡´Â ÂüÁ¶ÀÇ °³³äÀº »ý·«µÇ¾ú´Âµ¥ C++¿¡ µé¾î¿À¸é¼ Ŭ·¡½º°¡ »ý±â¸é¼ ¸íÈ®ÇÑ °³³äÀ¸·Î ÀÚ¸® ÀâÈùµí ÇÏ´Ù.
|
class Widget { ... }; class SpecialWidget? : public Widget { ... };
...
SpecialWidget? *psw;
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 {
... |
´Ù¸¥ Çϳª´Â ¾Ï½ÃÀû ŸÀÔº¯È¯ ¿¬»êÀÚ(implicit type conversion)ÀÌ´Ù.
|
class Rational {
operator double() const; // Rational ÇüÀ» double ÇüÀ¸·Î ¾Ï½ÃÀûÀ¸·Î ¹Ù²ß´Ï´Ù. |
±×·¸´Ù¸é ¶Ç ´Ù¸¥ ¹æ¹ýÀº ÇÁ·Ï½Ã Ŭ·¡½º(proxy class)¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
C++ÀÇ ±ÔÄ¢¿¡ µÎ¹øÀÇ ¾Ï½ÃÀû ŸÀÔº¯È¯Àº ÀÌ·ç¾î Áú¼ö°¡ ¾ø´Ù´Â ±¸¹®ÀÌ Àֱ⠶§¹®¿¡.
´ÜÀÏ ÀÎÀÚ »ý¼ºÀÚÀÇ °æ¿ì ÀÌ³Ê Å¬·¡½º(inner-class)¸¦ µÎ¾î ÇÁ·Ï½Ã·Î »ç¿ëÇÏ¸é °£´ÜÇÏ°Ô ÇØ°áµÈ´Ù.
|
class UPInt {
const UPInt operator++(int); // ÈÄÀ§ ++ int°ªÀº ¹«!Á¶!°Ç! 0ÀÓ
UPInt& operator--(); // ˟ˤ -- |
³»ºÎÀû ±¸ÇöÀº ¹Ø°ú °°´Ù. C++ °ø½ÄÀûÀÎ ±¸Çö ¹æ¹ý
|
UPInt& UPInt::operator++() // ˟ˤ {
return *this;
const UPInt UPInt::operator(int)
++(*this);
return oldValue; |
È¿À²À» À§Çؼ¶ó¸é ÀüÀ§ ¿¬»êÀÚÀÇ »ç¿ëÀ» ±ÇÇÑ´Ù.
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[]
+ - * / % ^ & | ~ ! = < > += *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> () []
|
string *ps = new string("Memory Management");
¾Æ·¡¿Í °°ÀÌ º¯ÇÑ´Ù.
void *memory = operator new(sizeof(string)); // ¹ÌÃʱâÈµÈ ¸Þ¸ð¸®¸¦ ¹ÝȯÇÑ´Ù. |
¿©±â¼ operator new°¡ ¾²À̴µ¥ ÀÌ ¿¬»êÀÚ´Â ¿À¹ö·ÎµùÀÌ °¡´ÉÇÏ´Ù.
µû¶ó¼ »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ ¸Þ¸ð¸® ¿µ¿ªÀ» ¼³Á¤ÇÏ¿© ±× ºÎºÐÀ» ÇÒ´çÇÏ¿© ÁÙ¼ö Àִµ¥
À̸¦ ¸Þ¸ð¸® ÁöÁ¤ new(Placement new)¶ó°í ºÎ¸¥´Ù.
»ç¿ë¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
|
new (»ç¿ëÀÚ ÁöÁ¤ ¸Þ¸ð¸®)ÇÒ´çÇÒ °´Ã¼(°´Ã¼ÀÇ Å©±â); |
±×¸®°í operator new´Â ´ÙÀ½°ú °°ÀÌ ¿À¹ö·ÎµùÇÑ´Ù.
|
void *operator new(size_t, void *location) {
|
new¿Í ¸¶Âù°¡Áö·Î delete ¿¬»êÀÚµµ ¿ª½Ã À¯»çÇÑ Äڵ带 »ý¼ºÇÑ´Ù.
|
string *ps;
...
delete ps;
¾Æ·¡¿Í °°ÀÌ º¯ÇÑ´Ù.
ps->~string(); // °´Ã¼ÀÇ ¼Ò¸êÀÚ°¡ È£ÃâµÈ´Ù. |
ÀÌ¿Í °°ÀÌ operator new¿Í operator delete´Â C¾ð¾îÀÇ malloc°ú free¿Í À¯»çÇÏ´Ù.
´ÜÁö ¸Þ¸ð¸®¸¦ »ý¼ºÇØÁÙ»Ó ³»ºÎÀûÀÎ »ý¼ºÀÚÀÇ È£ÃâÀº new ¿¬»êÀÚ¿¡ Á¸ÀçÇÑ´Ù.
¶ÇÇÑ ¹è¿ÀÇ °æ¿ìµµ ¸¶Âù°¡ÁöÀÌ´Ù.
´ÜÁö operator new ] ¿Í operator delete [?°¡ È£ÃâµÈ´Ù´Â Á¡¸¸ ´Ù¸£´Ù.
°´Ã¼°¡ ¾Æ´Ñ Æ÷ÀÎÅÍ·Î Á¶ÀÛÇϰí ÀÖÀ»¶§ ¿¹¿Ü°¡ ¹ß»ýÇÑ´Ù¸é ¸®¼Ò½º ´©±¸°¡ ¹ß»ýÇÑ´Ù.
C++Ç¥ÁØ ¶óÀ̺귯¸®Áß auto_ptr Ŭ·¡½º°¡ ÀÖ´Ù. ¿¹¿Ü (Exceptions)
Ç׸ñ 9. ¸®¼Ò½º ´©¼ö¸¦ ÇÇÇÏ´Â ¹æ¹ýÀÇ Á¤°ø(ïáÍô)Àº ¼Ò¸êÀÚÀÌ´Ù.
µ¿Àû ÇÒ´ç ¸®¼Ò½º´Â °´Ã¼·Î Æ÷ÀåÇ϶ó!
ÀÌ·²¶§´Â ½º¸¶Æ® Æ÷ÀÎÅÍ(smart pointer)¿Í °°Àº ¹æ¹ýÀ¸·Î °´Ã¼È ½ÃÄÑÁØ´Ù.
|
template <class T> class auto_ptr {
~auto_ptr() { delete ptr; }
|
|
...
Session::~Session()
{
catch(...) // ÀÌ¿Í °°ÀÌ Â÷¶ó¸® ¾Æ¹«·± 󸮰¡ ¾ø´õ¶óµµ Àý´ë ¼Ò¸êÀÚÀÇ ¿¹¿Ü°¡ ¿ÜºÎ·Î ÀüÆÄµÇ´Â°ÍÀº ¸·¾Æ¾ß ÇÑ´Ù. { } |
|
...
catch(Widget 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)¸¦ ¼±ÅÃÇÏ´Â ¹æ½ÄÀ¸·Î ÁøÇàµÇ´Âµ¥ »óÀ§ ¿¹¿Ü·Î ºÎÅÍ ÇÏÀ§ ¿¹¿Ü·Î À̾îÁö´Â ÄÚµùÀ»
ÇÏÁö ¾Ê¾Æ¾ßÇÑ´Ù.
|
...
class Validation_error:public exception
void someFunction()
if(À¯È¿¼º °Ë»ç°¡ ½ÇÆÐÇßÀ» °æ¿ì)
void doSomething()
{
catch(exception ex) {
... |
¸¶Áö¸·À¸·Î ¼¼¹øÂ°´Â ÂüÁ¶¸¦ ÀÌ¿ëÇÑ °æ¿ìÀε¥ À§ÀÇ ½½¶óÀÌ½Ì ¹®Á¦µµ »ý±âÁö ¾Ê°í °¡Àå C++ Ç¥ÁØ¿¡ ±ÙÁ¢ÇÑ ¿¹¿Üó¸® ¹æ¹ýÀÌ´Ù.
|
void ¿¹¿Ü ¹ß»ý ÇÔ¼ö() {
...
set_unexpected(¿¹¿Ü ¹ß»ý ÇÔ¼ö); |
¸î°¡Áö ¿ä¼Ò·Î ¾Ë¾Æº¸¸é
µ¥ÀÌÅÍ Àбâ¿Í ¾²±â¸¦ ±¸ºÐÇϱâ
³ªÁß!!!!!!!!!!!!! Ç׸ñ30À» ÂüÁ¶
Áö¿¬ ¹æ½ÄÀÇ µ¥ÀÌÅÍ °¡Á®¿À±â(lazy fetching)
¸¸¾à µ¥ÀÌÅͺ£À̽º¿¡¼ Çʵ带 Àоî¿Â´Ù°í °¡Á¤ÇÏ¸é µÎ¹øÂ° Çʵ尡 ¿ì¼± ÇÊ¿äÇÒ°æ¿ì µÎ¹øÂ° Çʵ常 µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ Àоî¿Â´Ù.
Áö¿¬ ¹æ½ÄÀÇ Ç¥Çö½Ä Æò°¡(lazy expression evaluation)
¾ÕÀÇ À̾߱â¿Í ºñ½ÁÇѵ¥ ¸¸¾à µ¥ÀÌÅÍ °è»êµÈ ºÎºÐ¸¸ ÇÊ¿äÇÒ °æ¿ì ºÎºÐ ºÎºÐ¸¸ ÇÊ¿äÇÒ¶§ °è»êÇÏ´Â°Ô À¯¸®ÇÏ´Ù.
Ç׸ñ 15. ¿¹¿Ü 󸮿¡ µå´Â ºñ¿ë¿¡ ´ëÇØ Á¤È®È÷ ÆÄ¾ÇÇÏÀÚ.
Äڵ尡 ¾à°£(5~10%?) »ý¼ºµÈ´Ù°í ÇÑ´Ù. ±×¸®°í ¿¹¿Ü ¹ß»ýÀ¸·Î ÇÔ¼ö°¡ º¹±Íµµ´Â ½Ã°£Àº ÀϹÝÀûÀÎ ½Ã°£º¸´Ù 1000¹è °¡·® ´Ã¾î³´Ù°í ÇÑ´Ù.
ÇÏÁö¸¸ Áß¿äÇÑ Á¡Àº ¿¹¿Ü¶õ ¶æÇÏÁö ¾Ê´Â »óȲÀ̱⠶§¹®¿¡ °ÅÀÇ ÀϾÁö ¾Ê´Â´Ù°í »ý°¢ÇÒ¶§ ÀÌ ½Ã°£¿¡ ºÎ´ãÀ» °¡Áú ÇÊ¿ä´Â ¾ø´Ù.
¸¸¾à ¿¹¿Ü°¡ ¾Æ´Ñ »óȲÀ̶ó¸é ºÎ´ãµÇ´Â ½Ã°£Àº ¾ø´Ù°í ºÁµµ µÇ±â ¶§¹®ÀÌ´Ù. È¿À²(Efficiency)
Ç׸ñ 16. »Ä¼Ó±îÁö ÀØÁö ¸»ÀÚ, 80-20 ¹ýÄ¢!
"ÇÁ·Î±×·¥ ¸®¼Ò½ºÀÇ 80%´Â Àüü ½ÇÇà ÄÚµåÀÇ ¾à 20%¸¸ÀÌ »ç¿ëÇÑ´Ù."
"½ÇÇà ½Ã°£ÀÇ 80%´Â ½ÇÇà ÄÚµåÀÇ ¾à 20%¸¸ÀÌ ¼Ò¸ðÇÑ´Ù." Ç׸ñ 17. È¿À² Çâ»ó¿¡ ÀÖ¾î Áö¿¬ Æò°¡(lazy evaluation)´Â ÃæºÐÈ÷ °í·ÁÇØ º¼ ¸¸ÇÑ´Ù.
´çÀå ÇÊ¿äÇØÁö±â Àü±îÁö´Â ÃÖ´ëÇÑ ½ÇÇà ½Ã°£À» ´ÊÃá´Ù.
ÂüÁ¶ Ä«¿îÆÃ(Reference Counting)
¸¸¾à ¹®ÀÚ¿ µÎ°³¸¦ ÇÕÄ£´Ù¸é º¹»ç°¡ ÀÌ·ç¾îÁö°Ô µÈ´Ù.
ÇÏÁö¸¸ ÃÖ´ëÇÑ ´ÊÃç¼ ¿ì¼± ¹®ÀÚ¿ µÎ°¡Áö¸¦ Æ÷ÀÎÅÍ µîÀ¸·Î À̾îµÎ±â¸¸ ÇÏ¸é ¿ì¼± ´çÀåÀº µÎ ¹®ÀÚ¿ÀÌ ÇÕÃÄÁø°Í°ú °°Àº È¿°ú¸¦ Áö´Ñ´Ù.
¸¸¾à µÎ ¹®ÀÚ¿Áß Çϳª°¡ ¼öÁ¤ÀÌ °¡ÇØ¾ß ÇÑ´Ù¸é ±×Á¦¼¾ß º¹»ç¸¦ ÇØµµ ÃæºÐÇÏ´Ù.
Â÷ÈÄ ³ªÁß¿¡ ÇÊ¿äÇÒ´ë ´Ù¸¥ Çʵ嵵 Àоî¿À´Â ¹æ½ÄÀ¸·Î ÃÖ¼ÒÇÑÀÇ ½Ã°£À¸·Î ¹Ù·Î ´ÙÀ½ ¸í·ÉÀ» ó¸®ÇÒ¼ö ÀÖ´Ù.
ÇØ´ç ¸â¹ö º¯¼öµé¿¡ mutable¸¦ ½á³ÖÀ¸¸é ½±°Ô ±¸Çö°¡´ÉÇÏ´Ù. Ç׸ñ 18. ¿¹»óµÇ´Â °è»ê °á°ú¸¦ ¹Ì¸® ÁغñÇϸé 󸮺ñ¿ëÀ» ±ðÀ» ¼ö ÀÖ´Ù.
À§¿Í´Â Á¶±Ý ´Ù¸¥ ½Ã¼±À¸·Î º¸¸é ¸¸¾à Áߺ¹µÇ¾î ¸¹ÀÌ »ç¿ëµÇ´Â ºÎºÐÀ̶ó¸é À§¿Í´Â ¹Ý´ë·Î ¿ÀÈ÷·Á ¹Ì¸® °è»ê ÇØµÎ´Â°Ô ij½Ã¿Í °°Àº È¿°ú¸¦ ¹Þ¾Æ ÃÑ ½ÇÇà½Ã°£À» ´ÜÃà ½Ãų¼ö ÀÖ´Ù. Ç׸ñ 19. Àӽà °´Ã¼ÀÇ ¿ø·ù(ê«×µ)¸¦ Á¤È®È÷ ÀÌÇØÇÏÀÚ.
Àӽà °´Ã¼´Â ¶æÇÏÁö ¾ÊÀº ¿©·¯°÷¿¡¼ ¾²Àϼöµµ ÀÖ´Ù.
|
size_t countChar(const string &str, char ch);
...
char bufferMAX_STRING_LEN?;
...
countChar(buffer, c); |
»ý°¢Áö ¸øÇÑ Àӽð´Ã¼ »ý¼ºÀ» ÁÖÀÇÇÏÀÚ.
|
inline const Rational operator*(const Rational &lhs, const Rational *rhs) {
|
Ç׸ñ 21. ¿À¹ö·ÎµùÀº ºÒÇÊ¿äÇÑ ¾Ï½ÃÀû ŸÀÔº¯È¯À» ¸·´Â ÇÑ ¹æ¹ýÀÌ´Ù.
|
class UPInt {
UpInt?(int value);
const UPInt operator+(const UPInt &lhs, consst UPInt &rhs);
UPInt upi1, upi2;
...
UPInt upi3 = upi1 + upi2; // ¿À¹ö·ÎµùµÈ +¿¬»êÀÚ°¡ Á¤»ó ÀÛµ¿ |
|
result = a + b + c; // a + bÀÇ °á°ú°ªÀÌ Àӽð´Ã¼ »ý¼º ´Ù½Ã (a + b) + c¿¡ Àӽð´Ã¼ »ý¼º |
|
result = a; result += b; result += c; // ÀüºÎ Àӽð´Ã¼ »ý¼º ºÒÇÊ¿ä |
±×¸®°í ´Üµ¶ ¿¬»êÀÚ¸¦
|
const Rational operator+(const Rational &lhs, const Rational &rhs) {
|
¶ÇÇÑ
|
const T operator+(const T& lhs, const T& rhs) {
|
Ç׸ñ 23. Á¤ ¾È µÇ¸é ´Ù¸¥ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏÀÚ!
¼Óµµ°¡ ºü¸¥ C¶óÀ̺귯¸® ¾à°£Àº ´À¸®Áö¸¸ ŸÀÔ ¾ÈÀü¼º°ú ¿¹¿Ü 󸮵µ °¡´ÉÇÑ C++¶óÀ̺귯¸®
¸ðµç ¶óÀ̺귯¸® ¸¶´Ù ¼³°èÀÚÀÇ »ý°¢ÀÌ ´Ù¸£±â ¶§¹®¿¡ ±¸ÇöÇϱâ Èûµé°Å³ª ½Ã°£ÀÌ ¸¹ÀÌ °É¸±¶§
¶óÀ̺귯¸®¸¦ ã¾Æº¸´Â°Í ¶ÇÇÑ ÁÁÀº ¹æ¹ýÀÌ´Ù. Ç׸ñ 24. °¡»ó ÇÔ¼ö, ´ÙÁß »ó¼Ó, °¡»ó ±âº» Ŭ·¡½º, RTTI¿¡ µé¾î°¡´Â ºñ¿ëÀ» Á¦´ë·Î ÆÄ¾ÇÇÏÀÚ.
°¡»ó ÇÔ¼ö´Â °¡»ó Å×À̺í(virtual table)°ú °¡»ó Å×ÀÌºí Æ÷ÀÎÅÍ(virtual table pointer)·Î ±¸ÇöµÇ¾î ÀÖ´Ù.
°¡»ó Å×À̺íÀº °´Ã¼ ÇÔ¼ö Æ÷ÀÎÅÍÀÇ ¹è¿À̳ª ¸®½ºÆ®µîÀ¸·Î ÀÌ·ç¾î Áö´Âµ¥ °¡»ó ÇÔ¼ö³ª »ó¼Ó ¹ÞÀº Ŭ·¡½º´Â ¹«Á¶°Ç »ý¼ºµÈ´Ù.
ÀÌ °¡»ó Å×À̺íÀº ´ÙÁß »ó¼Ó½Ã¿¡µµ °¡»ó ±âº» Ŭ·¡½º´Â ¹°·Ð RTTI¿¡µµ ¾²ÀδÙ.
RTTIÀÇ °æ¿ì °¡»ó Å×À̺íÀÇ ¾Õ¿¡ ÀÚ½ÅÀÇ ½Äº° Äڵ尡 ÀÖ°í ÀÌ ½Äº°ÄÚµå·Î È®ÀÎÀ» ÇÏ°í ½ÇÇàÀ» ÇÑ´Ù. À¯¿ëÇϰí Àç¹ÌÀÖ´Â ÇÁ·Î±×·¡¹Ö ±â¹ýµé(Techniques)
Ç׸ñ 25. »ý¼ºÀÚ ÇÔ¼ö¿Í ºñ(Þª)¸â¹ö ÇÔ¼ö¸¦ °¡»ó ÇÔ¼öó·³ ¸¸µå´Â ¹æ¹ý
»ý¼ºÀÚ´Â °¡»óÇÔ¼ö·Î ¸¸µé¼ö°¡ ¾ø´Ù.
±×·¯¹Ç·Î »ó¼Ó¹ÞÀº Ŭ·¡½º¿¡¼ °¡»ó ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¹æ½ÄÀ¸·Î °¡»ó »ý¼ºÀÚ(virtual constructor)·Î ¸¸µé¼ö ÀÖ´Ù.
°¡»ó »ý¼ºÀÚÁß¿¡¼ °¡Àå ³Î¸® ¾²ÀÌ´Â ¿¹´Â °¡»ó º¹»ç »ý¼ºÀÚ(virtual copy constructor)ÀÌ´Ù.
|
class NLComponent {
virtual NLComponent * clone() const = 0; // º¹»ç »ý¼ºÀÚ¿¡ ÀÌ ÇÔ¼ö°¡ »ç¿ëµÇ¾îÁø´Ù.
class TextBlock? : public NLComponent
{
|
ÀÌ·± ¹æ¹ýÀ¸·Î ºñ¸â¹ö ÇÔ¼öµµ °¡»ó ÇÔ¼öó·³ µ¿ÀÛÇÏ°Ô ÇÒ¼ö ÀÖ´Ù.
|
class NLComponent {
public:
class TextBlock? : public NLComponent
public:
...
TextBlock? t; |
|
class NLComponent {
public:
class TextBlock? : public NLComponent
public:
ostream &operator<<(ostream &s, const NLComponent&c)
|
|
class FSA {
static FSA *make FSA(const FSA& rhs);
private:
FSA(const FSA& rhs);
FSA *FSA::make FSA()
FSA *FSA::make FSA(const FSA &rhs)
|
ÇÏÁö¸¸ ÀÌ·± »ý¼º¹æ¹ýÀ» »ç¿ëÇϸé ÄÚµåÀÇ Áߺ¹µÈ ºÎºÐÀÌ ¸¹¾ÆÁú °ÍÀ̶ó´Â °ÍÀ» ½±°Ô ¾Ë¼öÀÖ´Ù.
±×·¸±â ¶§¹®¿¡ Ä«¿îÆ® ºÎºÐÀ» ÅÛÇø´°ú »ó¼ÓÀ» Ȱ¿ëÇÏ¿© »ý¼ºÇÏ¸é µÈ´Ù.
Ä«¿îÆ® ºÎºÐÀÇ Å¬·¡½º¸¦ ¸¸µé°í ÅÛÇø´ÀÇ Å¸ÀÔÀ» ¹Þ´Â ºÎºÐ¿¡ ¸¸µé°íÀÚ Çϴ Ŭ·¡½º¸¦ ³Ö¾î¼ private·Î »ó¼ÓÀ» ÇÑ´Ù.
Ä«¿îÆ® º¯¼ö¿Í ÃÖ´ë ¸¸µé°íÀÚ ÇÏ´Â º¯¼öµéÀº Ä«¿îÆ® ºÎºÐ Ŭ·¡½º¿¡ ÀÖÀ¸¹Ç·Î usingÀ» »ç¿ëÇÏ¿ä private»ó¼ÓÀÌÁö¸¸ »ç¿ëÇÑ´Ù´Â °ÍÀ» Ç¥½ÃÇÏ¿©ÁÖ°í
À¯»ç »ý¼ºÀÚ·Î »ç¿ëÇϸé Ä«¿îÆÃ ºÎºÐÀ» ¸ðÀ»¼ö ÀÖ´Ù.
|
template <class T> class SmartPtr? {
SmartPtr?(T *realPtr = 0); SmartPtr?(const SmartPtr? &rhs); ~SmartPtr?();
// ´ëÀÔ ¿¬»êÀÚ
// ¿ªÂüÁ¶
// ºñ±³ ¿¬»êÀÚ
// ½º¸¶Æ® Æ÷ÀÎÅÍ °´Ã¼¸¦ Æ÷ÀÎÅÍ·Î º¯È¯
// »ó¼ÓÀÇ °æ¿ì
|
´ëÀÔÀ̳ª º¹»ç »ý¼ºÀÚÀÇ °æ¿ì ºñÆ® ´ÜÀ§ º¹»ç½Ã µÎ°³ÀÇ Æ÷ÀÎÅͰ¡ »ý±â¸ç ½º¸¶Æ® Æ÷ÀÎÅ͸¦ »èÁ¦½Ã µÎ¹ø »èÁ¦µÇ´Â À§ÇèÇÑ °æ¿ì¿¡ µµ´ÞÇÏ°Ô µÈ´Ù.
±×·¯¹Ç·Î ÇϳªÀÇ ¹æ¹ýÀº ´ëÀÔ°ú °°Àº ¿¬»ê½Ã ¼ÒÀ¯±ÇÀ» ÀÌÀüÇÏ¿© ÁØ´Ù. ´ëÀÔÇÏ´Â °´Ã¼´Â Æ÷ÀÎÅ͸¦ NULL·Î ¸¸µé°í ´ëÀÔ ¹Þ´Â °´Ã¼´Â Æ÷ÀÎÅͰ¡ Àü´ÞµÈ´Ù.