31-1.ÇÔ¼ö ÅÛÇø´

31-1-°¡.ŸÀÔ¸¸ ´Ù¸¥ ÇÔ¼öµé

C++Àº ¿©·¯ °¡Áö °³¹ß ¹æ¹ýÀ» Áö¿øÇÏ´Â ¸ÖƼ ÆÐ·¯´ÙÀÓ ¾ð¾î¶ó°í Çϴµ¥ Àû¾îµµ ´ÙÀ½ ¼¼ °¡Áö ¹æ¹ýÀ¸·Î °³¹ßÀ» ÇÒ ¼ö ÀÖ´Ù.

 

¨ç ±¸Á¶Àû ÇÁ·Î±×·¡¹Ö : C¾ð¾î¿¡¼­¿Í ¸¶Âù°¡Áö·Î ÇÔ¼ö À§ÁÖ·Î ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. C++ÀÌ C¾ð¾îÀÇ °è½ÂÀÚÀ̹ǷΠC¾ð¾îÀÇ °³¹ß ¹æ¹ýÀ» Áö¿øÇÏ´Â °ÍÀº ´ç¿¬ÇÏ´Ù.

¨è °´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹Ö : ĸ½¶È­, Ãß»óÈ­¸¦ ÅëÇØ Çö½Ç ¼¼°èÀÇ »ç¹°À» ¸ðµ¨¸µÇÒ ¼ö ÀÖÀ¸¸ç »ó¼Ó°ú ´ÙÇü¼ºÀ» Áö¿øÇϱâ À§ÇÑ ¿©·¯ °¡Áö ¾ð¾îÀû ÀåÄ¡¸¦ Á¦°øÇÑ´Ù.

¨é ÀϹÝÈ­ ÇÁ·Î±×·¡¹Ö : ÀÓÀÇ Å¸ÀÔ¿¡ ´ëÇØ µ¿ÀÛÇÏ´Â ÇÔ¼ö³ª Ŭ·¡½º¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. °´Ã¼ ÁöÇ⺸´Ù Àç»ç¿ë¼º°ú ÆíÀǼºÀÌ ´õ ¿ì¼öÇÏ´Ù.

 

ÀϹÝÈ­ ÇÁ·Î±×·¡¹ÖÀº ÁÖ·Î C++ ÅÛÇø´¿¡ ÀÇÇØ Áö¿øµÇ¸ç C++ Ç¥ÁØ ¶óÀ̺귯¸®°¡ ÀϹÝÈ­ÀÇ ÁÁÀº ¿¹ÀÌ´Ù. ÅÛÇø´Àº C++ÀÌ ÀϹÝÈ­¸¦ À§ÇØ Á¦°øÇÏ´Â °¡Àå ±âº»ÀûÀÎ ¹®¹ýÀ̹ǷΠÅÛÇø´¿¡ ´ëÇÑ ÀÌÇØ´Â C++ Ç¥ÁØ ¶óÀ̺귯¸®ÀÎ STLÀ» ÀÌÇØÇϱâ À§ÇÑ ¹®¹ýÀû Åä´ë°¡ µÈ´Ù. °³³äÀº °£´ÜÇÏÁö¸¸ ½ÇÁ¦ Àû¿ëµÉ ¶§´Â ±²ÀåÈ÷ º¹ÀâÇÑ ÇüŸ¦ ¶ç±â ¶§¹®¿¡ ¿ø¸®¸¦ ÀÌÇØÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù.

ÅÛÇø´(Template)À̶õ ¹«¾ùÀΰ¡¸¦ ¸¸µé±â À§ÇÑ ÇüƲÀ̶ó´Â ¶æÀÌ´Ù. ÇÃ¶ó½ºÆ½ ¸ðÇüÀ» ¸¸µé±â À§ÇÑ ±ÝÇüÀ̶óµç°¡ ÁÖ¹°À» ¸¸µé±â À§ÇÑ ¸ð·¡Æ²ÀÌ ÇüƲÀÇ ¿¹À̸ç Á» ´õ ÀÌÇØÇϱ⠽¬¿î ¿¹¸¦ µéÀÚ¸é ºØ¾î»§À» ¸¸µå´Â »§Æ²À» µé ¼ö ÀÖ´Ù. ÅÛÇø´Àº ¸ð¾ç¿¡ ´ëÇÑ º»À» ¶° ³õÀº °ÍÀ̸ç ÇÑ ¹ø¸¸ Àß ¸¸µé¾î ³õÀ¸¸é ÀÌÈĺÎÅÍ Àç·á¸¸ Áý¾î ³Ö¾î¼­ ¶È°°Àº ¸ð¾çÀ» ¼Õ½±°Ô ¿©·¯ ¹ø Âï¾î ³¾ ¼ö ÀÖ´Ù. ±æ°Å¸®ÀÇ ºØ¾î»§ Àå»çµéÀ» º¸¸é »§Æ²¿¡ ¹Ð°¡·ç¿Í ÆÏ¸¸ Áý¾î ³Ö¾î¼­ ¶È°°ÀÌ »ý±ä ºØ¾î»§À» ¾ó¸¶µçÁö Âï¾î ³»°í ÀÖÁö ¾ÊÀº°¡?

