[Áöµð³ÝÄÚ¸®¾Æ]C++¿¡ ´ëÇÑ À̾߱⸦ Áö¸é¿¡ ½Ç¾î ³ª¸£ÀÚ¸é ¸î ¹é ÆäÀÌÁö¿¡ °ÉÃļ ½áµµ ¸ðÀÚ¶ö °ÍÀÌ´Ù. °´Ã¼ ÁöÇâÀû ÇÁ·Î±×·¥ ±â¹ýºÎÅÍ C ¿µ¿ªÀÇ Æ÷ÀÎÅÍ¿¡ À̸£±â ±îÁö ÇÏ°í ½ÍÀº ¸»µµ, ÇÏÁö ¸øÇÒ ¸»µµ ¸¹Àº °ÍÀÌ C++ÀÌ´Ù. °¨È÷ ´©°¡ ¿©·¯ °³ÀÇ ¸Ó¸®¿Í ¼ö½Ê °³ÀÇ ÆÈ´Ù¸®°¡ ´Þ¸° C++À̶õ ±«¹° ¾ð¾î¸¦ ºÒ°ú ¸î ÆäÀÌÁö¿¡ ´ãÀ» ¼ö Àְڴ°¡. C++À» »ç¿ëÇÏ´Â ±× ¸¹Àº ÇÁ·Î±×·¡¸Óµé¸¸ÅÀ̳ª ¸¹Àº À̾߱Ⱑ ´ã±ä °ÍÀÌ C++ÀÏ °ÍÀÌ´Ù. ÇÊÀÚ´Â C++¸¦ °´Ã¼ ÁöÇâÀû °³³äÀÇ ¸î °¡Áö À̽´¸¦ °¡Áö°í À̾߱âÇØ º¼ °ÍÀÌ´Ù.
¸çÄ¥ Àü¿¡ ÇÊÀÚÀÇ ¿©ÀÚ Ä£±¸·ÎºÎÅÍ Å¬·¡½º(Class)¿Í ½ºÆ®·°Ã³(Structure)ÀÇ Â÷ÀÌ¿¡ ´ëÇÑ Áú¹®À» ¹Þ¾Ò´Ù. ÇÊÀÚÀÇ ´ë´äÀº¡®¾î¶² ½ºÆ®·°Ã³¿¡¼¿ä?¡¯¶ó´Â Áú¹® ÇѸ¶µð¿´´Ù. Ŭ·¡½º¿Í ½ºÆ®·°Ã³ÀÇ Â÷ÀÌ´Â ¹«¾ùÀΰ¡?
´Ùµé Àß ¾Ë°í ÀÖ°ÚÁö¸¸ ÀÏ´Ü CÀÇ ½ºÆ®·°Ã³¿Í C++ÀÇ ½ºÆ®·°Ã³´Â ´Ù¸£´Ù. ±×µµ ±×·² °ÍÀÌ C++ÀÇ ½ºÆ®·°Ã³´Â C¿Í´Â ´Ù¸£°Ô Constructor¿Í °°Àº Class AbstractionÀÇ Çʼö ¿ä¼Ò¸¦ Áö¿øÇϸç, ½ºÆ®·°Ã³ ¾È¿¡ ÇÔ¼ö¸¦ ¹ÙÀεù ÇÒ ¼ö ÀÖ´Ù.
±×·³ C++¿¡¼ÀÇ ½ºÆ®·°Ã³¿Í Ŭ·¡½ºÀÇ Â÷ÀÌ´Â ¹«¾ùÀΰ¡. »ç½Ç Â÷À̰¡ ¾ø´Ù. ´ÜÁö ¸â¹ö ¼±¾ð ¶§ Ŭ·¡½ºÀÇ ±âº» °ª(Default)Àº PrivateÀÌ°í ½ºÆ®·°Ã³´Â PublicÀ̶ó´Â °Í ¿Ü¿¡´Â ´Ù¸¥ °ÍÀÌ ¾ø´Ù.
Àû¾îµµ ¾ð¾îÀûÀÎ Ãø¸é¿¡¼´Â ±×·¸´Ù. µ¶ÀÚ ¿©·¯ºÐÀÌ ÇÊÀÚ¶ó¸é °°Àº ÄÄÇ»Å͸¦ Àü°øÇÏ´Â ¿©ÀÚ Ä£±¸¿¡°Ô ´ÜÁö Â÷À̰¡ ¾ø´Ù°í ´ë´äÇϰڴ°¡? ¹°·Ð ¾Æ´Ï´Ù°¡ Á¤´äÀÏ °ÍÀÌ´Ù.
¸¶Âù°¡Áö ÀÌÀ¯¿¡¼ C++ÀÇ ÃÖÀûÈ¿¡¼´Â Æ÷ÀÎÅÍÀÇ ÀÌ¿ë, ÄÚµå »çÀÌÁî µî ¾ð¾î ÀÌ¿ëÀûÀÎ Ãø¸é¸¸À» °í·Á ÇÒ ¼ö ¾ø´Ù. ¿Ö? OOP¸¦ ´Ù·ç´Â ¾ð¾î´Â Àû¾îµµ OOP¿¡ ¸Â°Ô ¾²´Â °ÍÀÌ °¡Àå Å« ºñÁßÀ» °¡Áö¸ç ¾ð¾î´Â °´Ã¼ÁöÇâÀû ÆÐ·¯´ÙÀÓÀ» ±¸ÇöÇÏ´Â ÇϳªÀÇ µµ±¸¿¡ ºÒ°ú Çϱ⠶§¹®ÀÌ´Ù. ¿©±â¿¡¼´Â ¹Ù·Î ±×·± °üÁ¡¿¡¼ C++À» »ìÆìº¼ °ÍÀÌ´Ù.
 | C++ ÇÁ·Î±×·¡¸Ó VS C ÇÁ·Î±×·¡¸Ó
|  |
´ÙÀ½ Áú¹®¿¡ ´ëÇØ »ý°¢ÇØ º¸ÀÚ.¡® C·Î ±¸ÇöÇÏ´Â °´Ã¼ ÁöÇâÀº ºÒ°¡´ÉÇѰ¡?¡¯Àá½Ã Ã¥À» µ¤°í »ý°¢ÇÑ µÚ¿¡ ´ÙÀ½ ±ÛÀ» Àо ±¦Âú´Ù. ¿ì¸®´Â °³¹ßÀÚ¿Í ¼úÀÚ¸®¿¡¼ ÀÌ·± ÈÁ¦¸¦ °¡Áö°í ¹ã »õ¿ö °¡¸ç ¸ñ¿¡ Çʹ븦 ¼¼¿ì´Â ÀÏÀÌ Çã´ÙÇÏ´Ù. C·Î C++ó·³ °´Ã¼ ÁöÇâÀû °³¹ßÀ» ÇÏ´Â °ÍÀº ºÒ°¡´É ÇѰ¡?
¹°·Ð È·ÁÇÑ OOP´Â ¾î·Æ°ÚÁö¸¸ Àß ±¸Á¶ÈµÈ C¹®¹ýÀ¸·Îµµ ÃæºÐÈ÷ Ç¥Çö °¡´ÉÇÏ´Ù. »óÀ§ ¿µ¿ªÀÇ Object C·Î Á¦ÀÛÇÏ´Â GTK+ °°Àº °÷¿¡¼ C++°ú À¯»çÇÑ Ãß»óȸ¦ °¡Áø ¾ÆÅ°ÅØÃ³¸¦ ½±°Ô ¸¸³¯ ¼ö ÀÖ´Ù. ¶ÇÇÑ CÀÇ ÀüÇüÀûÀÎ ¿µ¿ªÀÎ ÀÓº£µðµå ¼ÒÇÁÆ®¿þ¾î¿¡¼µµ ±¸Á¶Ã¼¿Í ÇÔ¼ö Æ÷ÀÎÅ͵éÀ» ÀÌ¿ëÇÏ¿© C++À» Èä³» ³½ Ãß»óÈ ÄÚµåµéÀ» °£È¤ °æÇèÇÒ ¼öÀÖ´Ù.
½ºÆ®¶ó¿ì½ºÆ®·´ÀÌ C++À» ¸¸µé±â ½ÃÀÛÇÒ ¶§¿¡µµ¡®C with data abstraction¡¯¶ó´Â ÇÁ·ÎÅäŸÀÔ ¾ð¾î·ÎºÎÅÍ ½ÃÀÛ µÇ¾ú´ø ¸¸Å C¿Í C++ ¾ð¾îÀÇ ¿µ¿ª Â÷ÀÌ´Â ¾Ö¸ÅÇÏ´Ù. ÀÌ·¯ÇÑ ¾ð¾î¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¡¸Óµµ ±× Â÷À̸¦ ¸íÈ®È÷ ±¸ºÐÇϱ⠾î·Á¿ï ¼ö¹Û¿¡ ¾ø´Ù.
C++Àº CÀÇ ºÒÆíÇÑ Á¡À» º¸¿ÏÇØÁÖ´Â ¾ð¾îµµ ¾Æ´Ï¸ç Cº¸´Ù Á» ´õ °í±Þ ±â¼úÀ» ±¸»çÇÏ´Â µµ±¸µµ ¾Æ´Ï´Ù. ´õ¿íÀÌ Çö¾÷¿¡¼ ¸ðµç ¹®Á¦¸¦ Çѹ濡 ÇØ°á ÇØÁÖ´Â Àº źȯ(Silver bullet) °°Àº Á¸Àç´Â ´õ ´õ¿í ¾Æ´Ï´Ù.
±×·³¿¡µµ ºÒ±¸ÇÏ°í ¿ì¸®´Â ¿Ö C++À» »ç¿ëÇØ¾ß Çϴ°¡? ±×°ÍÀº ¹®Á¦ ÇØ°á¹ýÀÌ C¿Í´Â ÆÇÀÌÇÏ°Ô ´Ù¸£±â ¶§¹®ÀÌ´Ù. À̰ÍÀº C¿Í C++ÀÇ ¾ð¾îÇÐÀû ¹®Á¦¸¦ ¹þ¾î³´Ù. C ÇÁ·Î±×·¡¸Ó¿Í C++ ÇÁ·Î±×·¡¸ÓÀÇ Â÷ÀÌ´Â ¾î¶² ¾ð¾î¸¦ »ç¿ëÇϴ°¡°¡ ¾Æ´Ï¶ó ¾î¶°ÇÑ °üÁ¡¿¡¼ ¹®Á¦¸¦ ÇØ°á ÇÏ´Â °¡ÀÌ´Ù.
¾Æ¹«·¡µµ Çϵå¿þ¾î °³¹ßÀÚµéÀÌ ÁÖ·ù¸¦ ÀÌ·ç´Â ÇÊÀÚÀÇ Çö¾÷¿¡¼´Â °¡²û °³¹ß µµÁß¿¡ C¾ð¾î¸¦ ÀÚÀ¯ÀÚÁ¦·Î ±¸ÇöÇÏ´Â °³¹ßÀÚ°¡ ¡®C++ ±×°Å ÇÏ·ç¸é Çϴµ¥ ¹»?¡¯À̶ó´Â ¾ê±â¸¦ µéÀ» ¶§ ¸¶´Ù ¸¶À½ÀÌ ¾ÆÇÁ´Ù. C++À» ÇÏ·ç(?) ¸¸¿¡ ÇÏ¿´´Ù¸é Ŭ·¡½º¸¦ ¾²Áö ¸»°í Àß ±¸Á¶È µÈ C¸¦ ¾²¸é µÈ´Ù.
±¸Á¶Ã¼¿¡ °¢ ¸Þ¼Òµå°¡ µÉ ÇÔ¼ö Æ÷ÀÎÅ͵éÀ» ¼±¾ðÇÏ°í »ý¼ºÀÚ°¡ µÉ ¸â¹ö º¯¼ö¸¦ ³Ö¾î ÀÌ ÇÔ¼ö Æ÷ÀÎÅ͵éÀ» ÃʱâÈ ÇØÁÖ°í ³ª¼ Àü¿ª¿¡ Á¸Àç ÇÏ´Â new¶ó´Â ÇÔ¼ö¸¦ ¸¸µç´Ù. ´Ù½Ã ÀÌ ÇÔ¼ö°¡ °¢°¢ÀÇ ±¸Á¶Ã¼¸¦ ÇÒ´ç ¹Þ°Ô ÇÏ¸é ±×·± À̾߱⸦ ÇÏ´Â °³¹ßÀÚµéÀÌ »ç¿ëÇϴ Ŭ·¡½º¸¦ Èä³» ³½ C¸¦ ½±°Ô ¸¸µé ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 1> Class¸¦ Èä³» ³½ CÄÚµå | | | |
// ¼ø¼ö C ÆÄÀÏÀÌ´Ù. .
typedef struct _CLASS_MEMORY {
longlong address; // ¸Þ¸ð¸®ÀÇ ½ÇÁ¦ ÁÖ¼Ò ¹øÁö¸¦ ÀúÀåÇÒ
COMMAND command; // È£½ºÆ®ÀÇ Ä¿¸àµå
longlong register; // MEMORY MAPPED IO
void (*SetRegiter)(longlong reg);
// ¼Ó¼ºÀ» ¼³Á¤ÇÏ´Â ¸â¹ö·Î »ç¿ëÇÒ ÇÔ¼ö Æ÷ÀÎÅÍÀÌ´Ù
void (*SetCommand)(COMMAND cmd);
// Ä¿¸àÆ®¸¦ ÄÁÆ®·Ñ ÇÒ ÇÔ¼ö Æ÷ÀÎÅÍ
void (*CMemory)();
// ´Ù¸¥ ÇÔ¼ö Æ÷ÀÎÅ͵éÀ» ÃʱâÈ Çϰí ÇϳªÀÇ Ã»Å©·Î ¸¸µé¾îÁÙ
} CMemory;
void * new(CLASS_TYPE type); // Àü¿ª »ý¼ºÀÚ
| |
 |
¹°·Ð Ãß»óÈ ÇÒ ¼ö ÀÖ´Â ¹üÀ§°¡ Á¦ÇÑÀûÀÌ°í ºÒÇÊ¿äÇÑ Äڵ尡 µé·¯ºÙ±â´Â ÇÏÁö¸¸ ºÐ¸í Ŭ·¡½º¿Í À¯»çÇÑ ÇൿÀ» Çϵµ·Ï ó¸® ÇÒ¼ö ÀÖ´Ù. ƯÈ÷ ¾Õ¼ ¼Ò°³ÇÑ GTK+À̳ª brewµîÀÇ Äڵ带 º¸¸é ÀÌ·¯ÇÑ ±â¹ýµéÀº ºó¹øÇÏ°Ô Àû¿ë µÇ¾î ÀÖ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
CÀÇ ±¸Á¶Ã¼¿Í´Â ´Ù¸£°Ô C++¿¡¼´Â °¡»ó ÇÔ¼ö Å×À̺íÀ» °¢ Ŭ·¡½º ¸¶´Ù °¡Áø´Ù. ÀÌ·¯ÇÑ °ÍµéÀ» ÀÌ¿ëÇÑ °´Ã¼ ÁöÇâÀûÀÎ ±â¹ýÀÎ C++¿¡¼ ´ÙÇü¼º(Ploymorphism), µ¿Àû ¹ÙÀεù(Dynamic binding), Ŭ·¡½º »ó¼Ó(Inheritance)À» »«´Ù¸é ±×°ÍÀº ½ºÆ®·°Ã³¿Í °°ÀÌ ¹ß¶ó³½ ÀÚ·á Ãß»óÈ °üÁ¡ÀÇ C++¿¡ ºÒ°ú ÇÏ´Ù. ´Ù½Ã Á¤¸®ÇÏÀÚ¸é, C++Àº ´ÜÁö OOP ÆÐ·¯´ÙÀÓÀ» ±¸Çö ÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â ¾ð¾îÀûÀÎ µµ±¸ ÀÏ»ÓÀÌÁö C++±× ÀÚü°¡ ÀÇ¹Ì ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù.
 | ½Ã½ºÅÛ ÇØ¼®ÇÐÀû °üÁ¡¿¡¼ º» C¿Í C++ÀÇ Â÷ÀÌ
|  |
°´Ã¼ ÁöÇâÀû ¹®Á¦ ÇØ°á¹ý¿¡ µé¾î°¡±â Àü¿¡ ½Ã½ºÅÛ ÇØ¼®ÇÐÀû °üÁ¡¿¡¼ À̸¦ °üÂû ÇØº¸ÀÚ. C·Î ±¸ÇöµÈ ÇÔ¼ö ¸ðµâ°ú C++·Î ±¸ÇöµÈ ÇÔ¼ö ¸ðµâÀº ¾î¶² Â÷À̸¦ °¡Áú±î? ¿ì¸®´Â <±×¸² 1>, <±×¸²2>¿Í °°Àº ºí·Ï °³³äÀÇ ´ÙÀ̾î±×·¥À» »ý°¢Çغ¼ ¼ö ÀÖ´Ù.
 |
| <±×¸² 1> C °üÁ¡ÀÇ ½Ã½ºÅÛ |
 |