ÅÛÇø´ÀÇ ¶Ç ´Ù¸¥ Ư¡Àº Áý¾î ³Ö´Â Àç·á¿¡ µû¶ó °á°ú¹°µéÀÌ Á¶±Ý¾¿ ´Þ¶óÁø´Ù´Â °ÍÀÌ´Ù. ±ÝÇü¿¡ ÇÃ¶ó½ºÆ½À» Áý¾î ³ÖÀ¸¸é ÇÃ¶ó½ºÆ½ Á¦Ç°ÀÌ ³ª¿À°í °í¹«¸¦ Áý¾î ³ÖÀ¸¸é °í¹«·Î µÈ Á¦Ç°À» ¸¸µé ¼ö ÀÖ´Ù. ¹æÆ²¿¡µµ ¹Ð°¡·ç¸¦ ³ÖÀ¸¸é ºØ¾î»§ÀÌ ³ª¿ÀÁö¸¸ Âý½Ò °¡·ç¸¦ ³ÖÀ¸¸é À׾À̶ó´Â Á» ´õ ºÎ°¡°¡Ä¡°¡ ³ôÀº »óǰÀÌ ¸¸µé¾îÁø´Ù. Á¦Ç°ÀÇ ¸ð¾ç¸¸ °°À» »ÓÀÌÁö ³»¿ë¹°Àº Á¶±Ý¾¿ ´Þ¶óÁö´Â °ÍÀÌ´Ù.

ÇÔ¼ö ÅÛÇø´Àº ÇÔ¼ö¸¦ ¸¸µé±â À§ÇÑ ÇüƲÀ̶ó°í »ý°¢ÇÏ¸é µÈ´Ù. ºñ½ÁÇÑ ¸ð¾çÀÇ ÇÔ¼öµéÀ» ¿©·¯ °³ ¸¸µé¾î¾ß ÇÑ´Ù¸é °¢ ÇÔ¼öµéÀ» ¸Å¹ø Á÷Á¢ Á¤ÀÇÇÒ ÇÊ¿ä¾øÀÌ ÇÔ¼ö ÅÛÇø´À» ÇÑ ¹ø¸¸ ¸¸µé¾î ³õ°í ÀÌ ÅÛÇø´À¸·ÎºÎÅÍ ÀÏ·ÃÀÇ ÇÔ¼öµéÀ» Âï¾î³¾ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â ÀÏÁ¤ÇÑ Å¸ÀÔÀÇ º¯¼ö µÎ °³ÀÇ °ªÀ» ±³È¯ÇÏ´Â Swap ÇÔ¼ö¸¦ ¸¸µç´Ù.

 

¿¹ Á¦ : SwapFunc

#include <Turboc.h>

 

void Swap(int &a, int &b)

{

     int t;

     t=a;a=b;b=t;

}

 

void Swap(double &a, double &b)

{

     double t;

     t=a;a=b;b=t;

}

 

void main()

{

     int a=3,b=4;

     double c=1.2,d=3.4;

     Swap(a,b);

     Swap(c,d);

     printf("a=%d,b=%d\n",a,b);

     printf("c=%f,d=%f\n",c,d);

}

 

main¿¡¼­ º¯¼ö ¿©·¯ °³¸¦ ¼±¾ðÇÑ ÈÄ Swap ÇÔ¼ö·Î °ªÀ» ±³È¯Çϰí È®ÀÎÀ» À§ÇØ Ãâ·ÂÇß´Ù. Á¤¼öÇü, ½Ç¼öÇü º¯¼öµéÀÌ ¾ÖÃÊ¿¡ ¼±¾ðµÈ °ª°ú ¹Ý´ë·Î ¹Ù²î¾î ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

 

a=4,b=3

c=3.400000,d=1.200000

 

µÎ °ªÀ» ±³È¯ÇÏ´Â ¾Ë°í¸®ÁòÀº ¹«Ã´ °£´ÜÇØ¼­ µÎ º¯¼öÀÇ °ªÀ» ¼­·Î ´ëÀÔÇϱ⸸ ÇÏ¸é µÈ´Ù. ´Ü, ¸ÕÀú ´ëÀÔ¹Þ´Â º¯¼öÀÇ °ªÀ» Àá½Ã ÀúÀåÇØ ³õ±â À§ÇÑ Àӽà º¯¼ö Çϳª°¡ ÇÊ¿äÇÏ¸ç ½ÇÀμöÀÇ °ªÀ» ¹Ù²ã¾ß ÇϹǷΠÆ÷ÀÎÅͳª ·¹ÆÛ·±½º¸¦ ÀÌ¿ëÇÑ ÂüÁ¶ È£ÃâÀ» ÇØ¾ß ÇÑ´Ù. À½·á¼öÀÜÀÇ Äݶó, »çÀÌ´Ù¸¦ ±³È¯ÇÏ°í ½Í´Ù¸é ºó ÄÅ Çϳª°¡ ¹Ýµå½Ã ÇÊ¿äÇÏ¸ç ±³È¯ ´ë»ó¿¡ µû¶ó ºó ÄÅÀÇ ¸ð¾ç°ú Å©±âµµ ´Þ¶ó¾ß ÇÑ´Ù. À½·á¼ö¸¦ ±³È¯Çϱâ À§ÇÑ ºóÄÅÀ¸·Î ¼ÒÁÖÀÜÀº Àû´çÇÏÁö ¸øÇÏ´Ù. ¿¹Á¦¿¡´Â Á¤¼ö¿¡ ´ëÇÑ Swap, ½Ç¼ö¿¡ ´ëÇÑ Swap ÇÔ¼ö°¡ ÀÛ¼ºµÇ¾î Àִµ¥ ±³È¯ ´ë»óÀÇ Å¸ÀÔÀÌ ´Þ¶óÁö´õ¶óµµ ¾Ë°í¸®ÁòÀº µ¿ÀÏÇÏ¸ç º»Ã¼ ³»¿ë Áß ´Þ¶óÁö´Â ºÎºÐÀº Àμö¿Í ÀÓ¼ö º¯¼öÀÇ Å¸ÀÔ »ÓÀÌ´Ù.