| <±×¸² 2> C++ °üÁ¡ÀÇ ½Ã½ºÅÛ |
¾î¶² Â÷À̸¦ º¼ ¼ö Àִ°¡? CÀÇ °üÁ¡¿¡¼´Â °¢°¢ÀÇ µ¥ÀÌÅ͵éÀÌ ³ëµå¸¦ ÀÌ·ç°í À̰͵éÀÌ ´Ù¸¥ »óÅÂÀÇ µ¥ÀÌÅÍ·Î À̵¿ÇÒ ¶§ ¸µÅ©¸¦ ÇÔ¼ö·Î ¸¸µé°í ÀÖ´Ù. ÇÏÁö¸¸ C++°üÁ¡¿¡¼ º¸¸é, Ŭ·¡½º¶ó´Â Ãß»óÈ °üÁ¡ÀÇ ¸ðµâÀÌ ³ëµå¸¦ ÀÌ·ç°í °¢°¢ÀÇ °ü°è°¡ ¸µÅ©¸¦ ÀÌ·ç°Ô µÈ´Ù. ÀÌ µÑÀº Å« Â÷À̸¦ °¡Á® ¿Â´Ù.
ÈçÈ÷ ½Ã½ºÅÛÀÇ º¹Àâµµ¸¦ ³íÇÏ´Â µÎ °¡Áö Áß Çϳª´Â ½Ã½ºÅÛÀ» ±¸¼ºÇÏ´Â ÄÄÆ÷³ÍÆ® ¼öÀÌ°í ´Ù¸¥ Çϳª´Â ±× ±¸¼º¿øÀ» ¿¬°áÇÏ´Â ¸µÅ©ÀÇ ¼öÀÌ´Ù.
ÄÄÆ÷³ÍÆ®ÀÇ ¼ö´Â n°³·Î »ó¼ö¿¡ ºñ·ÊÇÏ¿© Áõ°¡ÇÏÁö¸¸ ÀÌ ÄÄÆ÷³ÍÆ®¸¦ ¿¬°áÇÏ´Â ¸µÅ©ÀÎ ÇÔ¼öµéÀº n°³¿¡¼ 2°³¸¦ ¼±ÅÃÇÏ´Â Á¶ÇÕ°ú °°À¸¹Ç·Î n(n-1)/2 ¿Í °°´Ù. ÀÌ º¹Àâµµ´Â O(n2)À¸·Î ½Ã½ºÅÛÀÌ Ä¿Áú¼ö·Ï ¾Ë°í¸®ÁòÀÇ º¹Àâµµ¸¦ Á¦¾îÇϱâ Èûµé¾î Áø´Ù.
»ç½Ç C¾ð¾î·Î ÀÛ¼ºÇϵç C++·Î ÀÛ¼ºÇÏµç °á±¹ ÄÄÆÄÀÏ ÇÏ°í ³ª¸é ±â´É°ú µ¥ÀÌÅ͸¸ Á¸Àç ÇÏ´Â ¹ÙÀ̳ʸ® ÆÄÀÏ¿¡ ºÒ°úÇÏ´Ù. ÀÌ·¯ÇÑ º¹Àâµµ Á¦¾î´Â C¿Í C++ ÆÐ·¯´ÙÀÓÀÇ Àû¿ëÀÌ ½Ã½ºÅÛ ÇØ¼®ÇÐÀû ÀÔÀå¿¡¼ ºÃÀ»¶§ ¾ó¸¶³ª º¹ÀâÇØÁö´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Ù.
 | °´Ã¼ÁöÇâ ¹®Á¦ ÇØ°á¹ý
|  |
°´Ã¼ÁöÇâ(Object Oriented)ÀÇ ¹®Á¦ ÇØ°á¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸±â¿¡ ¾Õ¼ ´ÙÀ½ÀÇ ÇÔ¼ö¸¦ Àá½Ã »ìÆìº¸ÀÚ.
inline int square(int a) { return a *= a; }
inline float square(float a) { return a *= a; }
¹°·Ð ÀÌ ÇÔ¼ö¸¦ º¸¸é¼ TemplateÀ» ÅëÇÑ ±¸ÇöÀ» »ý°¢ Çϰųª Function pointer¸¦ »ç¿ëÇÑ Generic FunctionÀ» »ý°¢ ÇÒ ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ ÇÊÀÚ°¡ À̾߱â ÇÏ·Á´Â °ÍÀº Á¶±Ý ´Ù¸¥ À̾߱â´Ù. square ÇÔ¼öÀÇ Á¤ÀÇ¿ª(Domain)°ú Ä¡¿ª(Range)Àº ¹«¾ùÀΰ¡? Á¤ÀÇ¿ªÀº Integer³ª floatÇüÀÇ ¼ýÀÚÀ̰í Ä¡¿ªµµ ¸¶Âù°¡Áö·Î ¼ýÀÚÀÌ´Ù.
static int factorial(int i)
{
if (i<2) return 1;
return i*factorial(i-1);
}
ÀÌ ÆÑÅ丮¾ó Äڵ忡¼ÀÇ °ø¸®(Axiom)´Â ¹«¾ù Àΰ¡. If (i<2) return 1; Âë µÉ °ÍÀÌ´Ù. ¿ì¸®´Â ÈçÈ÷ C¾ð¾î¸¦ ¶óÀÌÇÁ ´ÏÂî°¡ Á¤ÀÇÇÑ ¼öÇÐÀÇ ÇÔ¼ö¸¦ ¸ð¹æÇϰí ÀÖ´Ù°í »ý°¢ÇÒ ¼ö ÀÖ´Ù.
ÇÁ·Î½ÃÁ®(Procedure)¶ó´Â À̸§À¸·Î ÇÔ¼ö¿Í´Â ´Þ¸® ÇÁ·Î¼¼½º Áß½ÉÀÇ »óÅ º¯È¸¦ ³ªÅ¸³»´Â ÇÔ¼öµéµµ Á¸ÀçÇÏÁö¸¸ ±× ¶ÇÇÑ Ä¡¿ªÀÌ voidÀÎ ÇÔ¼öÀÏ »ÓÀÌ´Ù. ¼öÇп¡¼ 1:1, n:1, n:nÀº ÇÔ¼ö¿¡ µé¾î°¡´õ¶óµµ1:nÀº ÇÔ¼ö°¡ ¾Æ´Ï´Ù. ¿©·¯ºÐÀÇ ÄÚµå Áß¿¡ int float double Squre(int a)¶ó´Â ÇÔ¼ö°¡ ¾ø´Â °Í°ú ¸¶Âù°¡Áö´Ù.
±×·¸´Ù¸é ¼ÒÇÁÆ®¿þ¾î¸¦ °³¹ßÇÑ´Ù´Â °ÍÀº º»ÁúÀûÀ¸·Î ¾î¶² Àǹ̸¦ °¡Áö´Â°¡? ½ÇÁ¦ ¼¼°èÀÇ Á¤º¸³ª Çö»óµé Áß °ü½É Àְųª ±¸ÇöµÇ¾î¾ß ÇÏ´Â ºÎºÐ¸¸À» ½Ã½ºÅÛÀ¸·Î ¿Å±â´Â ½Ã¹Ä·¹À̼ÇÀÌ °¡Àå Å«Àǹ̸¦ °¡Áú °ÍÀÌ´Ù. ¼öÇÐ ¶ÇÇÑ ½Ç¼¼°è¸¦ ¸ÅÇÎÇÏ´Â °ÍÀÇ ÀÏÁ¾ÀÎ ¾ð¾î¶ó°í º¼ ¼ö ÀÖÀ¸´Ï ¸»ÀÌ´Ù. ´Ù¸¸ ¼öÇÐÀ¸·Î Áõ¸íµÇÁö ¾Ê´Â °ÍÀÌ ¾ó¸¶³ª ¸¹Àº°¡?
¿ì¸®´Â À©µµ¿ì¿¡¼ »ç¿ëÀÚ°¡ Ŭ¸¯Çϰí ÀÔ·ÂÇÏ´Â °ÍÀ» Á¤ÀÇ¿ª(Domain)À¸·Î, ȸéÀÇ Ãâ·Â ³»¿ëÀ» Ä¡¿ªÀ¸·Î ºÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ »ç¿ëÀÚÀÇ ¿òÁ÷ÀÓÀ» ¼öÇÐÀûÀÎ ÇÔ¼ö·Î¸¸(¼öÇÐÀûÀ¸·Î Áõ¸íµÇ´Â »ç½Çº¸´Ù Áõ¸íÇÏÁö ¸øÇÏ´Â »ç½ÇÀÌ ÈξÀ ¸¹´Ù) Á¤ÀÇÇϱ⿡´Â ¹èº¸´Ù ¹è²ÅÀÌ ´õ Å« °Íó·³ ¿À¹öÇìµå°¡ µé¸ç, ÀÌ·¯ÇÑ ÇൿµéÀ» ¼öÇÐÀû Áõ¸íÀ¸·Î Ç¥ÇöÇϱ⿡´Â ¹«¸®°¡ ÀÖ´Ù.
¿ì¸®´Â ÀÌ °°Àº ½Ç¼¼°è¸¦ ÄÄÇ»ÅÍ ³»ºÎ·Î ¹Ý¿µÇϱâ À§ÇÏ¿© °¢°¢ÀÇ °³Ã¼µéÀ» Ŭ·¡½ºÀÇ ¼Ó¼º(Attribute)°ú Çൿ(Method)µé·Î Á¤ÀÇÇϰí À̵éÀÇ °ü°è¸¦ ÅëÇØ Á» ´õ Æí¸®ÇÏ°Ô ½Ç¼¼°è¸¦ Ãß»óÈ ÇÏ°í º¹»ç ¹Ý¿µÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
Ưº°ÇÑ ¼öÇÐÀû Áõ¸í ¾øÀ̵µ ¿ì¸® ´«À¸·Î º¸°í ´À³¤ °ÍÀ» Ãß»óÈ¿¡ ÀÌ¿ëÇÒ ¼ö ÀÖ°í ±×·¯ÇÑ Ãß»óÈ ´ÜÀ§µéÀÌ ¿«¾îÁ®¼ ÇϳªÀÇ ÇÁ·Î±×·¥ÀÌ µÈ´Ù. ±× ´ö¿¡ Á» ´õ ¸¹Àº ºÐ¾ßÀÇ »ç¶÷µéÀÌ ÇÁ·Î±×·¥À̶ó´Â °ÍÀ» ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ÀÌ·¯ÇÑ °´Ã¼ ÁöÇâÀû ¹®Á¦ ÇØ°á¹ý¿¡¼ Áß¿äÇÑ °ÍÀº °³Ã¼µéÀÇ µ¿µîÇÔÀÌ´Ù.
¿ì¸®´Â °£È¤ Äڵ忡¼ Àü¿ª º¯¼ö³ª Àü¿ª ÇÔ¼ö µîÀ» º¸°Ô µÈ´Ù. ÀÌ·¯ÇÑ °³Ã¼µéÀº Ŭ·¡½º·Î ±¸ÇöµÈ ³»¿ëµé°ú µ¿µîÇѰ¡? Ŭ·¡½ºÀÇ ¼Ó¼º°ú ÇൿÀº ±× Ŭ·¡½º ¾È¿¡ Á¾¼ÓÀûÀÌ´Ù. »ý°¢Çغ¸¸é ´ç¿¬ÇÑ °ÍÀÌ´Ù. »ç¶÷À̶ó´Â Ŭ·¡½º¸¦ Á¦ÀÛÇÒ ¶§ »ç¶÷ÀÌ ¸Ô°í ÀÔ°í ÀÜ´Ù´Â Çൿ°ú, ³»ºÎÀûÀ¸·Î »ý°¢, »ç°í, ¼ºº° µîÀ» °¡Áö´Â °ÍÀº »ç¶÷¿¡°Ô¸¸ Á¾¼ÓÀûÀÎ °ÍÀÌ´Ù.
ÀÌ·¯ÇÑ ÇൿµéÀÌ ´Ù¸¥ ¿©Å¸ µ¿¹°, »ç¹° µîÀÇ Çൿµé°ú ¿«ÀÌ¸é¼ »óŰ¡ º¯ÈÇÏ´Â °ÍÀε¥, ¾Õ¿¡¼ ¸»ÇÑ Àü¿ª º¯¼ö³ª Àü¿ª ÇÔ¼ö¸¦ »ìÆìº¸¶ó. ÀÌ µÑÀº Á˾ÇÀÎ ÄÚµåÀÌ´Ù(¹°·Ð Çö¾÷¿¡¼ ÀÌ·¯ÇÑ Äڵ带 ³²¹ß Çϱ⵵ ÇÑ´Ù).
¸ðµÎ Ŭ·¡½º°¡ µ¿µîÇѵ¥ ÀÌ µÑ¸¸ ½Å()ÀÎ °ÍÀÌ´Ù. ¾îµðµçÁö Á¸Àç ÇÒ ¼ö ÀÖ°í ¾î¶² »ç¹°À̵çÁö º¯È½Ãų ¼ö ÀÖ´Â ÀÌ·¯ÇÑ Àü¿ªÇÔ¼ö¿Í º¯¼öµéÀº ¸ðµÎ Á¦°ÅµÇ¾î¾ß Çϴ°ÍÀÌ´Ù.
±×·¸´Ù¸é °´Ã¼ ÁöÇâÀû ¾ð¾î¿¡¼ÀÇ ½ºÆ®·°Ã³´Â ¾î¶³±î? OOP ¾ð¾î¿¡¼ ½ºÆ®·°Ã³¶ó´Â °ÍÀÌ ÇÊ¿äÇѰ¡¿¡ ´ëÇÑ Áú¹®À» ÇØ º¼ ¼ö ÀÖ´Ù. °´Ã¼ ÁöÇâÀû ¾ð¾îÀÇ ±¸¼ºÀÌ ¸ðµÎ °´Ã¼¶ó¸é ½ºÆ®·°Ã³´Â ÀÚ·á Ãß»óÈ¿¡ ÇÊ¿ä ¾ø´Â °ÍÀÌ ´ç¿¬ÇÏ´Ù.
ÇÊÀÚ°¡ ¸»ÇϰíÀÚ ÇÏ´Â °ÍÀº C++¾ð¾î·Î »ç¿ëµÇ´Â °÷¿¡ ¸ðµç ±¸¼º ¿øÀÚ¿Í ºÐÀÚµéÀº Ŭ·¡½º·Î ÀÌ·ç¾îÁ®¾ß ÇÏ°í ¸ðµÎ ÄÚµå »ó¿¡¼ ÆòµîÇÑ À§Ä¡¿¡ ÀÖ¾î¾ßÇÑ´Ù´Â Á¡ÀÌ´Ù.
ÇÊÀÚ¿Í Ä£ºÐÀÌ ÀÖ´Â ÇÑ ±³¼ö´ÔÀÇ ÀÇ·Ú·Î Çлý ½ÃÀý¿¡´Â ȸ»çÀÇ Code Wizard¶ó´Â ÇÁ·ÎÁ§Æ®ÀÇ ¿ÜÁÖ¸¦ ¸ÃÀº ÀûÀÌ ÀÌ ÇÁ·ÎÁ§Æ®ÀÇ ¿ä±¸ »çÇ×Àº C Äڵ带 ¶â¾î ºÙÀÌ´Â ½ÄÀÇ ÄÞÆ÷³ÍÆ®·Î ¾î¸°¾ÆÀ̵éÀÌ ½±°Ô Äڵ带 »ý¼ºÇÏ´Â ÀÏÁ¾ÀÇ ÅøÀ» ¸¸µé¾î´Â °ÍÀ̾ú´Ù. <ȸé 1>Àº ±× ÇÁ·Î±×·¥ÀÇ ½ÇÇàȸéÀÌ´Ù.
 |
| <ȸé 1> Component ±â¹ÝÀÇ Code Wizard |
ÀÌ·¯ÇÑ ¸ð½À¿¡¼ ÁÂÃø Äڵ带 ±¸ÇöÇÏ°Ô µÇ´Â ÄÄÆ÷³ÍÆ®µéÀÇ ±¸ÇöÀ» Àá½Ã »ý°¢Çغ¸ÀÚ. ÁÂÃø ÄÄÆ÷³ÍÆ®µéÀº ÀÚÀ¯ÀÚÀç·Î ¶â¾î ºÙÀÏ ¼ö ÀÖ¾î¾ß Çϱ⿡ À©µµ¿ìÀÇ ´ÙÀ̾ó·Î±×·ÎºÎÅÍ »ó¼Ó ¹Þ¾Æ ±¸ÇöÇÏ¸é µÉ °ÍÀÌ´Ù. ÄÚµù¿¡ µé¾î°¡±â Àü¿¡ ¿©·¯ºÐÀÌ »ý°¢ÇÒ °ÍÀº Ŭ·¡½º °£ÀÇ ´ÙÀ̾î±×·¥ÀÌ´Ù.
ÀÌ ÇÁ·Î±×·¥ÀÇ ÇÁ·¹ÀÓ¿öÅ©¸¦ Á¦ÀÛÇß´ø ÇÊÀÚÀÇ ÈĹè´Â ´ÙÀ̾ó·Î±×·ÎºÎÅÍ »ó¼Ó ¹Þ¾Æ °¢°¢ÀÇ If Ŭ·¡½º else Ŭ·¡½º µîÀ» ¸¸µé¾î ³»°í, ±×°ÍµéÀ» °ü¸®ÇÏ´Â ¸®½ºÆ®¸¦ Á¦ÀÛÇÏ¿´´Ù. Áö±Ý µ¶ÀÚ°¡ ±ÛÀ» ÀÐÀ¸¸é¼ ¹º°¡ À߸øµÈ °ÍÀ» ´À³¢Áö ¸øÇÑ µ¶ÀÚ°¡ ÀÖ´Ù¸é C++À» Á¦´ë·Î »ç¿ëÇÏÁö ¸øÇϰí ÀÖ´Â °ÍÀÌ´Ù.
»ó¼ÓÀ̶ó´Â °³³äÀº µé¾î°¬Áö¸¸ »ý°¢Çغ¸¸é ¸ðµç ÄÄÆ÷³ÍÆ®µéÀÌ À¯»çÇÑ ¼Ó¼ºÀ» ¶ç°Ô µÈ´Ù. ÀÌ·¯ÇÑ ÄÄÆ÷³ÍÆ®µéÀÇ »óÀ§¿¡ ÀÎÅÍÆäÀ̽º µÉ Ãß»óÈ Å¬·¡½º°¡ Á¸Àç ÇÑ´Ù¸é ´ÙÇü¼ºÀ» ÅëÇØ¼ ¸ðµÎ ÇϳªÀÇ ¸®½ºÆ®·Î °ü¸®ÇÒ ¼ö ÀÖ´Ù.
¶Ç, ÇÁ·ÎÁ§Æ®°¡ Á¡Â÷ È®ÀåµÊ¿¡ µû¶ó ÇϳªÀÇ º¯°æ »çÇ×À» °íÄ¡±â À§ÇØ ¸ðµç Ŭ·¡½º¸¦ ¼öÁ¤ÇÒ ÇÊ¿ä¾øÀÌ »óÀ§ ÀÎÅÍÆäÀ̽º°¡ µÇ´Â Ŭ·¡½º¸¸ ¼öÁ¤ÇÏ¸é µÈ´Ù. º°°Í ¾Æ´Ñ °Í °°Àº ÀÌ·± ¼³°è¿¡¼µµ ¿ì¸®´Â ¸·¿¬ÇÏ°Ô OOPÀÇ C++¾ð¾î¸¦ ´ÜÁö °£´ÜÇÑ ÀÚ·á Ãß»óÈÀÇ µµ±¸·Î »ç¿ëÇϰí ÀÖ´Â °ÍÀÌ ¾Æ´ÑÁö¸¦ »ìÆìº¸¾Æ¾ß ÇÑ´Ù.
´ç½ÅÀÌ C++ °³¹ßÀÚ¶ó¸é Áö±Ý ´ç½ÅÀÇ ÄÚµéÀ» ¿¾îº¸¶ó. ±× Äڵ忡¼ ´ÙÇü¼º(Ploymorphism), µ¿Àû ¹ÙÀεù(Dynamic binding), Ŭ·¡½º »ó¼Ó(Inheritance)ÀÌ ³ª¿À´ÂÁö¸¦ È®ÀÎÇØº¸¶ó.
¿©·¯ºÐÀÌ Á¦ÀÛÇÑ Å¬·¡½º°¡ 10°³°¡ ³Ñ¾î°¡°í ÇÑ Å¬·¡½º ¾È¿¡ ¸Þ¼µå°¡ 15°³ ÀÌ»ó ³Ñ¾î°¡´Â ÄÚµå(¼öÄ¡´Â Ưº°ÇÑ Àǹ̴ ¾ø´Ù. ´ÜÁö ÇÁ·ÎÁ§Æ®ÀÇ Å©±â¿¡ ´ëÇÑ ¸·¿¬ÇÑ Á¤ÀǸ¦ ÇÒ »ÓÀÌ´Ù)¿¡¼ ´ÙÇü¼º°ú µ¿Àû ¹ÙÀεùÀÌ ¾ø´Ù¸é ´ç½ÅÀº ´ÜÁö C++À» Có·³ »ç¿ëÇϰí ÀÖ´Â °ÍÀÌ´Ù.
 | µ¿Àû ¹ÙÀεù(Dynamic binding)