int¿Í double¿Ü¿¡ char, long, »ç¿ëÀÚ Á¤ÀÇ ±¸Á¶Ã¼ µîÀÇ º¯¼öµéµµ ±³È¯ÇØ¾ß ÇÑ´Ù¸é °¢ ŸÀÔ¿¡ ´ëÇØ¼­µµ Swap ÇÔ¼ö¸¦ ÀÏÀÏÀÌ ¸¸µé¾î¾ß ÇÒ °ÍÀÌ´Ù. ¾Ë°í¸®ÁòÀº °°Áö¸¸ Àμö¿Í Àӽà º¯¼öÀÇ Å¸ÀÔÀÌ ´Ù¸£¹Ç·Î ÇÑ ÇÔ¼ö·Î ÀÓÀÇ Å¸ÀÔÀÇ º¯¼ö¸¦ ±³È¯ÇÒ ¼ö´Â ¾ø´Ù. ±×³ª¸¶ C++Àº ¿À¹ö·ÎµùÀ» Áö¿øÇϹǷΠÇÔ¼öÀÇ À̸§ÀÌ¶óµµ ¶È°°ÀÌ ÀÛ¼ºÇÒ ¼ö ÀÖÁö¸¸ C¿¡¼­´Â ÇÔ¼öÀÇ À̸§¸¶Àúµµ SwapInt, SwapDouble µîÀ¸·Î ´Þ¶ó¾ß ÇÑ´Ù. ÀÌ·± ºñ½ÁÇÑ ÇÔ¼öµéÀ» ÀÏÀÏÀÌ ¸¸µé¾î¾ß ÇÑ´Ù´Â °ÍÀº ¹«Ã´ Â¥Áõ³ª´Â ÀÏÀÌ¸ç ¸¸µç ÈÄ¿¡ ¼öÁ¤Çϱ⵵ ¹ø°Å·Ó´Ù. ±×·¡¼­ ÀÌ ÇÔ¼öµéÀ» ÅëÇÕÇÒ ¼ö ÀÖ´Â ¿©·¯ °¡Áö ¹æ¹ýµéÀ» »ý°¢ÇØ º¼ ¼ö ÀÖ´Ù.

 

 ¿ì¼± ÀμöÀÇ Å¸ÀÔÀ» #defineÀ̳ª typedef·Î Á¤ÀÇÇÑ ÈÄ º»Ã¼¿¡¼­´Â ÀÌ ¸ÅÅ©·Î¸¦ ÂüÁ¶ÇÏ´Â ¹æ¹ýÀ» »ý°¢ÇÒ ¼ö ÀÖ´Ù. ±³È¯ ´ë»ó¿¡ ´ëÇÑ Áß°£ ŸÀÔÀ» Á¤ÀÇÇϰí ÇÔ¼ö¿¡¼­´Â Áß°£ ŸÀÔÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÇÊ¿äÇÒ ¶§¸¶´Ù ¸ÅÅ©·ÎÀÇ Å¸ÀÔ Á¤ÀǸ¦ ¹Ù²Ù¸é ÀÓÀÇÀÇ Å¸ÀÔ¿¡ ´ëÇØ ±³È¯ÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù. ´ÙÀ½ÀÌ ±× ¿¹ÀÌ´Ù.

 

#define SWAPTYPE int

void Swap(SWAPTYPE &a, SWAPTYPE &b)

{

     SWAPTYPE t;

     t=a;a=b;b=t;

}

 

SWAPTYPEÀÌ int·Î Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ÇöÀç Swap ÇÔ¼ö´Â intÇü º¯¼ö°ªÀ» ±³È¯ÇÏÁö¸¸ SWAPTYPEÀ» double·Î ¹Ù²Ù¸é ½Ç¼ö¸¦ ±³È¯ÇÏ´Â ÇÔ¼ö·Î Å»¹Ù²ÞÇÒ °ÍÀÌ´Ù. ±×·¯³ª ÀÌ ¹æ¹ýÀº ÄÄÆÄÀÏÇÒ ¶§¸¶´Ù ÇÊ¿äÇÑ Å¸ÀÔÀ¸·Î ¹Ù²ã¾ß ÇÑ´Ù´Â Á¡ÀÌ ºÒÆíÇÏ´Ù. ½±°Ô ¸»Çؼ­ ÀÚµ¿ÀÌ ¾Æ´Ï¶ó ¼öµ¿ÀÌ´Ù. ¶ÇÇÑ ÀÌ ¹æ¹ýÀº ÇϳªÀÇ ¸ÅÅ©·Î°¡ µÎ °³ÀÇ °ªÀ» °¡Áú ¼ö ¾øÀ¸¹Ç·Î °¢ ŸÀÔÀ» ±³È¯ÇÏ´Â ÇÔ¼ö°¡ µ¿½Ã¿¡ µÎ °³ ÀÌ»ó Á¸ÀçÇÒ ¼ö ¾ø´Ù´Â Á¡ÀÌ ¹®Á¦´Ù.

 µÎ ¹øÂ°·Î ´ÙÀ½°ú °°Àº ¸ÅÅ©·Î ÇÔ¼ö¸¦ ¾²´Â ¹æ¹ýµµ °¡´ÉÇÏ´Ù. Áß°£ ŸÀÔÀ» ¾²´Â °ÍÀÌ ¾Æ´Ï¶ó ¾Æ¿¹ ÇÔ¼ö ÀÚü¸¦ ¸ÅÅ©·Î·Î ¸¸µé¾î¼­ ÇÊ¿äÇÒ ¶§¸¶´Ù Àü°³ÇÏ´Â ¹æ½ÄÀÌ´Ù.

 

#define SWAP(T,a,b) { T t;t=a;a=b;b=t; }

 

ÀÌ ¸ÅÅ©·Î ÇÔ¼ö´Â Àß µ¿ÀÛÇϱâ´Â ÇÏÁö¸¸ ¸ÅÅ©·Î³»¿¡¼­ Àӽà ºí·Ï º¯¼ö t¸¦ ¼±¾ðÇØ¼­ »ç¿ëÇϹǷΠ±³È¯ ´ë»óÀÇ Å¸ÀÔÀ» ÀÏÀÏÀÌ °¡¸£ÃÄ Áà¾ß ÇÑ´Ù. ±×·¡¾ß Àӽà º¯¼ö tÀÇ Å¸ÀÔÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Ù. Á¤¼ö°ª a¿Í b¸¦ ¹Ù²Ù·Á¸é SWAP(int, a, b)·Î È£ÃâÇØ¾ß Çϴµ¥ ù ¹øÂ° Àμö·Î Àü´ÞµÇ´Â int¶ó´Â ŸÀÔÀÌ ¿ØÁö ºÒÆíÇØ º¸À̰í ÃÖ¼Ò ÀÇ»ç Ç¥½Ã ¿øÄ¢¿¡µµ ¸ÂÁö ¾Ê´Ù. ±º´õ´õ±â¾øÀÌ ±³È¯ÇϰíÀÚ ÇÏ´Â ´ë»ó¸¸ ÁöÁ¤ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù.

¶ÇÇÑ ¸ÅÅ©·Î ÇÔ¼ö´Â ġȯµÉ ¶§¸¶´Ù Äڵ尡 ¹Ýº¹µÇ¹Ç·Î ÇÁ·Î±×·¥ÀÌ Ä¿Áö´Â °íÁúÀûÀÎ ¹®Á¦°¡ ÀÖ´Ù. ±×·¡¼­ º¹ÀâÇÑ µ¿ÀÛÀ» ÇÏ´Â ÇÔ¼ö¿¡´Â ºÎÀûÇÕÇÏ¸ç °ªÀ» ±³È¯ÇÏ´Â SWAP Á¤µµÀÇ Ãʰ£´Ü ÇÔ¼ö¿¡¸¸ Àû¿ëÇÒ ¼ö ÀÖ´Ù. °Ô´Ù°¡ ¸ÅÅ©·Î ÇÔ¼ö´Â ¿©·¯ °¡Áö ºÎÀÛ¿ëµµ ¸¹¾Æ ÀϹÝÀûÀÎ ¿ëµµ·Î ¾²±â¿¡´Â ÇѰ谡 ÀÖ´Ù.

 À̿ܿ¡ void *¶ó´Â ÀϹÝÀûÀÎ Æ÷ÀÎÅÍ Å¸ÀÔÀ» ¾²´Â ¹æ¹ýµµ ÀÖ´Ù. void *´Â ÀÓÀÇÀÇ Å¸ÀÔÀ» °¡¸®Å³ ¼ö ÀÖÀ¸¹Ç·Î ±³È¯ ´ë»ó º¯¼öÀÇ ¹øÁö¸¦ Àü´ÞÇÏ¿© ¸Þ¸ð¸® º¹»çÇÏ´Â ¹æ½ÄÀ¸·Î µÎ °ªÀ» ±³È¯ÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦·Î ÀÌ·± ¹æ½ÄÀÌ °¡´ÉÇÑÁö ¿¹Á¦¸¦ ¸¸µé¾î º¸ÀÚ.

 

¿¹ Á¦ : SwapVoid

#include <Turboc.h>

 

void Swap(void *a,void *b,size_t len)

{

     void *t;

     t=malloc(len);

     memcpy(t,a,len);

     memcpy(a,b,len);

     memcpy(b,t,len);

     free(t);

}

 

void main()

{

     int a=3,b=4;

     double c=1.2,d=3.4;

     Swap(&a,&b,sizeof(int));

     Swap(&c,&d,sizeof(double));

     printf("a=%d,b=%d\n",a,b);

     printf("c=%f,d=%f\n",c,d);

}

 

½ÇÇà °á°ú´Â ¾ÕÀÇ ¿¹Á¦¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇѵ¥ µÎ °³ÀÇ ÇÔ¼ö¸¦ ¸¸µéÁö ¾Ê¾Æµµ ÇÑ ÇÔ¼ö·Î Á¤¼öÇü°ú ½Ç¼öÇüÀ» ¸ðµÎ ±³È¯ÇÒ ¼ö ÀÖ´Ù. ÇÔ¼ö°¡ Æ÷ÀÎÅ͸¦ ¿ä±¸ÇϹǷΠȣÃâÃø¿¡¼­´Â ±³È¯´ë»ó¿¡ ÀÏÀÏÀÌ &¸¦ ºÙ¿© ¹øÁö¸¦ ³Ñ±â°í ¶ÇÇÑ ±æÀ̵µ °°ÀÌ Àü´ÞÇØ¾ß ÇÑ´Ù. void &¶ó´Â °ÍÀº ¾øÀ¸¹Ç·Î ÀÓÀÇ Å¸ÀÔÀ» Àü´ÞÇÒ ¶§´Â ·¹ÆÛ·±½º¸¦ ¾µ ¼ö ¾ø°í Æ÷ÀÎÅ͸¸ °¡´ÉÇÏ´Ù. void *´Â ÀÓÀÇÀÇ º¯¼ö°¡ ÀÖ´Â ¹øÁö¸¦ °¡¸®Å³ ¼ö ÀÖ¾î ŸÀÔ¿¡ ´ëÇÑ Á¤º¸´Â ºÒÇÊ¿äÇÏÁö¸¸ ´ë½Å ±æÀÌ¿¡ ´ëÇÑ Á¤º¸°¡ ¾øÀ¸¹Ç·Î ±æÀ̵µ °°ÀÌ Àü´ÞÇÏ´Â ¼ö¹Û¿¡ ¾ø´Ù.