|  |
¹ÙÀεùÀ̶õ ´Ü¾î´Â ¾ðÁ¦³ª µéÀ» ¼ö ÀÖ´Â ´Ü¾îÀÌ´Ù. ±×·³ ¹ÙÀεùÀ̶ó´Â °ÍÀº Á¤È®È÷ ¹«¾ùÀ» ÀǹÌÇÏ´Â °ÍÀΰ¡. ¿ø·¡ ¹ÙÀεùÀ̶ó´Â ´Ü¾îÀÇ »çÀüÀûÀÎ Àǹ̴¡®¹´Ù¡¯ÀÌ´Ù. ±×·³ ¿ì¸®°¡ ¾²´Â ¾ð¾î¿¡¼ ¹ÙÀεùÀº ¹«¾ùÀ» ÀÇ¹Ì ÇÒ±î. À̰ÍÀº Caller¿Í CalleeÀÇ ÁÖ¼Ò¸¦ ¹¾îÁÖ´Â °ÍÀ¸·Î »ý°¢ÇÒ ¼ö ÀÖ´Ù.
¸¸¾à ¿ì¸®°¡ DriverEntry()¶ó´Â ÇÔ¼ö¿¡¼ PassNextToDriver()¶ó°í ÇÔ¼ö¸¦ È£Ãâ ÇÏ¿´´Ù°í »ý°¢Çغ¸ÀÚ(DriverEntry´Â CallerÀ̰í PassNextToDriver´Â CalleeÀÌ´Ù).
PassNextToDriver¶ó´Â ÇÔ¼ö°¡ 0x7FFFFFFF¿¡ À§Ä¡ÇÑ´Ù°í °¡Á¤Çϸé Caller ÂÊ ÄÚµå´Â ¿¡¼Àºí·¯·Î bch 0x7FFFFFFF¿Í °°Àº ½ÄÀ¸·Î ¹ø¿ªµÉ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ °ÍÀ» ¹ÙÀεùÀ̶ó°í ÇÑ´Ù. ´Ù½Ã ¹ø¿ªµÈ ¾î¼Àºí·¯ Äڵ带 »ìÆìº¸¸é ¹Ì¸® ÁÖ¼Ò°¡ µé¾î°¡¾ß ÇÑ´Ù.
ÇÏÁö¸¸ ´ÙÀ̳ª¹Í ¹ÙÀεùÀÇ °æ¿ì ÀÌ·¸°Ô ¹Ì¸® °áÁ¤ÇÏ´Â °ÍÀ» ·±Å¸ÀÓ ½ÃÁ¡À¸·Î ¹ÙÀεùÀ» ¹Ì·ç°í ÇÁ·Î±×·¡¸Ó°¡ ±×·± °ÍÀ» ±¸ÇöÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¾ð¾îÀûÀÎ ÀÔÀå¿¡¼ C++ ¾ð¾î ½Ã½ºÅÛÀÌ Ã³¸®ÇÑ´Ù´Â °ÍÀÌ´Ù.
C++¿¡¼ÀÇ ´ÙÀ̳ª¹Í ¹ÙÀεù°ú ÀÏ¹Ý C¾ð¾î·Î ±¸ÇöµÇ´Â ±¸Á¶ÀûÀÎ ÇÁ·Î±×·¡¹ÖÀÇ Â÷À̸¦ º¸ÀÚ. ½±°Ô Çϱâ À§ÇØ »óÀ§ ÇÁ·ÎÅäŸÀÔÀº ¹Ì¸® Á¤ÀÇµÈ °ÍÀ¸·Î °¡Á¤ÇÑ´Ù.
| <¸®½ºÆ® 2> µ¿Àû ¹ÙÀεù ¿¹Á¦ | | | |
CList List;
// CDialogObj¶ó´Â Interface¸¦ ÀÔÃâ·ÂÀ¸·Î ÇÏ´Â ¸®½ºÆ®ÀÌ´Ù.
List.push_back(CIfDlg(10, 20, condition));
// »ý¼ºÀÚ¸¦ ÅëÇØ if ´ÙÀ̾ó·Î±× ³»¿ëÀ» list¿¡ ¹Ð¾î ³Ö´Â´Ù.
List.push_back(hileDlg(10, 20, condition));
// while ´ÙÀ̾ó·Î±×¸¦ ¹Ð¾î ³Ö´Â´Ù.
.
While(!List.IsEmpty())
{
CDialogObj * object = List.GetRemoveHead();
// ¸®½ºÆ®¿¡¼ ÀÎÅÍÆäÀ̽º Çü½ÄÀ¸·Î ÀÎÃâÇÑ´Ù.
object->SetPosition(LEFT);
// ÀÌ ºÎºÐ¿¡¼ °¡»óÇÔ¼ö°¡ ¹ÙÀεù µÈ´Ù.
}
| |
 |