Swap ÇÔ¼ö ³»ºÎµµ ´Ù¼Ò º¹ÀâÇѵ¥ ÀÓÀÇÀÇ Å¸ÀÔÀ» ±³È¯ÇØ¾ß ÇϹǷΠ´Ü¼øÇÑ ´ëÀÔÀ¸·Î´Â °ªÀ» ±³È¯ÇÒ ¼ö ¾øÀ¸¸ç º¯¼ö°¡ Â÷ÁöÇϰí ÀÖ´Â ¿µ¿ª³¢¸® ¸Þ¸ð¸® º¹»ç¸¦ ÅëÇØ ±³È¯ÇØ¾ß ÇÑ´Ù. À̶§ ±³È¯À» À§ÇÑ Àӽà º¯¼öµµ ¹Ýµå½Ã µ¿ÀûÀ¸·Î ÇÒ´çÇØ¾ß ÇÏ´Â ºÎ´ãÀÌ Àִµ¥ ±³È¯ ´ë»óÀÇ ±æÀ̸¦ ÀüÇô ¿¹ÃøÇÒ ¼ö ¾øÀ¸¹Ç·Î ÃæºÐÇÑ ±æÀÌÀÇ Àӽà ¹öÆÛ·Î´Â ¾ÈÀüÇÏÁö ¾Ê´Ù. 16¹ÙÀÌÆ® Á¤µµ¸é ¿Ø¸¸ÇÑ ±âº» ŸÀÔÀº ´Ù ±³È¯ÇÒ ¼ö ÀÖ°ÚÁö¸¸ 1000¹ÙÀÌÆ®Â¥¸® ±¸Á¶Ã¼°¡ Àü´ÞµÉÁöµµ ¸ð¸£±â ¶§¹®¿¡ µ¿ÀûÀ¸·Î ÇÒ´çÇØ¾ß ÇÑ´Ù. ÀÌ ¹æ¹ý´ë·Î¶ó¸é ¾ÆÁÖ Å« ¹è¿­±îÁöµµ ±³È¯ÇÒ ¼ö ÀÖ´Ù.

void *¸¦ ÀÌ¿ëÇÑ ±³È¯ ÇÔ¼ö´Â ³ª¸§´ë·Î ½Ç¿ë¼ºµµ ÀÖ°í ±×¾ß¸»·Î ÀÓÀÇÀÇ Å¸ÀÔÀ» ´Ù·ê ¼ö ÀÖ´Ù´Â Á¡¿¡¼­ ÈǸ¢ÇÏ´Ù. ½ÇÁ¦·Î ÀÌ·± ÇÔ¼ö´Â Á¾Á¾ »ç¿ëµÇ¸ç ÅÛÇø´º¸´Ù ´õ ¿ì¿ùÇÑ ¸éµµ ÀÖ´Ù. ÇÏÁö¸¸ ÀÏÀÏÀÌ &¸¦ ºÙ¿© ¹øÁö¸¦ Àü´ÞÇØ¾ß ÇÏ°í ±æÀ̱îÁö °¡¸£ÃÄ ÁÖ¾î¾ß ÇÑ´Ù´Â Á¡¿¡¼­ ºÒÆíÇϱâ´Â ¸¶Âù°¡ÁöÀÌ´Ù.

 

¿©·¯ °¡Áö ´ë¾ÈµéÀÌ ÀÖÁö¸¸ ½ÅÅëÇÏ°Ô ¸¶À½¿¡ µå´Â ¹æ¹ýÀº µüÈ÷ ¾ø´Ù. Áö±Ý±îÁö ÀÌ ¹®Á¦¿¡ ´ëÇÑ ÀüÅëÀûÀÎ ÇØ°á¹æ¹ýÀº º¹»çÇÑ ÈÄ ¿øÇÏ´Â ºÎºÐÀ» ¼öÁ¤ÇÏ´Â À̸¥¹Ù ¸öÀ¸·Î ¶¼¿ì±â ÀÛÀü¹Û¿¡ ¾ø¾ú´Ù. ¾à°£ÀÇ ¼ö°í¸¸ °¨¼öÇϸé Swap(int, int)¸¦ º¹»çÇÑ ÈÄ Swap(double, double)À̳ª Swap(unsigned, unsigned)¸¦ ¾ó¸¶µçÁö ¸¸µé ¼ö ÀÖ´Ù. º¹»çµÈ ¼ö¸¸Å­ ÇÔ¼ö°¡ ´Ã¾î³ª±â´Â ÇÏÁö¸¸ Àû¾îµµ È£ÃâÇÒ ¶§¸¶´Ù ÇÔ¼öÀÇ º»Ã¼°¡ ¹Ýº¹µÇÁö´Â ¾ÊÀ¸¸ç ¿ÏÀüÇÑ ÇÔ¼öÀ̹ǷΠÁö¿ªº¯¼ö¸¦ ÀÚÀ¯·Ó°Ô ¾µ ¼ö ÀÖ°í º¹ÀâÇÑ µ¿ÀÛµµ ¾ó¸¶µçÁö °¡´ÉÇÏ´Ù. & ¿¬»êÀÚ°¡ ¾ø¾îµµ µÇ¸ç ±æÀÌ Á¤º¸µµ Àü´ÞÇÒ Çʿ䰡 ¾ø´Ù.

±×·¯³ª ÀÌ·± ÀüÅëÀûÀÎ ¹æ¹ýÀº ÇÊ¿äÇÑ Å¸ÀÔÀÌ ´Ã¾î³¯ ¶§¸¶´Ù »ç¶÷ÀÇ ÀÛ¾÷À» ÇÊ¿ä·Î ÇϹǷΠ»ý»ê¼ºÀÌ ¶³¾îÁö¸ç ¶ÇÇÑ ÀϺθ¦ ¼öÁ¤ÇÏÁö ¾Ê´Â ½Ç¼öÀÇ °¡´É¼ºÀÌ ÀÖ¾î À§ÇèÇϱ⵵ ÇÏ´Ù. ÀÌ·± º¹»ç ÈÄ ¼öÁ¤ ÀÛ¾÷À» ÄÄÆÄÀÏ·¯°¡ ´ë½Å ÇÏ´Â ¹®¹ýÀû ÀåÄ¡°¡ ¹Ù·Î ÇÔ¼ö ÅÛÇø´ÀÌ´Ù. ¿øÇÏ´Â ÇÔ¼öÀÇ ¸ð¾çÀ» ÅÛÇø´À¸·Î µî·ÏÇØ µÎ¸é ÇÔ¼ö¸¦ ¸¸µå´Â ³ª¸ÓÁö ÀÛ¾÷Àº ÄÄÆÄÀÏ·¯°¡ ¾Ë¾Æ¼­ ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â Swap ÇÔ¼ö¸¦ ÅÛÇø´À¸·Î Á¤ÀÇÇÑ °ÍÀÌ´Ù.

 

¿¹ Á¦ : SwapTemp

#include <Turboc.h>

 

template <typename T>

void Swap(T &a, T &b)

{

     T t;

     t=a;a=b;b=t;

}

 

struct tag_st {int i; double d; };

void main()

{

     int a=3,b=4;

     double c=1.2,d=3.4;

     char e='e',f='f';

     tag_st g={1,2.3},h={4,5.6};

 

     printf("before a=%d, b=%d\n",a,b);

     Swap(a,b);

     printf("after a=%d, b=%d\n",a,b);

     Swap(c,d);

     Swap(e,f);

     Swap(g,h);

}

 

Swap ÇÔ¼ö ÅÛÇø´À» Á¤ÀÇÇÑ ÈÄ Á¤¼ö, ½Ç¼ö, ¹®ÀÚ¿­, ±¸Á¶Ã¼ µî¿¡ ´ëÇØ Swap ÇÔ¼ö¸¦ È£ÃâÇØ º¸¾Ò´Ù. ÀÓÀÇÀÇ Å¸ÀÔ¿¡ ´ëÇØ Swap ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖµÇ ´Ü ÇÔ¼ö ³»¿¡¼­ Áö¿ªÀûÀ¸·Î ¼±¾ðµÈ ŸÀÔÀº »ç¿ëÇÒ ¼ö ¾ø´Ù. Áö¿ª ŸÀÔÀº ÇÔ¼ö ³»ºÎ¿¡¼­¸¸ ¾²´Â °ÍÀ̹ǷΠÇÔ¼ö°£ÀÇ Åë½Å¿¡´Â »ç¿ëÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ±×·¡¼­ tag_st ±¸Á¶Ã¼¸¦ Àü¿ªÀ¸·Î ¼±¾ðÇߴµ¥ ÀÌ ±¸Á¶Ã¼ ¼±¾ð¹®ÀÌ main ÇÔ¼ö ¾È¿¡ Æ÷ÇÔµÇ¸é ¿¡·¯·Î 󸮵ȴÙ. ¸ðµç ŸÀÔ¿¡ ´ëÇØ¼­ Á¦´ë·Î µ¿ÀÛÇϴµ¥ Á¤¼öÇüÀÇ a, b¿¡ ´ëÇØ¼­¸¸ °á°ú¸¦ È®ÀÎÇØ º¸¾Ò´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù. ³ª¸ÓÁö ŸÀԵ鵵 Ãâ·ÂÇØ º¸¸é Àß ±³È¯µÉ °ÍÀÌ´Ù.

 

before a=3, b=4

after a=4, b=3

 

ÇÔ¼ö ÅÛÇø´À» Á¤ÀÇÇÒ ¶§´Â Ű¿öµå template ´ÙÀ½¿¡ <> °ýÈ£¸¦ ¾²°í °ýÈ£¾È¿¡ ÅÛÇø´À¸·Î Àü´ÞµÉ Àμö ¸ñ·ÏÀ» ³ª¿­ÇÑ´Ù. ÅÛÇø´ Àμö ¸ñ·Ï¿¡´Â Ű¿öµå typename ´ÙÀ½¿¡ ÇÔ¼öÀÇ º»Ã¼¿¡¼­ »ç¿ëÇÒ Å¸ÀÔÀÇ À̸§ÀÌ ¿À´Âµ¥ ÇÔ¼öÀÇ Çü½Ä Àμö¿Í ºñ½ÁÇÑ ±â´ÉÀ» ÇÑ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù. ÀÌ À̸§Àº ¸íĪ ±ÔÄ¢¿¡¸¸ ¸ÂÀ¸¸é ¸¶À½´ë·Î ÀÛ¼ºÇÒ ¼ö ÀÖÀ¸³ª ÀϹÝÀûÀ¸·Î T³ª TypeÀ̶ó´Â ªÀº À̸§À» ¸¹ÀÌ »ç¿ëÇÑ´Ù. À̾îÁö´Â ÇÔ¼öÀÇ º»Ã¼¿¡¼­ ÅÛÇø´ Àμö¸¦ ÂüÁ¶ÇÏ¿© ±¸Ã¼ÀûÀÎ Äڵ带 ÀÛ¼ºÇÑ´Ù.