»ç½Ç ÀÌ Äڵ带 ÀÌÇØÇϱâ À§Çؼ´Â ´ÙÇü¼º(Polymorphism)À» ¾Ë¾Æ¾ß ÇÏÁö¸¸, ¹Ù·Î µÞ Á¦¸ñ¿¡¼ À̸¦ ³íÇϰí ÀÖÀ¸´Ï ÀÏ´Ü ³Ñ¾î°¡ÀÚ. Object´Â ABC(Abstraction Base Class)·Î ÀÎÅÍÆäÀ̽º ¿ªÇÒÀ» Çϰí ÀÖÀ¸¸ç ÀÌ´Â ¼ø¼ö °¡»ó ÇÔ¼ö·Î µÇ¾î ÀÖ´Ù. <¸®½ºÆ® 2>¿¡ µé¾î°¡ ÀÖ´Â °¢ ¿øÀÚ Å¬·¡½ºµéÀ» ²¨³»¾î Set PostionÀ» È£Ãâ ÇÏ·Á°í ÇÑ´Ù°í ÇØº¸ÀÚ.
¿ì¸®´Â µÎ °¡ÁöÀÇ Å¸ÀÔÀ» ÅëÇØ ¸®½ºÆ®¿¡ ³Ö¾î µÎ¾ú°í µÎ Ŭ·¡½º¿¡¼ SetPositionÀÌ °¢°¢ ±¸ÇöµÇ¾î Àִµ¥ while ·çÇÁ ¾È¿¡¼´Â CDialogObj¶ó´Â ÀÎÅÍÆäÀ̽º·Î ±× ³ëµå¸¦ ¹Þ¾Æ SetPositionÀ» È£ÃâÇÑ´Ù.
¿©·¯ºÐÀº ¾î´À Ŭ·¡½ºÀÇ SetPositionÀ» È£Ãâ Çϰڴ°¡? ÀÌ È£Ãâ¿¡ ´ëÇÑ °ÍÀÌ °¡»óÇÔ¼öÀÌ´Ù. ÀÌ °¡»óÇÔ¼ö´Â µ¿ÀûÀ¸·Î ·±Å¸Àӽÿ¡ ÀÚ½ÅÀÇ Å¸ÀÔÀ» °í·ÁÇÏ¿© ÇÔ¼ö¸¦ ¹ÙÀεù ÇÑ´Ù. À̰ÍÀ» C++¿¡¼´Â ¸Þ½ÃÁö µð½ºÆÐĪÀ̶ó°í ÇÏ¸ç ¿©±â¼ ¸»ÇÏ´Â µð½ºÆÐÄ¡´Â win32³ª, µð¹ÙÀ̽º µå¶óÀ̹ö¸¦ °³¹ßÇÏ´Â °³¹ßÀÚµéÀÌ ¾Æ´Â µð½º ÆÐÄ¡ ·çƾ°ú °°´Ù.
¸Þ½ÃÁö¶ó´Â °ÍÀº ¾ð¾î»óÀÇ Ç¥ÇöÀ̸ç, ¿ì¸®´Â ´ÜÁö ÀÎÅÍÆäÀ̽º ÀÔÀå¿¡¼ ¸Þ¼Òµå Çϳª¸¸ È£Ãâ ÇÒ Å×´Ï ³ª¸ÓÁö´Â ¾ð¾î ½Ã½ºÅÛ »ó¿¡¼ ó¸® Ç϶ó´Â Àǹ̴Ù. ¸¶Ä¡ ¸Þ½ÃÁö¸¦ ´øÁö´Â °Í°ú À¯»çÇÏ°Ô º¸À̱⠶§¹®ÀÌ´Ù.
ÀÌ·¯ÇÑ µ¿ÀÛ ¹æ½ÄÀº OOPÀÇ ±âº» ¸Þ¼Òµå È£Ãâ ¹æ½ÄÀÌ´Ù. ¾Õ¿¡¼ À̾߱âÇß´ø Code WizardÀÇ ÇÁ·Î±×·¥ÀÇ ¹®Á¦µµ ÀÌ ¹æ¹ýÀ¸·Î ¼öÁ¤ ÇÒ ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 3> <¸®½ºÆ® 2>¸¦ Á¤Àû¹ÙÀεùÀ¸·Î ó¸®ÇÒ °æ¿ìÀÇ CÄÚµå | | | |
List list;
IFDLG *ifDlg = malloc(sizeof(IFDLG));
// º¹»ç »ý¼ºÀÚ°¡ ¾øÀ¸¸é shadow copy°¡ ÀϾ¹Ç·Î Æ÷ÀÎÅÍ·Î ÇÒ´ç
WHILEDLG *whileDlg = malloc(sizof(WHILDLG));
Push_back(list, ifDlg);
// ¸®½ºÆ®¿¡ ¹ÙÀεùµÈ ÇÔ¼ö°¡ ¾øÀ¸¹Ç·Î Àü¿ª ÇÔ¼ö¿¡ °³Ã¼¿Í ÀÎÀÚ¸¦ »ðÀÔ
Push_back(list, whileDlg);
While(!IsListEmpty(list))
{
OBJECT *obj = GetRemoveHead(list);
switch(obj->type)
// ´ÙÀ̳ª¹Í ¹ÙÀεùÀ» Áö¿ø ÇÏÁö ¾ÊÀ¸¹Ç·Î tag¸¦ »ç¿ëÇØ ºÐ¸®ÇÑ´Ù.
{
Case IF_DLG :
((IFDLG *)obj)->SetPosition(LEFT);
// if´ÙÀ̾ó·Î±×ÀÇ À§Ä¡¸¦ º¯°æ
Case WHILE_DLG :
((WHILEDLG *)obj)->SetPosition(LEFT);
}
| |
 |
C¾ð¾î·Î ÀÛ¼ºµÈ µ¿ÀÏ µ¿ÀÛÀ» ÇÏ´Â Äڵ带 º¸ÀÚ. C¿¡¼´Â ű׳ª ŸÀÔ¿¡ ´ëÇÑ Á¤º¸°¡ ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù. C¾ð¾î ½Ã½ºÅÛ¿¡¼ À̸¦ Áö¿ø ÇÏÁö ¾Ê´Â Å¿¿¡ ¿ì¸®°¡ Á÷Á¢ ÇØ¾ß ÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ÄÚµå´Â switch¿Í tag¸¦ ÀÌ¿ëÇÑ ºÐ±â·Î °¡´ÉÇÏ´Ù. ½ÇÁ¦·Î MFC °°Àº °æ¿ì ¸Þ½ÃÁö ¸ÊÀ̶ó´Â °ÍÀ» »ç¿ë ÇÒ ¶§ tag¿Í ÇÔ¼ö Æ÷ÀÎÅÍ·Î ÀÌ·¯ÇÑ °ÍÀ» ±¸ºÐÇÑ´Ù.
À̹ø¿¡´Â °³¹ßÀÚ ÀÔÀå¿¡¼ Á» ´õ °ï¶õÇÑ À̾߱⸦ ÇØº¸ÀÚ. ¿©·¯ºÐÀÌ Code Wizard ÇÁ·ÎÁ§Æ®¸¦ ¼öÇàÇϰí Àִµ¥ °ÅÀÇ ¿Ï¼ºÀÌ´Ù µÇ¾î °¥ ¶§ Âë Ŭ¶óÀÌ¾ðÆ®°¡ ¸¶À½ÀÌ ¹Ù²î¾ú´Ù. while ´ë½Å¿¡ loop¶ó´Â ´ÙÀ̾ó·Î±×·Î º¯°æÇØÁÖ°í, else µîÀÇ ´ÙÀ̾ó·Î±×µµ ³Ö¾î´Þ¶ó°í ÇÑ °ÍÀÌ´Ù.
ÀÌ °æ¿ì, C++¿¡¼´Â CWhileDlg ´ë½Å CLoopDlg¶ó´Â Ŭ·¡½º·Î º¯°æÇØÁÖ°í (¹°·Ð ÀÎÅÍÆäÀ̽º·ÎºÎÅÍ »ó¼Ó ¹ÞÀº) CElseDlg°¡ Ãß°¡ µÉ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¿©±â¿¡ ÀÎÅÍÆäÀ̽º°¡ Àß ±¸ÇöµÇ°í »ó¼Ó °ü°è°¡ Àß ¿«¾îÁ® ÀÖ´Ù¸é »õ·Î Ãß°¡µÇ´Â ´ÙÀ̾ó·Î±×´Â ´ÜÁö »ó¼Ó¸¸À¸·Î ±¸ÇöÇÒ ¼ö ÀÖ´Ù. Ãß°¡µÈ Ŭ·¡½º À̿ܿ¡ ¸®½ºÆ®ÀÇ Çڵ鿡¼ º¯ÈÇÏ´Â °ÍÀº ¾Æ¹« °Íµµ ¾ø´Ù.
±×°ÍÀº °¡»óÇÔ¼ö¿Í ´ÙÇü¼º ¶§¹®À̶ó°í ¸» ÇÒ ¼ö ÀÖ´Ù. ¿©±â¿¡¼´Â °£´ÜÇÑ Äڵ带 ÀÌ¿ëÇÑ ½Ã³ª¸®¿À¸¦ ¿¹·Î µé¾úÁö¸¸, ½ÇÁ¦·Î Å« ÇÁ·ÎÁ§Æ®¿¡¼ ÀÌ·¯ÇÑ ¹®Á¦´Â À¯Áöº¸¼ö, ½Ã°£ Àη ¸é¿¡¼ ¿ì¸®ÀÇ »ý°¢º¸´Ù Å« À§Ä¡¸¦ Â÷ÁöÇÑ´Ù. ±×·¯¸é °¡»óÇÔ¼ö¿Í ¹ÐÁ¢ÇÑ °ü·ÃÀÌ ÀÖ´Â ´ÙÇü¼º(Polymorphism)ÀÇ ºÎºÐÀ» »ìÆìº¸µµ·Ï ÇÏÀÚ.
 | ´ÙÇü¼º(Polymorphism)
|  |
´ÙÇü¼ºÀ̶õ ¹«¾ùÀϱî. ¿Ü±¹À¸·Î ¼öÃâ ÇÏ´Â ÀÚÀü°Å¿Í ³ìÂ÷¸¦ »ý°¢Çغ¸ÀÚ. ÀÌ ÀÚÀü°Å¿Í ³ìÂ÷´Â ´Ù¸¥ Ŭ·¡½º·Î ±¸Çö µÉ ¼ö ÀÖ´Ù. »ç½Ç Ãß»óÈ °üÁ¡¿¡¼ º¸¾Æµµ ÀÌ µÑÀº ¿ÏÀüÈ÷ ´Ù¸£´Ù.
ÇÏÁö¸¸ ´Ù½Ã »ý°¢Çغ¸¸é ¿Ü±¹À¸·Î ¼öÃâ ÇÑ´Ù´Â °üÁ¡¿¡¼ ÀÌ µÑÀº °°À» ¼öµµ ÀÖ´Ù. ´Ù¸£¸é¼µµ °°Àº °Í ±×°ÍÀÌ ´ÙÇü¼ºÀÇ °³³äÀÌ´Ù. ¿ì¸®´Â ÀÌ·± ´ÙÇü¼ºÀ» ÅëÇØ Äڵ带 °£°áÇÏ°Ô Çϰí ÀϰüÀûÀÎ °üÁ¡¿¡¼ Ŭ·¡½º¸¦ °ü¸® ÇÒ ¼ö ÀÖ´Ù.
ÀÎÅÍÆäÀ̽º
¿ì¸®´Â ¿©±â¼ Àá½ÃC++ÀÇ ÀÎÅÍÆäÀ̽º¸¦ »ý°¢Çغ¸°í ³Ñ¾î°¡¾ß ÇÑ´Ù. ÀÌ¹Ì ¾Ë°í ÀÖ´Â °Íó·³ C++¿¡´Â ÀÎÅÍÆäÀ̽º°¡ ¾ø´Ù.±×·¸´Ù°í ÇØ¼ C++À» °¡Áö°í ´ÙÇü¼ºÀ» »ç¿ëÇÏÁö ¸øÇÏ´Â °ÍÀº ¾Æ´Ï´Ù.
¿Ö ÀÎÅÍÆäÀ̽º¶ó´Â À¯¿ëÇÑ °³³äÀÌ C++¿¡´Â ¾ø´Â °ÍÀϱî? ÀÌ´Â C++ÀÇ Å»ý°ú ¿¬°üµÈ´Ù. 1980³âµµ¿¡ º§¿¬±¸¼ÒÀÇ ½ºÆ®¶ó¿ì½ºÆ®·´¿¡ ÀÇÇØ C++ÀÌ ¸¸µé¾îÁú ¶§´Â C¾ð¾î¿¡ ±â¹ÝÇÑ °´Ã¼ ÁöÇâ ¾ð¾î¸¦ ¸¸µé°íÀÚ ÇÏ´Â °ÍÀÌ ¾Æ´Ï¾ú´Ù. ¾Õ¼ ¼³¸í ÇÑ ¹Ù ÀÖµíÀÌ C¾ð¾î¿¡ ´ÜÁö ÀÚ·á Ãß»óÈ ±â´ÉÀ» Ãß°¡Çϱâ À§Çؼ Á¦ÀÛÇÑ °ÍÀÌ C++ÀÇ ÃÊâ±â ¾ð¾îÀÎ C with data abstractionÀÌ´Ù.
ÀÌ¿¡ ±×´Â °´Ã¼ ÁöÇâÀû ¾ð¾îÀÇ ÀåÁ¡À» »ì·Á C++ Release 1.0À» 1986³â¿¡ ¸®ºñÁ¯Çß´Ù. C++ÀÇ Å»ýÀÌ ÀýÂ÷Àû ¾ð¾îÀÎ C¶ó´Â °ÍÀº ÀÚ¹Ù¿¡ ºñÇϸé Ä¡¸íÀûÀÎ ¾àÁ¡À» °¡Áø´Ù. 1980³â´ë¿¡ Á¦À۵DZ⠽ÃÀÛÇÑ C++Àº ÃÊâ±â °´Ã¼ÁöÇâÀû ¾ð¾î °³³äÀÌ ¼º¼÷ÇÏÁö ¸øÇÑ ½ÃÁ¡¿¡¼ ³Ê¹« ÀÏÂï »ý¼ºµÈ Å¿¿¡ ÀÎÅÍÆäÀ̽º¿¡¼ ºüÁö°Ô µÈ °ÍÀÌ´Ù.
¿ì¸®°¡ C++ÀÇ ¿ª»ç¸¦ À̾߱âÇÏ·Á´Â °ÍÀÌ ¾Æ´Ï¹Ç·Î ÀÌÂë¿¡¼ ±¸Çö À̾߱â·Î ³Ñ¾î°¡º¸ÀÚ. ±×·¯¸é C++¿¡¼´Â ÀÎÅÍÆäÀ̽º¸¦ ¾î¶»°Ô Èä³»³»¾ß ÇÒ±î. C++¿¡¼ Ŭ·¡½º¸¦ ±¸ÇöÇÒ °æ¿ì ÀÎÅÍÆäÀ̽º°¡ ´Â ±¸Ã¼ÈµÈ Ŭ·¡½º·Î ±¸ÇöµÇ¾î¾ß ÇÑ´Ù. ÀÌ Å¬·¡½º¿¡ ¼ÓÇÏ´Â ¸ðµç ÇÔ¼ö´Â ¼ø¼ö °¡»ó ÇÔ¼ö·Î ¼±¾ðµÇ¾î¾ß ÇÑ´Ù.
¿ì¸®°¡ »ç¿ëÇÒ ÄÁÅ×À̳ʸ¦ °£´ÜÇÑ ¸®½ºÆ®·Î Á¦ÀÛÇÑ´Ù°í °¡Á¤Çغ¸ÀÚ. óÀ½ ¿ì¸®°¡ ÇØ¾ß ÇÒ ÀÛ¾÷Àº ¿ì¸®ÀÇ ¸®½ºÆ®¿¡ µé¾î°¥ °³Ã¼¸¦ Ŭ·¡½º·Î ÀÚ·á Ãß»óȸ¦ ÇØ¾ß ÇÑ´Ù.
À̰ÍÀº ´ÜÁö Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â °Í ¿Ü¿¡ ´ÙÇü¼ºÀ» »ç¿ëÇÏ´Â ±âÃʰ¡ µÈ´Ù. ÀÌ ¸®½ºÆ®¿¡ µé¾î°¥ ³»¿ëµéÀº ¾Æ·¡ ¿øÀÚ°¡ µÇ´Â °ÍÀ» »ó¼Ó ¹Þ¾Æ ±¸ÇöÇÏ°Ô µÉ°ÍÀÌ´Ù. ÀÌ·¯ÇÑ Á¢±ÙÀº ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÑ ´ÙÇü¼º ¸®½ºÆ®¿Í °°Àº ¸Æ¶ô¿¡¼ ÀÌÇØµÉ ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 4> ´ÙÇü¼ºÀÇ ÃÖ»óÀ§ ºñ ´Ü¸» ³ëµå Object Interface | | | |
// ´ÙÇü¼ºÀÇ ÃÖ»óÀ§ ºñ´Ü¸» ³ëµåObject Interface
// ¸ðµç ÇÏÀ§ Ŭ·¡½ºÀÇ °øÅëÁ¡¸¸À» ÃßÃâ ÇÏ¿© »ðÀÔÇÑ´Ù.
class CObject {
public:
virtual char * ToString() = 0;
// ±¸ÇöÀ» Á¦¿ÜÇÑ ¼ø¼ö °¡»óÇÔ¼ö·Î Á¤ÀÇ ÇÑ´Ù
}
// List ¼º°ÝÀ» ¶ç´Â ±¸¼º ¿øÀÚList Interface
// ¿©±â¼´Â objectÀÇ »ó¼ÓÀ» ¹Þ¾Æ¼ ¸µÅ©µå ¸®½ºÆ®ÀÇ ¼º°ÝÀ» ¶ç´Â ¸Þ¼
µå¸¸ Á¤ÀÇ ÇÒ °ÍÀÌ´Ù.
class CListItem : public CObject {
virtual CListItem * GetNext() = 0;
// ´ÙÀ½ ¸®½ºÆ® ¾ÆÀÌÅÛÀ» °¡Á®¿À´Â ¸Þ¼µå.
virtual void SetNext(CListItem *item) = 0;
// ¸®½ºÆ®¿¡ µé¾î°¡´Â ¾ÆÀÌÅÛÀÇ ±Ù°£ÀÌ µÉ °ÍÀ¸·Î ´ç¿¬È÷ ±¸ÇöÀÌ ¾ø´Ù.
}
| |
 |
<¸®½ºÆ® 4>´Â ¸®½ºÆ®ÀÇ ±Ù°£ÀÌ µÉ µÎ °¡Áö ÀÎÅÍÆäÀ̽º¸¦ »ý¼ºÇß´Ù. ÀÌ·± ¸®½ºÆ®¸¦ ¼±¾ðÇÒ ¶§¿¡´Â ¸î °¡Áö¸¦ ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¸ðµç Ŭ·¡½ºÀÇ ³»ºÎ ¸â¹ö¿Í returnÀº PointerÀÓÀ» »ìÆìº¸ÀÚ. ¿Ö Pointer·Î¸¸ ±¸¼º µÇ¾î ÀÖÀ»±î? ÀÌ´Â OOPÀÇ ´ÙÇü¼º °³³äÀ» »ç¿ëÇϱâ À§ÇØ ÇʼöÀûÀÎ ¾ÆÀÌÅÛÀÌ´Ù.
´ÙÇü¼ºÀ» ÀÌ·ç±â À§Çؼ´Â »óÀ§ ÀÎÅÍÆäÀ̽ºÀÇ ÀÔÀå¿¡¼ ÇÚµé¸µÇØ¾ß Çϴµ¥ µ¿ÀûÀ¸·Î ¹ÙÀεùÇϱâ À§Çؼ´Â ÀÔÃâ·ÂÀÌ Æ÷ÀÎÅÍ·Î µÇ¾î¾ß ÇÑ´Ù. °£È¤ ÀÚ¹Ù ÇÁ·Î±×·¡¸Ó³ª ´Ù¸¥ ¿©Å¸ ÇÁ·Î±×·¡¸Ó°¡ Æ÷ÀÎÅ͸¦ ¾²´Â °ÍÀ» Á˾ÇÀÎ ÄÚµå·Î ºÐ·ù Çϰí ÀÖÁö¸¸, C++¿¡¼´Â µ¿Àû ¹ÙÀεùÀ» À§ÇØ Æ÷ÀÎÅ͸¦ »ç¿ëÇÑ´Ù.
¿©±â Æ÷ÀÎÅÍÀÇ °³³äÀº ÁÖ¼Ò ¹øÁö¸¦ °¡¸®Å°´Â Çڵ鷯¶ó±â º¸´Ù ´ÜÁö ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇϱâ À§ÇÑ µµ±¸¶ó°í »ý°¢ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¹°·Ð Æ÷ÀÎÅÍ¿¡ ´ëÇÑ À§Çè »çÇ×, Áï ³»ºÎ ¸â¹öÀÇ Æ÷ÀÎÅ͸¦ ¹ÝȯÇѴٰųª µ±Û¸µ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ´Â ÀÏÀº ¾øµµ·Ï ÇØ¾ß ÇÒ °ÍÀÌ´Ù.
ÀÎÅÍÆäÀ̽º¸¦ ¼±¾ðÇßÀ¸´Ï ÀÌÁ¦ ³»ºÎ¸¦ ä¿ö ³ÖÀ» ±¸Ã¼È Ŭ·¡½º¸¦ ±¸ÇöÇØº¸ÀÚ. ±¸Ã¼È Ŭ·¡½º´Â ±âº»ÀûÀÎ ¸®½ºÆ® µ¿ÀÛÀ» ±¸ÇöÇÏ´Â µðÆúÆ® ¾ÆÀÌÅÛ°ú ±× µðÆúÆ® ¾ÆÀÌÅÛÀ¸·ÎºÎÅÍ »ó¼Ó ¹Þ¾Æ ±¸¼º ¿øÀÚÀÇ ³»¿ëÀ» ±¸ÇöÇÏ´Â ±¸Ã¼È Ŭ·¡½º·Î ³ª´· ¼ö ÀÖ´Ù.
ÀÌ·Î½á ¿ì¸®´Â ÀÌ ¸®½ºÆ®¿¡ CListItemÀ̶ó´Â ÀÎÅÍÆäÀ̽º·ÎºÎÅÍ »ó¼Ó ¹ÞÀº ¸ðµç Ŭ·¡½ºµéÀ» ³Ö¾î °ü¸®ÇÒ ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 5> ¸®½ºÆ® ¾ÆÀÌÅÛÀÇ ½ÇÁ¦ ±¸Ã¼È Ŭ·¡½º | | | |
// ±¸¼º¿øÀÚ·Î ÀÌ·ç¾îÁø ±âº» Item, ¸®½ºÆ® ¾ÆÀÌÅÛÀÇ ½ÇÁ¦ ±¸Ã¼È Ŭ·¡½º
// ±âº» Item Ŭ·¡½º´Â Interface¿¡¼ ¼±¾ðµÇ¾î Àֱ⸸ ÇÑList link ¸Þ¼µå¸¦ ä¿ö ³Ö±â À§Çؼ ¸â¹ö¸¦ ¼±¾ðÇÏ°í µ¿ÀÛÀ» ±¸ÇöÇÑ´Ù.
class CDefaultItem : public CListItem {
CListItem * nextItem;
// ´ç¿¬È÷ Æ÷ÀÎÅÍ·Î ¼±¾ðÇÑ´Ù.
public :
virtual CListItem * GetNext() { return nextItem; };
virtual void SetNext(CListItem *item) { nextItem
= item;};
}
| |
 |
<¸®½ºÆ® 6>ÀÇ ¼¼ °¡Áö ¾ÆÀÌÅÛÀ» ±¸ÇöÇϱ⸸ Çϸé ÀÌÁ¦ ¸®½ºÆ®¿¡¼ ¾ÆÀÌÅÛÀ» ¸ðµÎ ¸®½ºÆ®·Î °ü¸® ÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ´ÙÁß »ó¼ÓÀ» ÅëÇÏ¿© ÀÚ½ÅÀÇ ºÎ¸ð Ŭ·¡½º°¡ ¸®½ºÆ®¸¦ À§ÇÑ Object »Ó¸¸ ¾Æ´Ï¶ó, ´ÙÀ̾ó·Î±×ÀÇ ¼Ó¼ºÀ» ±×´ë·Î »ó¼Ó¹ÞÀ» ¼öµµ ÀÖ´Â °ÍÀÌ´Ù. ¹°·Ð ´ÙÁß »ó¼ÓÀº ½ÅÁßÇØ¾ß ÇÑ´Ù.
»ç½Ç ÇÊÀÚ´Â ´ÙÁß »ó¼ÓÀÇ ¹®Á¦´Â °´Ã¼ÁöÇâ¿¡¼ ¿Ã¹Ù¸£Áö ¾Ê´Ù°í »ý°¢ÇÏÁö¸¸, ÀÌ ºÎºÐ¿¡ ´ëÇÑ ³íÀÇ´Â ´ÙÀ½¿¡ ±âȸ°¡ µÇ¸é ´Ù½Ã Çϵµ·Ï ÇÏÀÚ.
| <¸®½ºÆ® 6> ¼¼ Á¾·ùÀÇ ±¸Ã¼È Ŭ·¡½º | | | |
// Á¤¼öÇü ¼º°ÝÀ» ¶è ±¸Ã¼È Ŭ·¡½º
// ¸®½ºÆ® ¾ÆÀÌÅÛÀÇ ±¸ÇöÀ» »ó¼Ó ¹Þ°í Á¤¼öÇü ¼º°ÝÀ» ¶ç´Â ºÎºÐ¸¸ ±¸ÇöÇÑ´Ù.
class CIntItem : public CDefaultItem {
int m_i;
// Á¤¼öÇü ÀÎÀÚ. ÀÌ ºÎºÐÀº µ¿ÀûÀ¸·Î ¹ÙÀεù ÇÒ °ÍÀÌ ¾ø´Ù.
public :
CIntItem(int i) { m_i = i; nextItem = NULL;};
virtual char * ToString();
// »óÀ§ ¿ÀºêÁ§Æ® ÀÎÅÍÆäÀ̽ºÀÇ °¡»óÇÔ¼ö¸¦ Á¤¼öÇü ¿¡ ¸Â°Ô Á¤ÀÇÇÑ´Ù.
}
// ½ºÆ®¸µ ¼º°ÝÀ» ¶è ±¸Ã¼È Ŭ·¡½º
class CStringItem : public CDefaultItem {
char * m_s;
public :
CStringItem(char *s) { m_s = s; nextItem = NULL};
virtual char * ToString();
}
// ÁÂÇ¥ ¼º°ÝÀ» ¶è ±¸Ã¼È Ŭ·¡½º
class CPointItem : public CDefaultItem {
double m_x;
double m_y;
public :
CPointItem(double x, double y);
virtual char * ToString();
}
| |
 |
ÀÌÁ¦ ¸®½ºÆ®¿Í ±¸¼º ¿øÀÚµéÀÌ ¸ð¿´À¸´Ï À̸¦ »ç¿ë ÇØº¸ÀÚ. <¸®½ºÆ® 7>À» º¸¸é À̰ÍÀÌ ¾ó¸¶³ª ±ò²ûÇÏ°í Æí¸®ÇÏ°Ô »ç¿ë µÉ ¼ö ÀÖ´ÂÁö ¾Ë ¼ö ÀÖ´Ù.
| <¸®½ºÆ® 7> µ¿Àû ¹ÙÀεùÀ» À§ÇÑ main ÇÔ¼ö | | | |
int main()
{
CList * list = new CList;
// ¸®½ºÆ®¸¦ Çϳª »õ·Î »ý¼ºÇÑ´Ù.
list->InsertList(new CIntItem(1));
// ¸®½ºÆ® ÀÎÀÚ·Î »ý¼ºÀÚ¸¦ ÀÌ¿ëÇÏ¿© Èü ¿µ¿ªÀÇ Å¬·¡½º¸¦ »ðÀÔÇÑ´Ù.
list->InsertList(new CStringItem("this is
sample"));
list->InsertList(new CPointItem(3, 4))
for(int i = list->begin() i != list->end(); i++)
printf("%s", list->GetNext()->ToString);
// ¿ì¸®´Â ÀÌ ¸®½ºÆ®¿¡¼ InterfaceÀÔÀå¿¡¼ ToStringÀ» ¸ðµÎ È£ÃâÇÑ´Ù.
list->Clear
// ¸®½ºÆ®¸¦ Áö¿ì°í ÇÒ´çµÈ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.
}
| |
 |
 | »ç¶÷À» µ¿¹°·Î, ½Ä¹°À» ½ÅÀ¸·Î..º¯ÈÀÇ Å¸ÀÔ Ä³½ºÆÃ
|  |
¿ì¸®°¡ ÈçÈ÷ »ç¿ëÇϴ ŸÀÔ Ä³½ºÆÃ(Type casting)¿¡ ´ëÇØ »ý°¢Çغ¸ÀÚ. ÀýÂ÷ÀûÀÎ ¾ð¾î»ó¿¡¼ Á¶Â÷ ŸÀÔ Ä³½ºÆÃÀº ¹Î°¨ÇÏ°íµµ Á˾ÇÀûÀÎ »çÇ×ÀÌ´Ù. Çб³¿¡¼µµ Çö¾÷¿¡¼µµ ¾²Áö ¸»¶ó°í ±×·¸°Ô À̾߱âÇØµµ ¾µ ¼ö¹Û¿¡ ¾ø´Â °ÍÀÌ Å¸ÀÔ Ä³½ºÆÃÀÌ´Ù.
ÄÚµå¶ó´Â °ÍÀº ÀÛ¼ºÇϸ鼺ÎÅÍ ½Ã°£ÀÌ Áö³¯¼ö·Ï µ¹ÀÌų ¼ö ¾ø´Â »óűîÁö º¹ÀâÇØÁö°Ô ¸¶·ÃÀÌ´Ù. ŸÀÔ Ä³½ºÆÃÀº ¹Ì¼÷ÇÑ Çлý¿¡°Ô´Â ¹Ì¼÷ÇÑ ´ë·Î, ¹Ù»Û Çö¾÷ÀÇ ÇÁ·Î±×·¡¸Ó¿¡°Ô´Â ½Ã°£ÀÌ ºÎÁ·ÇÑ´ë·Î ÀÔ¸À¿¡ ¸ÂÃç »ç¿ëµÈ´Ù.
CÀÇ Å¸ÀÔ Ä³½ºÆÃ ¹®Á¦
ÀÌ·¯ÇÑ C ¾ð¾î»ó¿¡¼ ŸÀÔ Ä³½ºÆÃÀÌ À߸ø »ç¿ëµÇ´Â ¿¹¸¦ º¸ÀÚ. ÆÄÀÏ ½Ã½ºÅÛ ¾Æ·¡ Disk Class driver¿¡ ÇÊÅ͸¦ ¾ñ¾î¼ ÀÛ¾÷À» ÇÑ´Ù°í °¡Á¤ÇÏÀÚ. ±×¸®°í »óÀ§ DeviceIoControl·Î ¿ì¸®¿¡°Ô ÇÊ¿äÇÑ ÁÖ¼Ò µ¥ÀÌÅ͸¦ ÁÖ´Â ¾ÖÇø®ÄÉÀ̼ÇÀº ´Ù¸¥ ÇÁ·Î±×·¡¸Ó°¡ Á¦ÀÛÇÑ´Ù°í °¡Á¤ÇÑ´Ù.
¿ì¸®°¡ °¡°øÇÒ Á¤º¸µéÀÌ ´ã±ä °ÍÀº ¾ÖÇø®ÄÉÀ̼ǿ¡¼ DeviceIoControl·Î ³»·Á ÁÖ´Â ÁÖ¼Ò °ª°ú ÆÄÀÏ ½Ã½ºÅÛ¿¡¼ ³»·ÁÁÖ´Â ÁÖ¼Ò °ªÀ» ºñ±³ÇÏ¿© ÀÏÄ¡ÇÒ ¶§ ƯÁ¤ ÀÛ¾÷À» ¼öÇàÇÏ·Á°í ÇÑ´Ù°í »ý°¢Çغ¸ÀÚ. ¿ì¸®°¡ ±¸ÇöÇÒ ¶§ ÆÄÀÏ ½Ã½ºÅÛÀÌ ³»·ÁÁÖ´Â ÁÖ¼Ò °ªÀº 32ºñÆ® unsigned long °ªÀ¸·Î ÁÖ¼Ò°¡ À½¼ö·Î Á¸Àç ÇÏÁö ¾Ê±â ¶§¹®¿¡ ¹®Á¦°¡ ¾ø´Ù.
ÇÏÁö¸¸ ¿©±â¿¡¼´Â ÁÖ¼Ò°ªÀ» 32ºñÆ®·Î ó¸®ÇÏµÇ Æ¯º°ÇÑ ¹®Á¦°¡ ¾ø¾î º¸ÀÌ´Â longÀ¸·Î ó¸®Çß´Ù°í »ý°¢Çغ¸ÀÚ.
| <¸®½ºÆ® 8> ÁÖ¼Ò °ªÀ» ºñ±³ÇÏ¿© ƯÁ¤ÇÑ ·çƾÀ» ¼öÇàÇÏ´Â µå¶óÀ̹ö ÄÚµå | | | |
NTSTATUS
SomethingDeviceControl (PDEVICE_OBJECT pDevObj, PIRP Irp)
// Device IO Control µð½ºÆÐÄ¡ ·çƾ
{
IrpStack = IoGetCurrentStackLocation(Irp);
// ÇöÀç IO½ºÅà ·ÎÄÉÀ̼ÇÀ» °¡Á®¿È
¡¦
Switch(DeviceIoControlCode)
// »óÀ§ÀÇ ÄÁÆ®·Ñ Äڵ带 ºÐ·ù
{
case START_FILTER :
// ÇöÀç ½ÃÀÛ ÁÖ¼Ò¿Í »óÀ§ ¾îÇø®ÄÉÀ̼ǿ¡¼ ³»·ÁÁØ À¯Àú¿µ¿ªÀÇ ½Ã½ºÅÛ ¹öÆÛ¸¦ ºñ±³ÇÏ¿© ÀÏÄ¡ ÇÒ °æ¿ì ƯÁ¤ µ¿ÀÛÀ» ¼öÇàÇϵµ·Ï ÇÑ´Ù.
If(Irp->AssociatedIrp.ByteOffset == (unsigned long
)IrpStack->Parameters.SystemBuffer)
{
ToDoSomthing();
}
¡¦.
}
| |
 |
ÀÌ·¯ÇÑ °æ¿ì¿¡ ºÎÈ£ ºñÆ®¸¦ °¡Áö´Â ŸÀÔÀ» ŸÀÔ Ä³½ºÆÃ ÇÏ¿©ºÎÈ£°¡ ¾ø´Â ŸÀÔ¿¡ ³ÖÀ¸·Á°í ÇÏ¸é ¾Õ¿¡¼ ¸»ÇÑ °Í°ú °°Àº ¾Ë°í¸®ÁòÀº ÀüÇô µ¿ÀÛ ÇÏÁö ¾Ê´Â´Ù. unsigned long¿¡ signed longÀÇ ÁÖ¼Ò °ªÀ» ³ÖÀ¸·Á°í ÇÒ °æ¿ì ÄÄÆÄÀÏ·¯¿¡ µû¶ó Á¶±Ý¾¿ ´Ù¸£±â´Â ÇÏÁö¸¸ ´ëºÎºÐÀÇ ÄÄÆÄÀÏ·¯°¡ ºÎÈ£ Á¤º¸¸¦ ÀÒ¾î¹ö¸®Áö ¾Ê±â À§Çؼ ºÎÈ£·Î Á¸ÀçÇÏ´Â ¡®1¡¯ºñÆ®¸¦ ¸ðµÎ ä¿ö ³Ö¾î¹ö¸®±â ¶§¹®¿¡ °ªÀÌ ¿ÏÀüÈ÷ ´Þ¶óÁö´Â °ÍÀÌ´Ù.
»óÀ§ Äڵ忡¼ ŸÀÔ Ä³½ºÆÃÀÌ Â÷ÁöÇÏ´Â Á߿伺ÀÌ Å©Áö ¾ÊÀº °Íó·³ ´À²¸Áú ¼ö µµ ÀÖÁö¸¸, ÀÓº£µðµå³ª Ä¿³Î µå¶óÀ̹ö °³¹ß ½Ã¿¡ »ý°¢º¸´Ù Áö·çÇÑ µð¹ö±ë ÀÛ¾÷À» °¡Á® ¿À°Ô ÇÏ´Â ¿ä¼Ò°¡ µÉ ¼ö ÀÖ´Ù.
ÀÌ·¯ÇÑ Å¸ÀÔ Ä³½ºÆÃÀÇ ÀÚüÀûÀÎ ¹®Á¦ ¸»°íµµ ŸÀÔ Ä³½ºÆÃ¿¡´Â ÄÚµå »ó¿¡ Á¸Àç ÇÏÁö¸¸ °¡½ÃÀûÀ¸·Î ´«¿¡ º¸ÀÌÁö ¾Ê´Â´Ù´Â °ÍÀÌ Áß¿äÇÏ´Ù. ÇÁ·Î±×·¡¸ÓµéÀº °¡²û ÀÚ½ÅÀÇ Äڵ尡 ¸ðµÎ ÀÚ½ÅÀÇ ¼Õ¹Ù´Ú À§¿¡ ÀÖ´Ù°í Âø°¢ÇÏ´Â °æ¿ì°¡ ¸¹´Ù.
´ç¿¬È÷ µð¹ö±ë ½Ã ¸í½ÃµÈ ŸÀÔ Ä³½ºÆÃ Á¤µµ´Â ³í¸®Àû ¹®Á¦ ÇØ°áº¸´Ù ÈξÀ µÞÀüÀÌ´Ù. ÇÏÁö¸¸ µð¹ö±ë ½Ã °©Àڱ⠰ªÀÌ µÚ ¹Ù²î´Â °æ¿ì³ª ¼öÄ¡ÀÇ ºñ±³ »ó¿¡¼ °ªÀÌ Æ²¾îÁö´Â °æ¿ì, ³í¸®Àû ¹®Á¦º¸´Ù ŸÀÔ Ä³½ºÆÃÀÇ Æ÷¼ÇÀÌ ÈξÀ ³ô´Ù.
ŸÀÔ Ä³½ºÆÃÀÌ C++¿¡¼ °¡Áö´Â ÀǹÌ
ŸÀÔÀº C++¿¡¼´Â ÇϳªÀÇ Å¬·¡½º¸¦ ÀǹÌÇÑ´Ù. À̰ÍÀº °´Ã¼ÁöÇâÀûÀÎ ÀÔÀå¿¡¼ º¸¾ÒÀ» ¶§ C¾ð¾îÀÇ Å¸ÀÔ Ä³½ºÆÃ°ú´Â ºñ±³µµ¾È µÉ ¸¸Å Å« ¹®Á¦·Î µ¿ÀÛ ÇÑ´Ù.
¿¹¸¦ µé¾î ¾ÆµéÀ̶ó´Â Ŭ·¡½º¸¦ ¾Æ¹öÁö·ÎºÎÅÍ »ó¼Ó ¹Þ¾Ò´Âµ¥ ŸÀÔ Ä³½ºÆÃÀ» ÀÌ¿ëÇØ À̸¦ ´Ù½Ã ¾Æ¹öÁö·Î ¹Ù²Û´Ù°í »ý°¢Çغ¸ÀÚ. ¾Æ¹öÁö´Â ¾ÆµéÀÌ µÉ ¼ö ÀÖ°í ¾ÆµéÀº ¾Æ¹öÁö·Î ±× º»Áú ÀÚü¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ »ç¶÷À¸·Î ¸¸µé¾î³õÀº CPeopleÀ̶ó´Â Ŭ·¡½º¿¡ CDog dog = (CDog *)people; À̶ó´Â Äڵ带 ½á¼ ±× ÀÚü¸¦ º¯°æÇÒ ¼öµµ ÀÖ´Ù.
ÀÌ´Â ÄÚµå»óÀÇ ¾ð¾îÀûÀÎ ¹®Á¦¸¦ ³Ñ¾î °´Ã¼ º»Áú ÀÚü°¡ º¯°æµÇ´Â ¸»µµ ¾È µÇ´Â Çö»óÀ» ¾ß±â ÇÑ´Ù. »ç¶÷ÀÌ ÇÑ ¼ø°£¿¡ °³³ª µ¿¹°·Î º¯ÇÑ´Ù´Â °ÍÀÌ Á¤»óÀΰ¡? C++¿¡¼´Â ŸÀÔ Ä³½ºÆÃÀÌ Å¸ÀÔÀ» º¯°æÇÏ´Â °ÍÀ» ³Ñ¾î »ç¶÷À» ½Ä¹°·Î »ç¶÷À» µ¿¹°·Î º¯Çü ÇÒ ¼ö Àִ Ű¿öµå¶ó´Â Á¡À» ¸í½ÉÇØ¾ß ÇÑ´Ù.
¾ÆÄ§¿¡ Ãâ±ÙÇÏ¿´´õ´Ï ³» Á÷Àå µ¿·áµéÀº ´Ù ¾îµð °¡°í ÈÃʵ鸸 Ã¥»ó ¾Õ¿¡ ¾É¾Æ ÀÖ´Â ²ÃÀÌ µÈ´Ù. ´Ù½Ã ÇÑ ¹ø ¸»ÇÏÁö¸¸ ÇÁ·Î±×·¡¸Ó´Â ½ÅÀÌ ¾Æ´Ï´Ù.
C++ ½ºÅ¸ÀÏÀÇ Å¸ÀÔ Ä³½ºÆÃ
½Ã°£¿¡ Âѱâ°í »ç¶÷¿¡ Ä¡ÀÌ¸é¼ ÇÁ·ÎÁ§Æ®°¡ ÁøÇàµÇ¸é µÉ¼ö·Ï Á˾ÇÀÎ Äڵ带 ½á³»·Á °¥ ¼ö ¹Û¿¡ ¾ø´Â °ÍÀÌ ¶ÇÇÑ ÇÁ·Î±×·¡¸ÓÀÇ ¼÷¸íÀÌ´Ù. ¿ì¸®´Â C++À» ¾²¸é¼ ¾î¿ ¼ö ¾øÀÌ Å¸ÀÔ Ä³½ºÆÃÀ» °ÇàÇÏ¿©¾ß ÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡ ¿ì¸®´Â ¾î¶»°Ô ±× Ä¡¸íÀûÀÎ ¾àÁ¡À» Á¶±Ý À̳ª¸¶ ÁÙÀ̰í, C++¿¡¼ Áö¿øÇϴ ŸÀÔ Ä³½ºÆÃÀ» »ç¿ëÇØ¾ß ÇÏ´ÂÁö¿¡ ´ëÇØ »ý°¢Çغ¸ÀÚ.
ŸÀÔ Ä³½ºÆ®ÀÇ °æ¿ì¿¡ Å©°Ô ³× °¡ÁöÀÇ ¿ªÇÒÀ» Çϴ ij½ºÆÃÀ¸·Î ºÐ·ù ÇØ º¸ÀÚ(»ç½Ç ÀÌ·¯ÇÑ ³× °¡Áö Á¾·ù´Â C++¿¡¼ Áö¿øÇÑ´Ù).
1) ÀϹÝÀûÀΠŸÀÔ Ä³½ºÆÃ
2) const¿Í °°Àº ÇÑÁ¤ÀÚ Å¸ÀÔ Ä³½ºÆÃ
3) »ó¼Ó °ü°è¸¦ °¡Áø °èÃþ¿¡¼ »ç¿ëÇϴ ij½ºÆÃ
4) ÇÔ¼ö Æ÷ÀÎÅÍÀÇ Ä³½ºÆÃ
¸ÕÀú, ÀÌ·¯ÇÑ Ä³½ºÆÃÀº ¾î¶² ¹æ½ÄÀ¸·Î »ç¿ëÇØ¾ß ÇÏ´ÂÁö¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. º¸Åë ŸÀÔ Ä³½ºÆÃÀ» ÇÒ ¶§¿¡´Â ´ÙÀ½°ú °°Àº Syntax·Î ÁøÇàÇÑ´Ù.
C½ºÅ¸ÀÏÀÇ Å¸ÀÔ Ä³½ºÆÃ : (type) Expression;
ÀÌ·¯ÇÑ Å¸ÀÔ Ä³½ºÆÃÀ» ¾²Áö ¾Ê°í C++ ¿¡¼´Â ¾Æ·¡¿Í °°ÀÌ »ç¿ë ÇÑ´Ù.
C++ ŸÀÔ Ä³½ºÆÃ : static_cast
(Expression);
| |
|
ŸÀÔÀ» À̾߱âÇÏ´Ù º¸´Ï unsigned °ü·Ã ³»¿ëÀÌ ³ª¿Í¼ ÇѸ¶µð ´õ ºÙÀÌ°í ³Ñ¾î°¡°í ÀÚ ÇÑ´Ù. ´ÙÀ½°ú °°Àº unsigned ŸÀÔÀ» »ý°¢Çغ¸ÀÚ. ÀÌ ÇÔ¼ö´Â µð¹ÙÀ̽º µå¶óÀ̹ö ´Ü¿¡¼ ¼ÒÆÃ µÇ¾î µé¾î¿À´Â ¹è¿ÀÇ ÀڷḦ ÀÌÁø Ž»öÇϱâ À§ÇØ ÀÛ¼ºµÆ´Ù.
µð¹ÙÀ̽º µå¶óÀ̹ö °³¹ßÀÚµé, ƯÈ÷ ÆÄÀÏ ½Ã½ºÅÛ °³¹ßÀÚµéÀº unsigned°ªÀ» ¸¹ÀÌ »ç¿ëÇÑ´Ù. ÀÌ´Â ÆÄÀÏ ½Ã½ºÅÛ°ú °ü·ÃµÈ ÁÖ¼Ò Á¤º¸´Â À½¼ö °ªÀ» °¡Áö´Â °æ¿ì°¡ µå¹°±â ¶§¹®ÀÌ´Ù.
Int binary_search(int *arr, long arr_len, int item)
{
unsigned long lower = 0L
unsigned long upper = (unsigned long) arr_len;
unsigned long mid;
ASSERT(arr_len >= 1L, "binary_search expects arrays
of length >= 1");
do {
mid = (lower + upper) / 2L
// ÇöÀç ºñ±³ÇÒ °ªÀ» À§ÇØ ¹ÝÀ» Àß¶ó Áß°£ À妽º °ªÀ» ã´Â´Ù.
if (item < arr[mid])
// ¼ÒÆÃÀÌ µÇ¾î ÀÖÀ¸¹Ç·Î midÀÇ °ªºÎÅÍ ºñ±³ÇÒ ´ë»óÀÇ item °ª°ú ºñ±³ÇÑ´Ù.
lower = mid + 1
// Áß°£Ä¡ º¸´Ù Å©¹Ç·Î lower°ªÀ» mid ¹Ù·Î »óÀ§ À妽º·Î Á¤ÇÑ´Ù.
else if (item < arr[mid])
upper = mid - 1
// Áß°£Ä¡ º¸´Ù ÀÛÀ¸¹Ç·Î upper°ªÀ» ÇöÀç mid°ªº¸´Ù ÇÑ´Ü°è ¾Æ·¡ À妽º·Î ÀâÀ½
else /* exact match */
return mid;
// °ªÀ» ã¾Ò´Ù.
} while (upper < lower);
// Base condition , ¼Ä¡°¡ ³¡³ª¼ Upper¿Í Lower Ç÷¡±×ÀÇ À§Ä¡°¡ µÚÁý¾îÁö¸é Á¾·á
}
´«½ä¹Ì ÀÖ´Â µ¶ÀÚ¶ó¸é ±Ý¹æ ã¾Ò°ÚÁö¸¸ Base condition¿¡¼ ºñ±³ µÇ´Â upper°ªÀº °è¼Ó 1¾¿ °¨¼ÒÇÏÁö¸¸ ÀÌ ¾Ë°í¸®ÁòÀº Àý´ë ¸ØÃßÁö ¾Ê°í ¹«ÇÑ´ë·Î µ¿ÀÛÇÑ´Ù. Á¤´äÀº Äڵ忡 ÀÖÀ¸´Ï Á÷Á¢ ã¾Æº¸ÀÚ.
| | | | | |
| |
¿ì¸®´Â ÀϹÝÀûÀΠŸÀÔ Ä³½ºÆÃÀ» ÇÒ ¶§ static_cast¶ó´Â Ű¿öµå¸¦ »ç¿ë ÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â C¾ð¾îÀÇ ÀϹÝÀûÀΠij½ºÆÃ°ú °°ÀÌ µ¿ÀÛÇÑ´Ù. ´ë½Å ¼Ò½º¿¡¼´Â È®¿¬ÇÏ°Ô ´«¿¡ ¶ç°Ô µÈ´Ù. <¸®½ºÆ® 9>¸¦ »ìÆìº¸ÀÚ.
| <¸®½ºÆ® 9> C++ ½ºÅ¸ÀÏÀÇ Å¸ÀÔ Ä³½ºÆÃ ¿¹ | | | |
longlong address;
long deviceAddress;
int deviceNum;
address = static_cast<long> deviceAddress /
static_cast<long> device_num;
| |
 |
¿ì¸®´Â ÀÌ·¯ÇÑ Ä³½ºÆÃÀ» ÅëÇØ¼ ¾îµå·¹½ºÀÇ ¿¬»ê ½Ã ŸÀÔ Ä³½ºÆÃ¿¡ ´ëÇÑ Á¸Àç°¨À» È®½ÇÈ÷ ´À³¥ ¼ö ÀÖ´Ù. ¶Ç, ´Ù¾çÇÑ Ä³½ºÆÃ ¿¬»êÀÚ¸¦ ÅëÇØ ij½ºÆÃµÇ´Â ¹üÀ§¸¦ 1/4·Î ÁÙ¿©¼ »ý°¢ÇÒ ¼ö ÀÖ´Ù. static_castÀÇ °æ¿ì Ŭ·¡½º³ª ½ºÆ®·°Ã³¸¦ ±âº» ŸÀÔÀ¸·Î º¯È¯ ÇÒ¼ö ¾øÀ¸¸ç, C¿Í °°ÀÌ ±âº» ŸÀÔÀ» ±âº»Å¸ÀÔÀÇ Æ÷ÀÎÅÍ·Î º¯È¯ ÇÒ ¼ö ¾ø´Ù.
´ÙÀ½À¸·Î const_cast¸¦ »ìÆìº¸ÀÚ. ¿ì¸®´Â C++À» »ç¿ëÇÏ¸é¼ volatile µîÀÇ Å°¿öµå¸¦ »ç¿ëÇÏ°Ô µÈ´Ù. ÀÌ´Â ÄÄÆÄÀÏ·¯°¡ ÃÖÀûÈ ÇÒ ¼ö ¾øµµ·Ï Çϴ Ű¿öµåÀÌÀÚ, ij½Ã¸¦ »ç¿ëÇÏÁö ¾Ê°í ÀνºÆ®·°¼ÇÀ» ¸Þ¸ð¸®·ÎºÎÅÍ ¹Ù·Î »ç¿ëÇÏ°Ô ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ·¯ÇÑ volatileÀÇ Å¸ÀÔÀ» º¯È¯Çϱâ À§Çؼ´Â const_cast¸¦ »ç¿ë ÇÒ ¼öÀÖ´Ù.
¼¼ ¹øÂ°·Î dynamic_cast¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. ÀÌ Ä³½ºÆÃÀº ÇÊÀÚ °³ÀÎÀûÀ¸·Î´Â ÁÁ¾ÆÇÏÁö ¾Ê´Â Á¾·ùÀÌ´Ù. ¿ì¸® ¾Æ¹öÁö¸¦ ÇÊÀÚ·Î º¯È¯ÇÏ°Ô Çϴ ij½ºÆÃÀ̱⠶§¹®ÀÌ´Ù. »ó¼Ó°ü°è¸¦ °¡Áø Ŭ·¡½º °ü°è¿¡¼¸¸ ij½ºÆÃÀÌ °¡´ÉÇϸç, ´Ù¸¥ °÷¿¡¼´Â »ç¿ë µÇÁö ¾Ê´Â´Ù.
¸¶Áö¸·Àº reinterpret_castÀÌ´Ù. ÀÌ ¿¬»êÀÚ´Â ÇÔ¼ö Æ÷ÀÎÅÍ µîÀ» º¯°æÇÏ°Ô ÇÒ ¶§ »ç¿ëÇϴµ¥ ÀÌ·¯ÇÑ ¿¬»êÀÚ°¡ Àû¿ëµÈ ÄÚµåµéÀº ÄÄÆÄÀÏ·¯¿¡ µû¶ó ´Ù¸£°Ô µ¿ÀÛÇÑ´Ù. ÇÔ¼ö Æ÷ÀÎÅ͸¦ ÀÚÁÖ »ç¿ëÇÏ´Â ÇÊÀڷμ´Â °³ÀÎÀûÀ¸·Î ¾Æ³¢´Â ŸÀÔ Ä³½ºÆÃÀÌÁö¸¸, ÄÚµåÀÇ À̽ļºÀÌ ºÒ°¡ÇÏ´Ù´Â ÀÌÀ¯·Î Àß »ç¿ë µÇÁö ¾Ê´Â ij½ºÆÃ ¹æ¹ý Áß¿¡ ÇϳªÀÌ´Ù.
¼¼ºÐÈµÈ Å¸ÀÔ Ä³½ºÆÃÀº ŸÀÔ Ä³½ºÆÃÀ» º¸ÆíÈÇϰųª ÇÁ·Î±×·¡¸ÓÀÇ ±ÞÇÑ ¸¶À½À» ÇÕ´çÈ ½ÃŰ´Â µµ±¸°¡ ¾Æ´Ï´Ù. ´ÜÁö ÀϹÝÀûÀΠŸÀÔ Ä³½ºÆÃÀÇ ÆóÇØ¸¦ Á¶±ÝÀÌ¶óµµ ÁÙ¿©ÁÖ±â À§ÇÑ °ÍÀÏ »ÓÀÌ´Ï »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ °¡Àå ÁÁ´Ù.
 | new¿Í malloc
|  |
¸Þ¸ð¸® ÇÒ´çÀ» ÇÒ ¶§ ¿ì¸®°¡ »ç¿ëÇÏ´Â new¸¦ Çѹø »ìÆìº¸ÀÚ. C++ ÇÁ·Î±×·¡¸ÓÀÎ ¿©·¯ºÐ¿¡°Ô Á÷Àå »ó»ç°¡ µÇ¾ú°Ç Çб³ ±³¼ö´ÔÀÌ µÇ¾ú°Ç ¸Þ¸ð¸® ÇÒ´çÀ» ¹ÞÀ» ¶§ ƯÁ¤ ¸Þ¸ð¸® ¹øÁö·ÎºÎÅÍ, ¶Ç´Â ƯÁ¤ ¸Þ¸ð¸® ¹øÁö·ÎºÎÅÍ ÇÒ´ç ¹Þ¾Æ ÀÖ´Â buffer¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» Ç϶ó°í ÇÏ¸é ¿©·¯ºÐÀº ¾î¶»°Ô Çϰڴ°¡?
ÀÌ·¯ÇÑ ÀÛ¾÷Àº ¸Þ¸ð¸® ¸Ê IO¸¦ ¾²´Â °æ¿ì¿¡ À¯È¿ÇÑ ±â¹ýÀÎ ´ö¿¡ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ´Ù. °¡Àå °£´ÜÇÑ ¹æ¹ýÀº C¸¦ °¨½Î´Â Wrapper class¸¦ Çϳª ¸¸µå´Â °ÍÀÌ´Ù. Áï Buffer¸¦ ¹Þ¾Æ¼ °ü·ÃµÈ ÀÚ·á ±¸Á¶ÇüÀ¸·Î ¹ÙÀεù ½ÃŲ µÚ ¹ÝȯÇÏ´Â °ÍÀÌ´Ù.
´ëÃæ ÀÌ·± ½ÄÀÌ µÉ °ÍÀÌ´Ù. ±×·¯¸é ¸ÞŸÁ¤º¸°¡ ÀÖ´Â 2¹ÙÀÌÆ®¿Í µ¥ÀÌÅÍ ¿µ¿ªÀÇ 8¹ÙÀÌÆ®·Î ¹ÙÀεù µÈ´Ù. ÀÌ·¯ÇÑ Å¬·¡½ºÀÇ ¹®Á¦´Â ¹«¾ùÀΰ¡? ¾î¶² Ư¡À» °¡Áø Ŭ·¡½ºÀÇ ³»¿ëÀÌ ¾Æ´Ï¶ó ´ÜÁö ¸Þ¸ð¸® ¿ÀÇÁ¼Â¸¸ÅÀ» ÆÄ½ÌÇϱâ À§ÇØ ¼±¾ðµÈ Á¤Ã¼ ¸ð¸¦ °´Ã¼ÀÌ´Ù.
ÀÌ·± °æ¿ì ¿ì¸®°¡ Àß¶ó¾ß ÇÏ´Â ³»¿ëÀÌ ´õ Ãß°¡ µÈ´Ù¸é ¿ì¸®´Â ÀÌ·¯ÇÑ Å¬·¡½º¿¡ Á¤Ã¼ ¸ð¸¦ Ư¡°ú ¸Þ¼Òµå¸¦ Ãß°¡ ÇÏ°Ô µÈ´Ù. ±×¸®°í »ç½Ç ¿ì¸®°¡ ÇϰíÀÚ ÇÏ´Â °ÍÀº ´ÜÁö ÆÄ½ÌÀÌ ¾Æ´Ï¶ó ƯÁ¤ °³Ã¼°¡ »ý¼ºµÉ ¶§ ±× °³Ã¼ÀÇ ¸Þ¸ð¸® À§Ä¡¸¦ ¹Ì¸® ¼±¾ðµÈ °÷À¸·Î ¹ÙÀεù ÇÏ·Á°í ÇÏ´Â °ÍÀÌ´Ù.
¿ì¸®´Â ¿©±â¼ operator new¿Í new ±×¸®°í replacement new¸¦ »ý°¢Çغ¼ ¼ö ÀÖ´Ù.
C++¿¡¼ Áö¿øµÇ´Â new¿¡ ´ëÇØ¼´Â ¿ì¸®ÀÇ ¹öÀüÀ¸·Î º¯°æÇÒ ¼ö ¾ø´Ù. NewÀÇ µ¿ÀÛÀº Å©°Ô malloc°ú °°ÀÌ Ã»Å© ´ÜÀ§ÀÇ ÃʱâÈ µÇÁö ¾ÊÀº ¸Þ¸ð¸® ´ÜÀ§¸¦ ÇÒ´ç ¹Þ°í ±× ¸Þ¸ð¸®¿¡ Á¤ÀÇµÈ Å¬·¡½ºÀÇ µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ¸Â°Ô ¹ÙÀεùÇÑ µÚ ÃʱâÈ °úÁ¤À» °ÅÃļ ¿ì¸®¿¡°Ô Àü´ÞµÈ´Ù.
±×·¯¸é ¿ì¸®´Â ƯÁ¤ ¸Þ¸ð¸® ¹øÁö¿¡ ÇÒ´çµÈ ¹öÆÛ¸¦ »ç¿ëÇÏ¿© ¿ì¸®¸¸ÀÇ new ¿¬»êÀÚ¸¦ ¸¸µé±â À§ÇÏ¿© ÇÒ ¼ö ÀÖ´Â °ÍÀº Ű¿öµå new°¡ ¾Æ´Ï¶ó operator new¿¡ ´ëÇÑ ¿À¹ö·Îµù(overloading)ÀÌ´Ù.
operator newÀÇ °æ¿ì malloc°ú °°ÀÌ void * ŸÀÔÀÇ ¸Þ¸ð¸® ûũ¸¦ ´øÁ® Áֱ⠶§¹®¿¡ ¿ì¸®°¡ ¿øÇÏ´Â ¹öÆÛ ¿µ¿ªÀ¸·Î ±³È¯ÇÏ¸é µÈ´Ù. Operator new À̿ܿ¡µµ replacement new°¡ Àִµ¥, »ç½Ç ÀÌ replacement new´Â operator newÀÇ ¿øÇü¿¡ ´ÜÁö ¾Æ±Ô¸ÕÆ® Çϳª¸¸ Ãß°¡ÇÏ¿© ¶È °°Àº ¹æ½ÄÀ¸·Î ¿À¹ö·ÎµùÇÑ ¿¬»êÀÚÀÌ´Ù.
»óÀ§ Äڵ忡¼ ±¸ÇöÇß´ø ÆÄ½Ì ¹®Á¦¸¦ °¢ Ŭ·¡½ºÀÇ replacement new »ý¼ºÀÚ¿¡ Àû¿ëÇÏ°í Æ¯Á¤ ¸Þ¸ð¸® ¹øÁöÀÇ buffer¸¦ ¹ÞÀº ±× Ŭ·¡½º¸¦ ¹ÙÀεù ½ÃŰ´Â ±¸Á¶·Î ÀÌ·ç¾îÁö¸é µÉ °ÍÀÌ´Ù.
| <¸®½ºÆ® 10> ¸Þ¸ð¸® ¸ÊÀ» À§ÇÑ À¯Æ¿¸®Æ¼ Ŭ·¡½º | | | |
class CMemoryMap {
struct context {
int meta;
long data;
} // ¸Þ¸ð¸®ÀÇ ¿ÀÇÁ¼Â ¸¸Å Àß¶ó³»±â À§ÇÑ Å¸ÀÔ ¼±¾ð
public :
context * mappedInfo(void * buffer);
}
// ƯÁ¤ ¸Þ¸ð¸® ¹øÁö·ÎºÎÅÍ Context ÀÚ·áÇüÀ¸·Î ¹ÝȯÇÏ¿© ƯÁ¤ ¿ÀÇÁ¼Â
À» Context ŸÀÔó·³ »ç¿ëÇÏ°Ô ÇÑ´Ù.
context * CMemoryMap::mappedInfo(void * buffer)
{
context * tempContext;
return tempContext = static_castbuffer;
}
| |
 |
| <¸®½ºÆ® 11> Replacement new¿¡ ÀÇÇØ ¸Å¸ð¸® ¸Ê ±â´ÉÀÌ ¿À¹ö·Îµù µÈ Class | | | |
class context : public CObject {
.. // ÇÊ¿äÇÑ ¸â¹öµéÀ» ¼±¾ðÇÑ´Ù.
public :
inline void * operator new(size_t, void * buffer)
// new¸¦ ÇÒ´ç ¹ÞÀ» ¶§ ƯÁ¤ ¸Þ¸ð¸® ¹øÁö¸¦ ÀÔ·ÂÀ¸·Î ¹Þ´Â´Ù.
}
| |
 |
ÇÑ ¿¬»êÀÚÀÌ´Ù. »óÀ§ Äڵ忡¼ ±¸ÇöÇß´ø ÆÄ½Ì ¹®Á¦¸¦ °¢ Ŭ·¡½ºÀÇ replacement new »ý¼ºÀÚ¿¡ Àû¿ëÇÏ°í Æ¯Á¤ ¸Þ¸ð¸® ¹øÁöÀÇ buffer¸¦ ¹ÞÀº ±× Ŭ·¡½º¸¦ ¹ÙÀεù ½ÃŰ´Â ±¸Á¶·Î ÀÌ·ç¾îÁö¸é µÉ°ÍÀÌ´Ù.
 | ´À¸²º¸ Æò°¡(Lazy evaluation)
|  |
À̹ø¿¡´Â ´À¸²º¸ Æò°¡(Lazy evaluation)À̶ó´Â ±â¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. ´À¸²º¸ Æò°¡ ¸ÞÄ¿´ÏÁòÀº APLÀ̳ª LISP, Haskell°ú°°Àº ¾ð¾î¿¡ »ç¿ëµÈ´Ù. ÀÌ ¸ÞÄ¿´ÏÁòÀÌ Àû¿ëµÈ ¾ð¾î´Â ½ÇÁ¦ »ç¿ëµÉ ¶§±îÁö Æò°¡(evaluation)¸¦ ÇÏÁö ¾Ê´Â´Ù.
ÇϳªÀÇ ¿¹¸¦ »ìÆìº¸ÀÚ. <¸®½ºÆ® 12>´Â C++°ú HaskellÀÇ µÎ °¡Áö ¾ð¾î·Î ÀÛ¼ºµÈ ¸®½ºÆ®ÀÌ´Ù. Âü°í·Î C++Àº Áï½Ã Æò°¡¸¦ Çϰí HaskellÀº ´À¸²º¸Æò°¡(Lazy evaluation)¸¦ ÇÑ´Ù.
| <¸®½ºÆ® 12> Lazy evaluationÀÌ µÈ´Ù°í °¡Á¤ÇÑ C++ÀÇ ¸®½ºÆ® ÄÚµå | | | |
CList * CList::MakeList()
{
CList * currentList = new CList();
// »õ·Î¿î ¸®½ºÆ® ¿ø¼Ò¸¦ ÇÒ´ç ¹Þ´Â´Ù.
currentList->value = 1;
// ¸®½ºÆ® ¿ø¼Ò °ªÀ» ÃʱâÈ ÇÑ´Ù.
currentList->next = MakeList();
// ¸®½ºÆ®ÀÇ ´ÙÀ½¿¡ Àç±ÍÀûÀ¸·Î ´ÙÀ½ ¸®½ºÆ® ¿ø¼Ò¸¦ ÇÒ´ç ¹Þ´Â´Ù.
return currentList;
}
| |
 |
C·Î ÀÛ¼ºµÈ <¸®½ºÆ® 12>ÀÇ Àǵµ´Â ´ÙÀ½°ú °°´Ù. ¸®½ºÆ®ÀÇ Çì´õ¸¦ Çϳª ¸¸µé°í Çì´õ·ÎºÎÅÍ MakeList()¸¦ Àç±ÍÀûÀ¸·Î È£ÃâÇÏ¿© ¸®½ºÆ®¸¦ ºôµåÇÏ´Â °ÍÀÌ´Ù. C³ª C++, ÀÚ¹Ù¿Í °°Àº ¾ð¾î¿¡ Àͼ÷ÇÑ ÇÁ·Î±×·¡¸Ó´Â ÀÌ Äڵ带 º¸°í ¹Ù·Î ¸»µµ ¾È µÇ´Â ¼Ò¸®¸¦ ÇÒ ¼ö ÀÖ´Ù.
ÀÌ ¸®½ºÆ®¿¡´Â Base conditionÀÌ Á¸Àç ÇÏÁö ¾Ê´Â Å¿ÀÌ´Ù. ÀÌ ¸®½ºÆ®´Â È£Ã⠵Ǵ Áï½Ã °è¼Ó ÀÚ½ÅÀ» ÇÒ´ç ÇÏ´Ù°¡ °á±¹ ¿À¹öÇ÷οì·Î Áװųª ¼Ë´Ù¿î ¹öưÀÌ ´·ÁÁú ÀλýÀÌ´Ù. ÇÏÁö¸¸ HaskellÀÇ °æ¿ì¸¦ º¸ÀÚ.
makeList = 1 : makeList
ÀÌ HaskellÀÇ ÄÚµå´Â C++¿¡¼ ÀÛ¼ºÇÑ ¸®½ºÆ®¿Í °°ÀÌ 1·Î ½ÃÀÛÇÏ´Â ³ëµå¸¦ °¡Áö°í ¸®½ºÆ®¸¦ ¹«ÇÑ È®ÀåÇÏ¿© ºôµå ÇÏ´Â °ÍÀε¥µµ Á¤»óÀûÀ¸·Î µ¿ÀÛÇÑ´Ù. ÀÌÀ¯´Â ¹«¾ùÀϱî? ±×°ÍÀº °ÔÀ¸¸¥ Æò°¡¸¦ Çϱ⠶§¹®ÀÌ´Ù.
Áï ¸®½ºÆ®¸¦ ¼±¾ðÇØµÎ°í µ¿ÀÛ ÇÒ ¶§¸¸ ±× ¸¸ÅÀÇ ¸®½ºÆ®¸¦ »ý¼ºÇÑ´Ù. C++Àº Ű¿öµå ¿¬»êÀÚ¿¡ ´ëÇÏ¿© ºÎºÐÀûÀ¸·Î °ÔÀ¸¸¥ Æò°¡¸¦ ÇÏÁö¸¸ Haskell°ú´Â ±Ùº»ÀûÀÎ ¸ÞÄ¿´ÏÁòÀÌ ´Ù¸£´Ù.
¶Ç ´Ù¸¥ ¿¹¸¦ ÇÑ ¹ø »ìÆìº¸ÀÚ. ¾à°£ ¾ïÁö½º·´Áö¸¸ ¸¸¾à C++¿¡¼ if¶ó´Â Ű¿öµå°¡ ¾ø´Ù°í °¡Á¤ ÇØº¸ÀÚ. ¿ì¸®´Â if¶ó´Â Ű¿öµå°¡ ¾øÀ¸¹Ç·Î if¶ó´Â »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© µ¿ÀÛ½ÃÄÑ¾ß ÇÑ´Ù.
myif(cond, trueValue, falseValue)¶ó´Â »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼ö¸¦ Á¦ÀÛÇÏ¿´´Ù°í °¡Á¤ ÇØº¸ÀÚ. ù ¹øÂ° ÆÄ¶ó¹ÌÅÍ´Â Á¶°Ç¹®À̸ç, µÎ¹øÂ° ÆÄ¶ó¹ÌÅÍ´Â Á¶°ÇÀÌ trueÀÏ ¶§ ¸®ÅÏ µÇ´Â °ª ±×¸®°í ¼¼ ¹øÂ°´Â falseÀÏ ¶§ ¸®ÅÏ µÇ´Â °ªÀÌ´Ù.
ÀÌ myif()·Î ¿ì¸®´Â ifÀÇ ´ëºÎºÐÀ» ó¸® ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°Àº Àç±Í ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù°í °¡Á¤Çغ¸ÀÚ.
fact( x ){
myif(x<=1, 1, x*fact(x-1));
}
ÄÚµå »ó¿¡¼ fact(3); À» ½ÇÇàÇÏ¸é ¾î¶»°Ô µÉÁö Á÷Á¢ »ý°¢ÇØ º¸ÀÚ. ÀÌ ÄÚµå´Â ¼º°øÀûÀ¸·Î µ¿ÀÛÇÏÁö ¸øÇÏ°í ¹«ÇÑ ·çÇÁ¿¡ ºüÁö°Ô µÈ´Ù.
=> myif(3<=1, 1, 3*fact(3-1));
=> myif(3<=1, 1, 3*myif(2<=1,1,2*fact(2-1)));
=> myif(3<=1, 1, 3*myif(2<=1,1,2*myif(1<=1,1,1*fact(1-1));
=> myif(3<=1, 1, 3*myif(2<=1,1,2*myif(1<=1,1,1*myif(...);
À̰ÍÀº C++¿¡¼ ÇÔ¼öÀÇ °æ¿ì returnµÇ´Â Base condition±îÁö ÇÔ¼ö¸¦ ÆîÄ¡±â ¶§¹®¿¡ ÆÄ¶ó¹ÌÅÍ »ó¿¡¼ °è¼Ó Àç±ÍµÇ´Â ¿ì¸®ÀÇ fact ÇÔ¼ö´Â °á±¹ ¿À¹öÇÃ·Î¿ì µÉ °ÍÀÌ´Ù.
ÀÚ ±×·¯¸é ¿ì¸®´Â °ÔÀ¸¸¥ Æò°¡±â¹ýÀ» ¾î¶»°Ô »ç¿ëÇÏ¸é µÉ±î? C++ÀÌ °ÔÀ¸¸¥ Æò°¡ ¸ÞÄ¿´ÏÁòÀ» Áö¿øÇÏÁö´Â ¾ÊÁö¸¸ ¿ì¸®°¡ ±¸ÇöÇØ¼ ¾²Áö ¸øÇÒ ¸¸Å °©°©ÇÑ ¾ð¾î´Â ¾Æ´Ï´Ù.
¸¹ÀÌ »ç¿ë µÇ°í ÀÖ´Â ¿¹·Î Çà·Ä ¿¬»êÀ» »ìÆìº¸ÀÚ. Çà·Ä ¿¬»êÀÇ °æ¿ì »ç¿ëÀÚ°¡ ¿øÇϴ ƯÁ¤ ¿ø¼Ò´Â Àüü Å« Çà¿ Áß¿¡¼ ±ØÈ÷ ÀϺο¡ Áö³ªÁö ¾ÊÀ» °ÍÀÌ´Ù. ¿ì¼± °è¼Ó °è»êÀ» ¹Ì·ç°í ÀÖ´Ù°¡ ¸¶Áö¸·¿¡ ÇÊ¿äÇÑ ºÎºÐ¸¸ °è»êÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù.
¶Ç, Å« Ŭ·¡½ºµéÀÌ ¹èÁ¤(assign)µÇ´Â °æ¿ì ½ÇÁ¦ ¿¬»êÀÌ ÀÌ·ç¾îÁö´Â ½ÃÁ¡±îÁö ¸Þ¸ð¸®¸¦ ÇÒ´ç ÇÏÁö ¾Ê°í ´ÜÁö ÀÚ½ÅÀÌ ¹èÁ¤ µÇ¾ú´Ù´Â »ç½Ç¸¸ ³²°ÜµÎ°í ¾²±â Á¤Ã¥ÀÌ ¿À¸é ±×¶§ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ¿© ¹èÁ¤ÇÏ´Â ¹æ½Äµµ ÀÖ´Ù. ´Ù¸¸ ¿ì¸®°¡ Àß ±¸ºÐÇØ¾ß ÇÒ °ÍÀº ÀÌ °´Ã¼°¡ ÀоîÁö´Â »óȲÀΰ¡ ¾Æ´Ï¸é ½áÁö´Â »óȲÀΰ¡ ÇÏ´Â °ÍÀÌ´Ù.
À̿ʹ ¹Ý´ë µÇ´Â °³³äÀ¸·Î ³Ê¹« ¿ÁßÇÏ´Â Æò°¡(Over eagerevaluation) ±â¹ýÀ» »ý°¢Çغ¼ ¼ö ÀÖ´Ù. ÀÌ´Â »ç½Ç OS³ª ¸¹Àº ¿©Å¸ ¾ÖÇø®ÄÉÀ̼ǿ¡¼ »ç¿ëµÇ´Â ±â¹ýÀ¸·Î ij½Ì(Cashing)°úPrefetching µî¿¡ »ç¿ë µÉ ¼ö ÀÖ´Ù.
¸Þ¸ð¸®ÀÇ ÇÒ´çÀÌ ºó¹øÇÒ °æ¿ì ¿À¹öÇìµå¸¦ ÁÙÀ̱â À§Çؼ Å« ¸Þ¸ð¸® ûũ¸¦ ¹Ì¸® ¹Þ¾Æ ³õ°í ÇÒ´çµÈ memory pool¿¡¼ Á¶±Ý ¾¿ ¶§¾î ÁÖ´Â ±â¹ýÀ¸·Î ¼Óµµ¸¦ °³¼± ÇÒ ¼ö ÀÖ´Ù.
´Ù¸¥ °æ¿ì¿¡¼´Â ÀÚ½ÅÀÇ Å¬·¡½º Áß Bitmap°ú »ç¿ëµÇ´Â ÀϺκÐÀ» ¹Ì¸® ¸Þ¸ð¸®¿¡ ¿Ã·Á³õ°í Bitmap¿¡¼ È÷Æ®°¡ ÀÖÀ» °æ¿ì ¸Þ¸ð¸®¿¡¼ ÀÐ¾î ¿À°Ô ÇÔÀ¸·Î½á ¼Óµµ¸¦ °³¼±ÇÏ°Ô ÇÏ´Â ±â¹ýÀÌ´Ù. ÀÌ·¯ÇÑ ±â¹ýÀº ±âÁ¸ ÆÄÀÏ ½Ã½ºÅÛ °ü·Ã ³í¹®¿¡¼µµ ½±°Ô ¹ß°ß ÇÒ ¼ö ÀÖÀ¸´Ï Çѹø À¥¿¡¼ ã¾Æº¸µµ·Ï ÇÏÀÚ.
 | ¹Ýȯ °ª ÃÖÀûÈ(Return value Optimization) |  |
¿ì¸®´Â °¡²û °ªÀ» ¸®ÅÏ ÇÏ´Â ÇÔ¼ö¸¦ Á¦ÀÛÇØ¾ß ÇÒ °æ¿ì°¡ ÀÖ´Ù. ´ëºÎºÐ ÀÌ·± °æ¿ì¿¡ Á÷°üÀûÀÌÁö ¸øÇÑ Æ÷ÀÎÅÍ ÆÄ¶ó¹ÌÅͳª ·¹ÆÛ·±½º ÆÄ¶ó¹ÌÅ͸¦ »ç¿ëÇÏ¿© ±âº» °ªÀ» ¸®ÅÏ ÇÏ°Ô ¸¶·ÃÀÌ´Ù.
4¹ÙÀÌÆ® Á¤µµÀÇ ±âº» ŸÀÔµéÀ» ó¸®ÇÏ´Â °æ¿ì¿¡´Â ¿À¹öÇìµå°¡ ÀûÁö¸¸ ±× ŸÀÔÀÌ »ç¿ëÀÚ Á¤ÀÇÀΠŬ·¡½º¶ó¸é °¡Áö°í ÀÖ´Â ¸â¹ö¿Í ¸Þ¼Òµåµé¿¡ µû¶ó¼ ¹«½Ã ÇÒ ¼ö ¾ø´Â ¿À¹öÇìµå°¡ µé¾î°£´Ù. ÁÂÇ¥ °ªÀ» °è»êÇÏ´Â CPoint¶ó´Â Ŭ·¡½º¸¦ Á¦ÀÛ ÇÏ¿´´Ù°í °¡Á¤Çϰí Àӽà ¿ÀºêÁ§Æ®ÀÇ »ý¼º °úÁ¤°ú ¹®Á¦¸¦ »ìÆìº¸ÀÚ.
Àӽà ¿ÀºêÁ§Æ®(Temp object)
Á÷°üÀûÀ¸·Î Àӽà ¿ÀºêÁ§Æ®¸¦ ¹ÝÈ¯ÇØ¾ß Çϴ Ŭ·¡½º¸¦ »ý°¢Çغ¸ÀÚ. ´ëÃæ <¸®½ºÆ® 13>°ú °°Àº Äڵ带 °¡Áú °ÍÀÌ´Ù.
| <¸®½ºÆ® 13> ¹Ýȯ °ª ÃÖÀûȰ¡ ÇÊ¿äÇÑClass | | | |
class CPoint {
long x;
long y;
const CPoint operator + (const CPoint &lhs, const
CPoint &rhs);
}
| |
 |
+ ¿¬»êÀ» Çϱâ À§Çؼ ¿ì¸®´Â ¿ÀÆÛ·¹ÀÌÅ͸¦ ¿À¹ö·Îµù ÇÑ´Ù. <¸®½ºÆ® 13>¿¡¼´Â 8¹ÙÀÌÆ®ÀÎ ¸â¹öµéÀÌ Á¸Àç Çϰí ÀÌ·¯ÇÑ °´Ã¼¸¦ ¹Ýȯ ÇÏ´Â Äڵ带 ÀÛ¼ºÇØ¾ß ÇÑ´Ù.
| <¸®½ºÆ® 14> <¸®½ºÆ®13>¿¡ ´ëÇÑ ±¸ÇöºÎ | | | |
const CPoint operator + (const CPoint &lhs, const CPoint
&rhs)
{
CPoint tempPoint;
tempPoint.SetX(lhs.GetX() + rhs.GetX());
tempPoint.SetY(lhs.GetY() + rhs.GetY());
return tempPoint;
}
CPoint a, b, c;
¡¦.
a = b + c;
| |
 |
<¸®½ºÆ® 14>¿Í °°Àº °æ¿ì Àӽà °´Ã¼´Â ´õÇϱ⠿¬»êÀ» À§ÇØ ·ÎÄà ½ºÅÿ¡ ÇÑ °³¸¦ ¹ÝȯÇÏ¸é¼ ÇÑ °³°¡ »ý¼ºµÈ´Ù. º¹»ç´Â returnµÇ¸é¼ Àӽà ¿ÀºêÁ§Æ®·Î Çѹø ±× Àӽà ¿ÀºêÁ§Æ®¸¦ a¿¡ º¹»çÇϱâ À§ÇØ ÇÑ ¹ø ´õ ¸Þ¸ð¸® Ä«Çǰ¡ ÀϾÙ. ÀÌ·± °ÍÀ» ¸·±â À§ÇØ °¡²û ¿ì¸®´Â ´ÙÀ½°ú °°ÀÌ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ¿© Àӽà °´Ã¼ÀÇ »ý¼ºÀ» ¸·´Â´Ù.
const CPoint * operator + (const CPoint &lhs, const CPoint&rhs)
¹°·Ð ³»ºÎ¿¡¼´Â ¸Þ¸ð¸®ÀÇ µ¿Àû ÇÒ´çÀ» ¹Þ¾ÒÀ» °ÍÀÌ´Ù. ÀÌ·± °æ¿ì »ç¿ëÀ» À§Çؼ´Â CPoint = *( a + b); ½ÄÀÌ µÉ °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ¹®ÀåÀº Á÷°üÀûÀÌÁö ¾ÊÀ» »Ó´õ·¯ ¿ÀÆÛ·¹ÀÌÅÍ ¿À¹ö·ÎµùÀÇ ÀÌ Á¡À» ÀüÇô °¡Á® ¿Ã ¼ö ¾ø´Ù.
¶ÇÇÑ ³»ºÎ¿¡¼ µ¿Àû ÇÒ´çÀ» ¹Þ¾Æ »ý¼ºµÈ ¸Þ¸ð¸®ÀÇ ÇØÁ¦´Â ¾îµð¼ ´ã´çÇÒ °ÍÀΰ¡? ÀÌ·¯ÇÑ À߸øµÈ ÄÚµå´Â ·¹ÆÛ·±½º·Î ¹ÝȯÇÏ´Â °æ¿ì¿¡µµ ¸¶Âù°¡Áö´Ù. ¾ðÁ¦ µ±Û¸µ Æ÷ÀÎÅͰ¡ µÉÁö ¸ð¸£´Â ¹®Á¦À̱⠶§¹®ÀÌ´Ù.
¹®Á¦ÀÇ Á¤´äºÎÅÍ ¸»ÇÑ´Ù¸é, ¸¶Ä¡ º¯¼ö¿¡ ´ëÇÏ¿© DMA¿Í °°Àº µ¿ÀÛÀ» ÇÏ´Â °Íó·³ º¸ÀÌ°Ô ÇÏ´Â ÄÄÆÄÀÏ·¯ ÃÖÀûÈ ¿É¼ÇÀÌ Àִµ¥ À̰ÍÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù.
RVO ¹Ýȯ °ª ÃÖÀûÈ
Àӽà °´Ã¼ º¯¼ö·ÎºÎÅÍ ¿ì¸®°¡ »ý¼ºÇÑ º¯¼öÀÇ °ªÀ» À̵¿ÇØÁÖ´Â ÀÌ ¼ÒÇÁÆ®¿þ¾î DMA°°Àº ±â¼úÀº º° °Í ¾Æ´Ï´Ù. ´ÜÁö C++ÀÇ ÄÄÆÄÀÏ·¯°¡ ÃÖÀûȸ¦ ÇØÁÖ´Â °ÍÀÌ´Ù. À̸¦ RVO(Return Value Optimization)¶ó°í ºÎ¸£±âµµ ÇÑ´Ù.
¿ø·¡ °ªÀ» ¹ÝȯÇÏ´Â ¸Þ¼Òµå´Â Àӽà °´Ã¼ÀÇ »ý¼ºÀ» ¸·À» ¾ð¾îÀûÀÎ ¹æ¹ýÀº ¾ø´Ù.
ÇÏÁö¸¸ ƯÁ¤ ÆÐÅÏ(³»ºÎ °ªÀ» ¹ÝȯÇÏ¿© ¹èÁ¤ÇØ¾ß ÇÏ´Â °æ¿ì)¿¡¼ Àӽà °´Ã¼ º¯¼ö°¡ ÇÊ¿ä ¾ø´Â °ÍÀº »ç¶÷ÀÇ ´«À¸·Îµµ ¾ÆÁÖ ½±°Ô ½Äº°ÇÒ¸¸ÇÑ ³»¿ëÀÎ ¸¸Å °¢ ÄÄÆÄÀÏ·¯¸¶´Ù ÀÌ·¯ÇÑ ÃÖÀûȸ¦ ÁøÇàÇØÁØ´Ù. ÄÄÆÄÀÏ·¯´Â ÀÌ·¯ÇÑ °æ¿ì¿¡ Àӽà °´Ã¼ ¸ðµÎ¸¦ ¾ø¾Ö°í ¸Þ¼Òµå °á°ú °ªÀ» ÇÒ´çµÈ ¸Þ¸ð¸®¿¡ Á÷Á¢ ³Ö¾î ÃʱâÈ ÇØÁØ´Ù.
´Ü, ¿ì¸®°¡ ÀÌ·¯ÇÑ RVO¸¦ Á¦´ë·Î »ç¿ëÇÏ·Á¸é ¾î¶°ÇÑ ¹æ½ÄÀ¸·Î ¹®¹ýÀ» »ç¿ë ÇßÀ» ¶§ ÄÄÆÄÀÏ·¯°¡ ÃÖÀûȸ¦ ó¸® ÇØÁÖ´Â °¡ÀÌ´Ù.
Const CPoint operator + ( const CPoint &lhs, const CPoint &rhs)
{
return CPoint(lhs.GetX() + rhs.GetX(), lsh.GetY() +rhs.GetY());
}
ÀÌ ÄÚµå´Â ³»ºÎ¿¡¼ »ý¼ºÀÚ¸¦ ÅëÇØ return ÇÏ´Â °æ¿ìÀÌ´Ù. ÀÌ·² ¶§¿¡´Â »ç¿ëÀÚ°¡ Á¤ÀÇÇÑ ¸Þ¸ð¸®¿¡ Á÷Á¢ °ªÀ» ³Ö¾î¼ ÃʱâÈÇϱ⠶§¹®¿¡ ¸¹Àº ÇÁ·Î±×·¡¸Ó°¡ ÇÏ´Â °í¹ÎÀ» ÇØ°áÇÒ ¼ö ÀÖ´Ù.
»ç½Ç ÀÌ·¯ÇÑ ±â¹ýÀº C++ ÀÚü¿Í´Â °ü°è°¡ ¾øÁö¸¸ ÄÄÆÄÀÏ·¯´Â »ý°¢º¸´Ù ¿ì¸®°¡ ¸ð¸£´Â °÷¿¡¼ ¸¹Àº ÃÖÀûȸ¦ ÇÏ°Ô µÈ´Ù. ¾î¶² Äڵ忡¼´Â ÇÁ·Î±×·¡¸Ó°¡ ÀǵµÇÏÁö ¾ÊÀº ÃÖÀûȸ¦ ÇÏ°Ô µÇ°í, ¾î¶² °÷¿¡¼´Â ÇÁ·Î±×·¡¸Ó°¡ ÃÖÀûÈ ÇØÁÖ´Â ÄÚµå ÆÐÅÏÀ» ¸ô¶ó¼ ÃÖÀûȸ¦ ³õÄ¡°Ô µÇ±âµµ ÇÑ´Ù.
±×·± Àǹ̿¡¼ ÃÖÀûÈ ¹®Á¦¿¡ ¹Î°¨ÇÑ ÇÁ·Î±×·¡¸Ó¶ó¸é ÀÌ·¯ÇÑ ÄÄÆÄÀÏ·¯ µ¿ÀÛ ¹æ½ÄÀ» ÀÌÇØÇÏ´Â °ÍÀÌ Å« µµ¿òÀÌ µÈ´Ù.
 | ´Ù¸¥ ¼ÒÇÁÆ®¿þ¾î ¿£Áö´Ï¾î¸µ ¹æ¹ý·Ð°úÀÇ ºñ±³ |  |
´Ù¸¥ SE°³¹ß ¹æ¹ý·Ð°ú °´Ã¼ ÁöÇâÀû C++¸¦ ºñ±³ÇÏ¿© Âù¹ÝÀ» °¡¸®ÀÚ´Â °ÍÀº ¾Æ´Ï´Ù. ´Ù¸¸, ¸¶¹«¸® ±ÛÀ» ¾²±â¿¡ ¾Õ¼ ÇÊÀÚ°¡ µ¶ÀÚ¿¡°Ô ´çºÎÇÏ°í ½ÍÀº À̾߱⸦ Àá½Ã ÇϰíÀÚ ÇÑ´Ù.
CBSE(Component Base Software Engineering)¿¡¼´Â OOP¸¦ ³Ê¹« ÀÛÀº ´ÜÀ§ÀÇ ±¸Ã¼È¸¦ ÅëÇØ º¹Àâµµ°¡ ¿Ã¶ó°¡°í Àç»ç¿ë¼ºÀÌ ÇöÀúÈ÷ ¶³¾îÁ® ½ÇÆÐÇÑ °ÍÀ̶ó°í À̾߱â ÇÑ´Ù. ÇÏÁö¸¸ CBSE ¶ÇÇÑ Æ¯Á¤ÇÑ ±ÔÄ¢À̳ª ÀýÂ÷ ¾øÀÌ ´ÜÁö Å« Á¶°¢È¸¦ ÇÏ´Â °ÍÀ¸·Î ÀÀ¿ëµÇ°í ÀÖ´Â ½ÃÁ¡¿¡¼ ±× ÄÄÆ÷³ÍÆ® °£ÀÇ º¹Àâµµ´Â Àç»ç¿ë¼ºÀ» ÇöÀúÇÏ°Ô ¶³¾î¶ß¸®´Â ¿ä¼Ò¶ó°í »ý°¢ÇÑ´Ù.
¿äÁò Å« À̽´°¡ µÇ°í ÀÖ´Â Æ÷Ç×°ø´ë °±³Ã¶ ±³¼ö´ÔÀÇ FORM(Feature Oriented Reuse Method) ¹ÙÅÁÀÇ PLSE(Product Line Software Engineering) ¹æ¹ý·Ð ¼¼¹Ì³ª¿Í ´ëÈ ¼Ó¿¡¼ Àç¹ÌÀÖ´Â »ç½ÇÀ» ¹ß°ß ÇÒ ¼ö ÀÖ´Ù.
±×°ÍÀº »ç¹°ÀÇ Æ¯Â¡ Áß À¯»ç¼º°ú ÀÌÁú¼º¿¡ ´ëÇÑ ±¸ºÐÀÌ´Ù. PLSEÀÇ ¸ðµ¨¸µ ±â¹ý¿¡¼ ÀÌ·¯ÇÑ À¯»ç¼º°ú ÀÌÁú¼º¿¡ ´ëÇÑ ±¸ºÐÀ¸·ÎºÎÅÍ Á¦ÀÛÇÏ°Ô µÇ´Â ÄÄÆ÷³ÍÆ®µéÀº OOP¿¡¼ ÁÁÀº ¹æÇâÀ¸·Î ÀÀ¿ëµÉ ¼ö ÀÖ´Ù.
C++À» Có·³ »ç¿ëÇÏ´Â °ÍÀ» ¸·°í ÀÖÁö ¾ÊµíÀÌ OOP¸¦ ÀýÂ÷Àû ¾ð¾îó·³ »ç¿ëÇÏ´Â °Í ¶ÇÇÑ ¾î´À ´©±¸µµ ¸·Áö ¾ÊÀ»»Ó´õ·¯ ¸·À» ¼ö ÀÖ´Â ±ÔÄ¢ ¶ÇÇÑ ¾ø´Ù.
¿ì¸®´Â °³¹ß¿¡ ¾Õ¼ PLSE¿Í À¯»çÇÏ°Ô °¢ ¿ÀºêÁ§Æ® °£ÀÇ Æ¯Â¡À» ºÐ·ùÇϰí ÀÌ·¯ÇÑ Æ¯Â¡µé »çÀÌ¿¡¼ À¯»çÇÑ ±×·ì°ú ÀÌÁú¼ºÀ» °¡Áø ±×·ìÀ» ³ª´©°í ÀÎÅÍÆäÀ̽º¿Í »ó¼Ó °ü°è¸¦ Á» ´õ ±¸Ã¼È ÇÏ¿©ÀÚÄ© OOP ÇÁ·Î±×·¡¹ÖÀÌ ÀýÂ÷Àû ÇÁ·Î±×·¡¹ÖÀ¸·Î Èê·¯°¡´Â °ÍÀ» ÀÇ½Ä ÇÏ¿© ¸·À» ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÊÀÚ°¡ ´çºÎ ÇÏ°í ½ÍÀº ³»¿ëÀº ´Ü ÇѰ¡ÁöÀÌ´Ù.
Ŭ·¡½º¸¦ ´ÜÁö Ãß»óÈ °³³äÀ¸·Î¸¸ »ç¿ëÇÑ´Ù¸é, Ä¿´Ù¶õ ³×¸ðÇü ¹Ú½º¸¦ ´ÜÁö Àß°Ô Âɰ³´Â ÀýÂ÷Àû ÇÁ·Î±×·¡¹Ö ±â¹ý ¹Û¿¡ µÉ ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù. ÀÌ ±Û¿¡¼µµ ¸î ¹øÀ̳ª À̾߱â ÇßÁö¸¸, ±×³É ´Þ·Áµé¾î ÄÚµùÇϱâ Àü¿¡ °°Àº Ư¡À» Àß ¹¾î¼ ÀÎÅÍÆäÀ̽º¸¦ Çü¼ºÇϰí È®À强À» °í·ÁÇÏ¿© Á¶±ÝÀÌ¶óµµ µðÀÚÀÎÀ» ÇØºÁ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù.
Áö±Ý±îÁö ¿ì¸®´Â C++¿¡ ´ëÇÑ ¿ø·ÐÀûÀÎ À̾߱âºÎÅÍ ÃÖÀûÈ ¹®Á¦±îÁö »ìÆìº¸¾Ò´Ù. »ç½Ç ºÐ·®ÀÌ Á¤ÇØÁø ÀÌ ±Û¿¡¼´Â ÇÊÀÚ°¡ÇÏ°í ½ÍÀº À̾߱⳪ ÇÊÀÚ¿¡°Ô ¿µÇâÀ» ¹ÌÄ£ OOP °í¼öµéÀÌ °Á¶ÇÏ´Â À̽´µé¿¡ ´ëÇØ 1/10µµ ´Ù ¸ø Àû¾ú´Ù.
ÇÊÀÚ´Â C++¿¡ ´ëÇØ »ó´çÈ÷ ¾Æ³¢´Â ÆíÀÌ´Ù. Áö±Ý Çö¾÷¿¡¼´Â µµÀúÈ÷ Àû¿ë ÇÒ ¼ö ¾ø´Â ¹®¹ý°ú ÆÐ·¯´ÙÀÓÀÓ¿¡µµ ºÒ±¸Çϰí ÀÓº£µðµå ºÐ¾ß¿¡¼µµ Â÷Ãû °´Ã¼ ÁöÇâÀû ¼º°ÝÀÇ ÄÚµå·Î ¿Å°Ü °¡°í ÀÖ´Ù.
±× ÀÌÀ¯´Â ¼µÎ¿¡ ¸»Çß´ø °´Ã¼ ÁöÇâÀû ¹®Á¦ ÇØ°á¹ý°ú ±Í°á µÈ´Ù. TRUE¿Í FALSE, ÀÌ µÎ °¡Áö·Î Áõ¸í µÇÁö ¾Ê´Â ¼öÇÐÀû ¾ð¾î¸¦ °¡Áö°í Ç®Áö ¸øÇÏ´Â ¹®Á¦µéÀÌ ±×¸¸Å ÀÓº£µðµå ÂÊ¿¡¼ ¸¹¾ÆÁö´Â Å¿ÀÌ´Ù. ¶Ç, ÀÓº£µðµå ¼ÒÇÁÆ®¿þ¾î¸¦ ÅëÇØ »îÀ» À̾´Â ÇÁ·Î±×·¡¸ÓµéÀÌ ¸¹Àº °Íµµ ±× ÀÌÀ¯ Áß ÇϳªÀÌ´Ù.
ÇÊÀÚ°¡ ¸¶Ä¡¸é¼ ÇϰíÀÚ ÇÏ´Â À̾߱â´Â, C++¿¡¼ ÃÖÀûȸ¦ ÁøÇà ÇÑ´Ù´Â °ÍÀº Æ÷ÀÎÅͳª ¸Þ¸ð¸® ¹ÙÀεù¿¡ ´ëÇÑ È¿À²ÀûÀÎ ÀÌ¿ë º¸´Ù ±× ¾ð¾î°¡ °¡Áö´Â º»ÁúÀûÀÎ ÆÐ·¯´ÙÀÓÀ» Àß ÀÌ¿ëÇÏ¿©¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ¹°·Ð C¿¡¼ Æ÷ÀÎÅÍ¿Í ¸Þ¸ð¸®´Â ¾ÆÁÖ Àç¹ÌÀÖ´Â À̽´¸¦ °¡Áø °ÍµéÀÌ ¸¹´Ù.
±×·± °Í µéÀº ´ÙÀ½¿¡ ÀÓº£µðµå ÂÊ C¾ð¾î »ç¿ëÀ» ¼Ò°³ÇÒ ±âȸ°¡ µÇ¸é ´Ù·ç±â·Î Çϰí, ±Ã±ÝÇÑ »çÇ×ÀÌ ÀÖÀ¸¸é ÇÊÀÚÀÇ È¨ÆäÀÌÁö³ª ¸ÞÀÏÀ» ÅëÇØ¼µµ Áú¹®ÇÒ ¼ö ÀÖ´Ù.
ÃÖ±Ù¿¡ ÇÊÀÚ´Â °è¼Ó ¸Þ¸ð¸® °ü·Ã ¼ÒÇÁÆ®¿þ¾î¸¦ Á¦ÀÛÇϰí, À©µµ¿ì µð¹ÙÀ̽º µå¶óÀ̹ö ÂÊÀ» ¸¹ÀÌ °³¹ß Çϰí ÀÖ¾î C++ÀÇ °Á¡ÀÌ µÇ´Â °Í µéÀ» ¸¹ÀÌ Àؾ°í ÀÖ´Â ½ÇÁ¤ÀÌÁö¸¸, µ¶ÀÚ ¿©·¯ºÐÀº °´Ã¼ ÁöÇâÀÇ ÂüµÈ ¹¦¹Ì¸¦ Á» ´õ ´À³¢±æ ¹Ù¶õ´Ù. @
Âü°íÀÚ·á
1. Addison Welsey, Scott Meyers. More Effective C++
2. ¹è¿òÅÍ, ±èűÕÀú, K±³¼öÀÇ °´Ã¼ÁöÇâ À̾߱â
* ÀÌ ±â»ç´Â ZDNet KoreaÀÇ Á¦ÈÞ¸ÅüÀÎ ¸¶ÀÌÅ©·Î¼ÒÇÁÆ®¿þ¾î¿¡ °ÔÀçµÈ ³»¿ëÀÔ´Ï´Ù.