ÇÔ¼ö È£ÃâºÎ¿¡¼­ int ŸÀÔÀ» »ç¿ëÇßÀ¸¸é T´Â int°¡ µÇ¸ç ÇÔ¼ö º»Ã¼¿¡¼­ ÂüÁ¶ÇÏ´Â T´Â ¸ðµÎ int°¡ µÉ °ÍÀÌ´Ù. ¸¶Âù°¡Áö·Î doubleÀÌ Àü´ÞµÇ¸é T´Â doubleÀÌ µÇ°í char°¡ Àü´ÞµÇ¸é T´Â char°¡ µÈ´Ù. È£ÃâºÎ¿¡¼­ Àü´ÞµÇ´Â ½ÇÁ¦ ŸÀÔÀ» ÅÛÇø´ Á¤ÀÇ¿¡¼­ Ç¥±âÇϱâ À§ÇÑ ÀÓ½ÃÀûÀÎ À̸§ÀÌ ¹Ù·Î typename TÀÎ °ÍÀÌ´Ù. ÅÛÇø´ÀÌ »§Æ²À̶ó¸é T´Â »§Æ²¿¡ Áý¾î³Ö´Â Àç·á¿¡ ºñÀ¯µÉ ¼ö ÀÖ´Ù.

ÅÛÇø´ Àμö ¸ñ·Ï¿¡´Â Ű¿öµå typename ´ë½Å class¸¦ ¾µ ¼öµµ ÀÖÀ¸¸ç ±¸Çü ÄÄÆÄÀÏ·¯µéÀº ÀÌ ÀÚ¸®¿¡ class¸¦ »ç¿ëÇß¾ú´Ù. template <typename T>¿Í template <class T>´Â °°Àº Ç¥ÇöÀÌ´Ù. ¾îÂ÷ÇÇ Å¬·¡½ºµµ ŸÀÔÀ̰í int, double µîµµ ÀÏÁ¾ÀÇ Å¬·¡½ºÀ̹ǷΠÀÇ¹Ì»ó Æ²¸®Áö´Â ¾ÊÁö¸¸ ÀÌ·¸°Ô µÇ¸é ¹Ýµå½Ã Ŭ·¡½º ŸÀÔ¸¸ °¡´ÉÇÑ °Íó·³ º¸¿© ¿ÀÇØÀÇ ¼ÒÁö°¡ ÀÖ´Ù. ±×·¡¼­ »õ·Î °³Á¤µÈ Ç¥ÁØ¿¡´Â Á» ´õ ÀϹÝÀûÀÎ Àǹ̸¦ °¡Áö´Â typenameÀ̶ó´Â Ű¿öµå°¡ »õ·Î µµÀԵǾúÀ¸¸ç °¡±ÞÀûÀ̸é class ´ë½Å typenameÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ÇöÀç class¶ó´Â Ű¿öµå´Â Ŭ·¡½º¸¦ Á¤ÀÇÇÒ ¶§¸¸ ¾²µµ·Ï ±ÇÀåµÈ´Ù.

ÅÛÇø´À̶õ ÄÄÆÄÀÏ·¯°¡ ¹Ì¸® µî·ÏµÈ ÇÔ¼öÀÇ ÇüƲÀ» ±â¾ïÇØ µÎ¾ú´Ù°¡ ÇÔ¼ö°¡ È£ÃâµÉ ¶§ ½ÇÁ¦ ÇÔ¼ö¸¦ ¸¸µå´Â ÀåÄ¡ÀÌ´Ù. ±×·¸´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÔ¼ö¸¦ ¸¸µå´Â ¸ÅÅ©·Î ÇÔ¼ö¸¦ Á¤ÀÇÇÏ´Â °Í°ú´Â ¾î¶² Á¡ÀÌ ´Ù¸¦±î?

 

#define MakeSwap(T) \

void Swap(T &a, T &b)\

{\

     T t;\

     t=a;a=b;b=t;\

}

 

struct tag_st {int i; double d; };

MakeSwap(int)

MakeSwap(double)

MakeSwap(char)

MakeSwap(tag_st)

 

MakeSwap ¸ÅÅ©·Î ÇÔ¼ö·Î ŸÀÔ T¸¦ Àü´ÞÇϸé T °ª µÎ °³¸¦ ±³È¯ÇÏ´Â ÇÔ¼ö SwapÀÌ ¸¸µé¾îÁø´Ù. ¹®¹ýÀûÀ¸·Î´Â ºÐ¸íÈ÷ °¡´ÉÇÑ ¹æ¹ýÀ̸ç ÅÛÇø´°ú °³³ä»ó ºñ½ÁÇÏÁö¸¸ µÎ ¹æ¹ýÀº Áö¿ø ÁÖüÀÇ ·¹º§ÀÌ ´Ù¸£´Ù. ¸ÅÅ©·Î ÇÔ¼ö´Â Àü󸮱Ⱑ ó¸®ÇÏÁö¸¸ ÅÛÇø´Àº ÄÄÆÄÀÏ·¯°¡ Á÷Á¢ ó¸®ÇÑ´Ù. Àü󸮱â´Â Áö½Ã´ë·Î ¼Ò½º¸¦ À籸¼ºÇÒ »ÓÀ̹ǷΠ°³¹ßÀÚ°¡ ÇÊ¿äÇÑ Å¸ÀÔ¿¡ ´ëÇØ ÀÏÀÏÀÌ ¸ÅÅ©·Î¸¦ Àü°³ÇØ¾ß ÇϹǷΠ¼öµ¿ÀÌÁö¸¸ ÅÛÇø´Àº È£Ã⸸ Çϸé ÄÄÆÄÀÏ·¯°¡ ¾Ë¾Æ¼­ ÇÔ¼ö¸¦ ¸¸µå´Â ÀÚµ¿½ÄÀ̹ǷΠ¸ÅÅ©·Î ÇÔ¼öº¸´Ù´Â ¿ª½Ã ÇѼö À§ÀÌ´Ù.

±×·¡µµ MakeSwap ¸ÅÅ©·Î ÇÔ¼ö´Â ±×·² µíÇØ º¸À̱â´Â Çϴµ¥ ÇÔ¼ö´Â ±ÃÇÑ´ë·Î ÀÌ ¹æ¹ýÀ» ¾µ ¼öµµ ÀÖ´Ù. ±×·¯³ª °°Àº ¹æ¹ýÀ¸·Î Ŭ·¡½º¸¦ Á¤ÀÇÇÏ´Â ¸ÅÅ©·Î ÇÔ¼ö´Â ¸¸µé ¼ö ¾ø´Ù. ¿Ö³ÄÇϸé ÇÔ¼ö´Â À̸§ÀÌ °°¾Æµµ ŸÀÔÀÌ ´Ù¸£¸é ¿À¹ö·ÎµùÇÒ ¼ö ÀÖÁö¸¸ Ŭ·¡½º´Â ¿À¹ö·ÎµùÀÌ ¾ÈµÇ±â ¶§¹®ÀÌ´Ù. ## ¿¬»êÀÚ¸¦ ¾²¸é °¡´ÉÀº ÇϰÚÁö¸¸ ŸÀÔ¿¡ µû¶ó Ŭ·¡½ºÀÇ À̸§ÀÌ ¸Å¹ø ´Þ¶óÁö¹Ç·Î ¾²±â¿¡ ºÒÆíÇÏ´Ù.

ÈçÇÏÁö´Â ¾ÊÁö¸¸ ÅÛÇø´ Àμö ¸ñ·Ï¿¡¼­ µÎ °³ ÀÌ»óÀÇ Å¸ÀÔÀ» Àü´Þ¹ÞÀ» ¼öµµ ÀÖ´Ù. ÇÔ¼öÀÇ Çü½Ä Àμö °³¼ö¿¡ Á¦ÇÑÀÌ ¾øµíÀÌ ÇÔ¼ö º»Ã¼¿¡¼­ º¯È­°¡ »ý±æ¸¸ÇÑ Å¸ÀÔÀÌ µÑ ÀÌ»óÀ̶ó¸é ÇÔ¼ö ÅÛÇø´µµ ¿©·¯ °³ÀÇ Àμö¸¦ °¡Áú ¼ö ÀÖ´Ù. À̶§´Â ¿øÇϴ¸¸Å­ typenameÀ» ¹Ýº¹Ç쵂 °¢ ŸÀÔÀÇ À̸§Àº ±¸ºÐÇÒ ¼ö ÀÖµµ·Ï ´Ù¸£°Ô ÀÛ¼ºÇØ¾ß ÇÑ´Ù.

 

template <typename T1, typename T2>

 

´ç¿¬ÇÑ ¾ê±â°¡ µÇ°ÚÁö¸¸ ÇÔ¼ö ÅÛÇø´ Á¤ÀÇ´Â ÇÔ¼ö È£ÃâºÎº¸´Ù ¸ÕÀú ¿Í¾ß ÇÑ´Ù. ÇÔ¼ö ÅÛÇø´ Á¤Àǹ®¿¡ ÀÇÇØ ÄÄÆÄÀÏ·¯´Â ÀÓÀÇÀÇ Å¸ÀÔ TÀÇ °ªÀ» ±³È¯ÇÏ´Â ÇÔ¼öÀÇ ¸ð¾çÀ» SwapÀ̶ó´Â À̸§À¸·Î ±â¾ïÇÒ °ÍÀÌ´Ù. ¸¸¾à mainÀ» ´õ ¾ÕÂÊ¿¡ µÎ°í ½Í´Ù¸é ¼ø¼­¸¦ ¹Ù²Ü ¼ö ÀÖµÇ ÅÛÇø´¿¡ ´ëÇÑ ¿øÇüÀ» È£ÃâºÎÀÇ ¾ÕÂÊ¿¡ ¹Ì¸® ¼±¾ðÇØ¾ß ÇÑ´Ù. ÅÛÇø´ ÇÔ¼öÀÇ ¿øÇüÀº template Ű¿öµåºÎÅÍ ½ÃÀÛÇØ¼­ ÅÛÇø´ ÇÔ¼öÀÇ ¼±µÎ¸¦ ±×´ë·Î °¡Á®°£ ÈÄ ¼¼¹ÌÄݷи¸ ºÙÀÌ¸é ¸¸µé ¼ö ÀÖ´Ù.

 

template <typename T>

void Swap(T &a, T &b);

 

ÀÏ¹Ý ÇÔ¼ö¿Í ¿øÇüÀ» ¸¸µå´Â ¹æ¹ýÀº µ¿ÀÏÇѵ¥ ¿øÇü ¼±¾ðÀÌ µÎ ÁÙ¿¡ °ÉÄ£´Ù´Â Á¡¿¡¼­ ´Ù¼Ò ¾î»öÇØ º¸À̱â´Â ÇÑ´Ù. ¹°·Ð ÇÑ ÁÙ¿¡ ºÙ¿©½áµµ º° ÀÌ»óÀº ¾ø´Ù. ÀÌ ÇÔ¼ö ÅÛÇø´À¸·ÎºÎÅÍ ½ÇÁ¦ ÇÔ¼ö°¡ ¾î¶»°Ô ¸¸µé¾îÁö´ÂÁö´Â ´ÙÀ½ Ç׿¡¼­ ¿¬±¸ÇØ º¸ÀÚ.