16-3.ÀζóÀÎ ÇÔ¼ö

ÀÌ Àý ÀÌÈÄÀÇ ÀζóÀÎ ÇÔ¼ö, µðÆúÆ® Àμö, ¿À¹ö·ÎµùÀº C++¿¡¼­ »õ·Î Ãß°¡µÈ ±â´ÉµéÀÌ´Ù. µû¶ó¼­ C ÄÄÆÄÀÏ·¯¿¡¼­´Â ÄÄÆÄÀϵÇÁö ¾Ê´Â´Ù.

16-3-°¡.ÀζóÀÎ ÇÔ¼ö

ÇÔ¼ö´Â ¹Ýº¹µÈ µ¿ÀÛÀ» Á¤ÀÇÇÔÀ¸·Î½á ÇÁ·Î±×·¥ÀÇ ±âº» ºÎǰÀ» ±¸¼ºÇÏ´Â ´ÜÀ§°¡ µÈ´Ù. ÀԷ°ú Ãâ·Â, ³»ºÎ µ¿ÀÛÀ» ÇÑ ¹ø¸¸ Àß ÀÛ¼ºÇØ ³õÀ¸¸é ÇÊ¿äÇÒ ¶§¸¶´Ù ºÒ·¯¼­ ¶È°°Àº(¶Ç´Â ºñ½ÁÇÑ) ÀÛ¾÷À» ¿©·¯ ¹ø ¼öÇàÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â Àμö·Î Àü´ÞµÈ nº¸´Ù ÀÛÀº Á¤¼ö ³­¼ö¸¦ Çϳª »ý¼ºÇÑ ÈÄ µ¹·Á ÁÖ´Â randfunc¶ó´Â ÇÔ¼ö¸¦ Á¤ÀÇÇϰí main¿¡¼­ ÀÌ ÇÔ¼ö¸¦ ¼¼ ¹ø È£ÃâÇÑ´Ù.

 

¿¹ Á¦ : randfunc

#include <Turboc.h>

 

int randfunc(int n)

{

     return rand()%n;

}

 

void main()

{

     int i,j,k;

 

     i=randfunc(10);

     j=randfunc(100);

     k=randfunc(50);

     printf("³­¼ö=%d,%d,%d\n",i,j,k);

}

 

¸Å¹ø ¹üÀ§¸¦ ´Ù¸£°Ô ÇÏ¿© È£ÃâÇߴµ¥ ½ÇÇà °á°ú´Â "³­¼ö=1,67,34"°ú °°À¸¸ç ÄÄÆÄÀÏ·¯¿¡ µû¶ó Á¶±Ý¾¿ ´Þ¶óÁú ¼ö ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥ÀÇ µ¿ÀÛÀ» ±×¸²À¸·Î ±×·Á º¸¸é ´ÙÀ½°ú °°´Ù.

main¿¡¼­ randfunc ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ Á¤¼ö Àμö Çϳª¸¦ Àü´ÞÇϴµ¥ À̶§ randfunc ÇÔ¼ö·Î ºÐ±â°¡ ÀϾ¸ç randfunc ÇÔ¼ö´Â Àμö ¹üÀ§±îÁöÀÇ ³­¼ö¸¦ »ý¼ºÇÑ ÈÄ È£Ãâ¿øÀ¸·Î ¸®ÅÏÇÑ´Ù. ¸Å¹ø randfunc ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§¸¶´Ù ÀÌ·± °úÁ¤ÀÌ ¹Ýº¹µÇ´Âµ¥ ÇÔ¼ö°¡ ÇÑ ¹ø È£ÃâµÉ ¶§ ³»ºÎÀûÀ¸·Î ¾î¶² ÀϵéÀÌ ¹ú¾îÁö´ÂÁö »ìÆìº¸ÀÚ. ¾Õ¿¡¼­ ÀÌ¹Ì ¾Ë¾Æº» ³»¿ëµéÀε¥ ´Ù½Ã ÇÑ ¹ø ´õ Á¤¸®ÇØ º¸¾Ò´Ù.

 

¨ç Àμö¸¦ Àü´ÞÇϱâ À§ÇØ Àμö°ªÀ» ¼ø¼­´ë·Î ½ºÅÿ¡ ¹Ð¾î ³Ö´Â´Ù.

¨è È£Ãâ¿øÀº ¹Ù·Î ´ÙÀ½ ¹øÁö¸¦ ½ºÅÿ¡ ±â·ÏÇÔÀ¸·Î½á ÇÔ¼ö°¡ º¹±ÍÇÒ ¹øÁö¸¦ ÀúÀåÇÑ´Ù.

¨é ÇÔ¼ö°¡ Á¤ÀǵǾî ÀÖ´Â ¹øÁö·Î Á¡ÇÁÇÏ¿© Á¦¾î±ÇÀ» ÇÔ¼ö¿¡°Ô ³Ñ±ä´Ù.

¨ê ÇÔ¼ö´Â ½ºÅÿ¡ ÀÚ½ÅÀÇ Áö¿ªº¯¼ö¸¦ À§ÇÑ °ø°£À» ¸¸µç´Ù.

¨ë ÇÔ¼öÀÇ Äڵ带 ¼öÇàÇÑ´Ù.

¨ì ¸®ÅϰªÀ» ³Ñ±ä´Ù.

¨í º¹±Í ¹øÁö·Î ¸®ÅÏÇÑ´Ù.

¨î Àμö Àü´Þ¿¡ »ç¿ëÇÑ ½ºÅÃÀ» Á¤¸®ÇÑ´Ù.

 

ÇÔ¼ö°¡ È£ÃâµÇ°í º¹±ÍµÇ´Â °úÁ¤Àº ÀÌ·¸°Ô º¹ÀâÇÏ´Ù. ¹°·Ð µ¿ÀÛ¿¡ ÇÊ¿äÇÑ ÀÌ·± ÄÚµåµéÀº ÄÄÆÄÀÏ·¯°¡ ÀÛ¼ºÇØ ÁֹǷΠ¿ì¸®´Â ´Ü¼øÈ÷ À̸§°ú Àμö¸¸À¸·Î ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. ÇÔ¼öÀÇ µ¿ÀÛÀÌ º¹ÀâÇÏ°í ±æÀ̰¡ ±æ´Ù¸é ÀÌ Á¤µµ È£Ã⠽ð£Àº ¾ó¸¶µçÁö ¹«½ÃÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ rand()%nÀ̶ó´Â °£´ÜÇÑ ¿¬»êÀ» À§ÇØ ÀÌ·± º¹ÀâÇÑ È£Ãâ ÀýÂ÷¸¦ °ÅÃÄ¾ß ÇÑ´Ù´Â °ÍÀº Å« ºÎ´ãÀÌ ¾Æ´Ò ¼ö ¾ø´Âµ¥ ÇÔ¼öÀÇ ½ÇÇà¿¡ °É¸®´Â ½Ã°£º¸´Ù È£Ãâ¿¡ °É¸®´Â ½Ã°£ÀÇ ºñÀ²ÀÌ ³Ê¹« Å©±â ¶§¹®ÀÌ´Ù.

ÇÔ¼öÀÇ ½ÇÇà ½Ã°£Àº 0.001Ãʹۿ¡ ¾È°É¸®´Âµ¥ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ½Ã°£ÀÌ 0.1Ãʳª °É¸°´Ù¸é ÀÌ·² ¶§´Â ÀÌ Äڵ带 ÇÔ¼ö·Î ¸¸µéÁö ¾Ê°í È£ÃâºÎ¿¡ ¹Ù·Î »ðÀÔÇÏ´Â °ÍÀÌ ÈξÀ ´õ À̵æÀÌ´Ù. ÀÌ·± °³³äÀÌ ¹Ù·Î ÀζóÀÎ(inline) ÇÔ¼öÀÌ´Ù. ÀζóÀÎ ÇÔ¼ö´Â ÇÔ¼öÀ̱â´Â ÇÏµÇ È£ÃâµÉ ¶§ ÇÔ¼ö°¡ ÀÖ´Â °÷À¸·Î Á¡ÇÁÇÏÁö ¾Ê°í ÇÔ¼öÀÇ º»Ã¼ Äڵ带 È£ÃâºÎ ÀÚ¸®¿¡ ¹Ù·Î »ðÀÔÇÏ´Â ¹æ½ÄÀÇ ÇÔ¼öÀÌ´Ù. À§ ¿¹Á¦ÀÇ randfunc ÇÔ¼ö¸¦ ÀζóÀÎÀ¸·Î ¹Ù²ã º¸ÀÚ. ÇÔ¼ö Á¤ÀǺΠ¾Õ¿¡ inlineÀ̶ó´Â Ű¿öµå¸¸ ºÙÀÌ¸é µÈ´Ù.

 

inline int randfunc(int n)

{

     return rand()%n;

}

 

ÀÌ·¸°Ô ¼öÁ¤Çϸé randfunc ÇÔ¼ö´Â ÀζóÀÎ ÇÔ¼ö°¡ µÈ´Ù. ½ÇÇà ÆÄÀÏ¿¡´Â main ÇÔ¼ö¸¸ ÀÖ°í ÀζóÀÎ ÇÔ¼ö´Â µû·Î ÀÛ¼ºµÇÁö ¾ÊÀ¸¸ç ´ë½Å ÀζóÀÎ ÇÔ¼ö°¡ È£ÃâµÉ ¶§¸¶´Ù ÀÌ ÇÔ¼öÀÇ º»Ã¼°¡ È£ÃâºÎ¿¡ »ðÀԵȴÙ.

ÄÄÆÄÀÏ·¯´Â randfunc ÇÔ¼öÀÇ º»Ã¼ ÄÚµå rand()%nÀ» ±â¾ïÇϰí ÀÖ´Ù°¡ ÀζóÀÎ ÇÔ¼ö°¡ È£ÃâµÇ´Â °÷¿¡ ÀÌ Äڵ带 ¹Ù·Î »ðÀÔÇÑ´Ù. i=randfunc(10) È£Ãâ¹®¿¡¼­ randfunc(10)ÀÌ rand()%10À¸·Î ´ëüµÇ¾î ¹ö¸®´Â °ÍÀÌ´Ù. À̾îÁö´Â j=randfunc(100), k=randfunc(50) È£Ãâ¹®µµ ¸¶Âù°¡Áö ¹æ½ÄÀ¸·Î 󸮵ȴÙ.

ÀζóÀÎ ÇÔ¼ö´Â ½ÇÁ¦·Î È£ÃâµÇÁö ¾ÊÀ¸¹Ç·Î È£Ãâ¿¡ °É¸®´Â ½Ã°£ÀÌ ÇÊ¿ä¾ø¾î ÀüüÀûÀÎ ½ÇÇà ¼Óµµ°¡ ´ë´ÜÈ÷ ºü¸£´Ù. º¹±Í ¹øÁö¸¦ ±â·ÏÇϰųª Àμö, ¸®ÅϰªÀ» Àü´ÞÇÏ´Â ½Ã°£¸¸Å­À» Àý¾àÇÒ ¼ö ÀÖ´Ù. ´ë½Å ÀζóÀÎ ÇÔ¼ö°¡ È£ÃâµÇ´Â °÷¸¶´Ù ÇÔ¼öÀÇ º»Ã¼°¡ »ðÀԵǹǷΠ½ÇÇà ÆÄÀÏÀÇ Å©±â°¡ Ä¿Áö´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. Áï, ÀζóÀÎ ÇÔ¼ö´Â ¼Óµµ¿¡ À¯¸®Çϰí Å©±â¿¡ ºÒ¸®ÇÑ ¹æ¹ýÀÌ´Ù.

º»Ã¼ Äڵ尡 ¾ÆÁÖ ÀÛ°í ¼Óµµ°¡ Áß¿äÇÒ ¶§ ÀζóÀÎ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÇÔ¼öÀÇ º»Ã¼°¡ ±æ°í µ¿ÀÛÀÌ º¹ÀâÇÏ´Ù¸é ÀÌ·± ÇÔ¼ö´Â ÀζóÀÎÀ¸·Î ¸¸µéÁö ¾Ê´Â °ÍÀÌ ´õ ÁÁ´Ù. ±ä ÇÔ¼ö´Â È£Ãâ¿¡ °É¸®´Â ½Ã°£ÀÇ ºñÀ²ÀÌ ÇÔ¼öÀÇ ½ÇÇà ½Ã°£¿¡ ºñÇØ ¾ÆÁÖ À۾Ƽ­ È£Ã⠺δãÀÌ Å©Áö ¾ÊÀ¸¸ç ¶ÇÇÑ Àå¹®ÀÇ Äڵ带 ¸Å¹ø ¹Ýº¹ÇÑ´Ù¸é ½ÇÇà ÆÄÀÏÀÇ Å©±â°¡ ¹«½Ã¸øÇÒ Á¤µµ·Î Ä¿Á® ¹ö¸®±â ¶§¹®ÀÌ´Ù.

ÇÔ¼ö¸¦ ÀζóÀÎÀ¸·Î ¸¸µé ¶§´Â ÇÔ¼öÀÇ ¿øÇüÀ̳ª Á¤ÀǺο¡ inline Ű¿öµå¸¸ ½á ÁÖ¸é µÈ´Ù. ¶Ç´Â ¾çÂÊ¿¡ ´Ù inlineÀ» Ç¥±âÇØµµ »ó°ü¾ø´Ù. º¸Åë ÀζóÀÎ ÇÔ¼ö´Â ±æÀ̰¡ ª±â ¶§¹®¿¡ º°µµ·Î ¿øÇü ¼±¾ðÀ» ÇÏÁö ¾Ê°í ¿øÇüÀÌ µé¾î°¥ ÀÚ¸®¿¡ inline Ű¿öµå¿Í ÇÔ²² º»Ã¼¸¦ °°ÀÌ Á¤ÀÇÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. ¾Õ ¿¹Á¦¿¡¼­ ÀÛ¼ºÇÑ randfunc ÇÔ¼ö°¡ ¹Ù·Î ÀÌ ¹æ½ÄÀ¸·Î ÀÛ¼ºµÇ¾ú´Ù. ¿©·¯ ¸ðµâ¿¡¼­ °øÀ¯ÇÏ´Â ÇÔ¼ö¶ó¸é Çì´õ ÆÄÀÏ¿¡ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ÀζóÀÎ ÇÔ¼öÀÇ º»Ã¼´Â Á¤Àǰ¡ ¾Æ´Ñ ¼±¾ðÀ̹ǷΠ¸Þ¸ð¸®¸¦ ¼Ò¸ðÇÏÁöµµ ¾ÊÀ¸¸ç Áߺ¹ ¼±¾ðÇØµµ »ó°ü¾øÀ¸¹Ç·Î º¸Åë Çì´õ ÆÄÀÏ¿¡ ÀÛ¼ºÇÑ´Ù. ´Ü °°Àº ¸ðµâ¿¡¼­ µÎ ¹ø ¼±¾ðÇÏ´Â °ÍÀº ¾ÈµÈ´Ù.

ÇÔ¼ö°¡ ÀζóÀÎÀÌ µÉ °ÍÀΰ¡ ¾Æ´Ñ°¡´Â ÇÁ·Î±×·¡¸Ó°¡ ÁöÁ¤ÇÏÁö¸¸ ÃÖÁ¾ °áÁ¤Àº ÄÄÆÄÀÏ·¯°¡ ÇÑ´Ù. ÇÁ·Î±×·¡¸Ó°¡ ÇÔ¼ö ¼±¾ð¾Õ¿¡ inline Ű¿öµå¸¦ ºÙÀÌ´õ¶óµµ ÄÄÆÄÀÏ·¯´Â ÀÌ ÁöÁ¤À» ¹«½ÃÇϰí ÀÏ¹Ý ÇÔ¼ö·Î ¸¸µé¾î ¹ö¸± ¼öµµ ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó°¡ inline Ű¿öµå¸¦ »ç¿ëÇÏ´Â °ÍÀº ÀÌ ÇÔ¼ö°¡ ÀζóÀÎÀÌ µÇ¾úÀ¸¸é ÁÁ°Ú´Ù´Â Èñ¸Á »çÇ×ÀÏ »ÓÀ̸ç ÄÄÆÄÀÏ·¯´Â Á¶°ÇÀÌ ¸ÂÁö ¾ÊÀ» °æ¿ì ÀÌ ÁöÁ¤À» ¹«½ÃÇÒ ¼ö ÀÖ´Ù. ¸¶Ä¡ register ±â¾ï ºÎ·ù¿Í À¯»çÇÏ´Ù.

¿¹¸¦ µé¾î Àç±Í È£Ãâ ÇÔ¼ö´Â ÀζóÀÎÀÌ µÉ ¼ö ¾ø´Ù. ¿Ö³ÄÇϸé Àç±Í È£ÃâÀ̶õ ½ºÅÃÀ» ±â¹ÝÀ¸·Î µ¿ÀÛÇϱ⠶§¹®¿¡ ½ÇÁ¦·Î È£ÃâµÇ¾î¾ß¸¸ ÀÚ±â ÀÚ½ÅÀ» È£ÃâÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ÀζóÀÎ ÇÔ¼ö°¡ Àç±Í È£ÃâÀ» Çϵµ·Ï ³»¹ö·Á µÐ´Ù¸é ÀÌ ÇÁ·Î±×·¥ÀÇ Å©±â´Â ¹«ÇÑ´ë°¡ µÇ¾î ¹ö¸± °ÍÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ ´Ù¸¥ °÷¿¡¼­ ÀÌ ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ÂüÁ¶ÇÏ´Â °æ¿ì°¡ ÀÖ´Ù¸é ÀÌ °æ¿ìµµ ÀζóÀÎ ÇÔ¼ö°¡ µÇÁö ¸øÇÑ´Ù. ÀζóÀÎ ÇÔ¼ö´Â ¹øÁö¸¦ °¡Áú ¼ö ¾ø´Ù.

¶ÇÇÑ ÇÔ¼öÀÇ ±æÀ̰¡ ³Ê¹« ±æ °æ¿ìµµ µæº¸´Ù ½ÇÀÌ ´õ ¸¹±â ¶§¹®¿¡ ÄÄÆÄÀÏ·¯´Â ÀÌ ÇÔ¼ö¸¦ °­Á¦·Î ÀÏ¹Ý ÇÔ¼ö·Î ¸¸µé¾î ¹ö¸°´Ù. ºñÁÖ¾ó C++ÀÇ °æ¿ì µð¹ö±× ¹öÀü¿¡¼­´Â µð¹ö±ëÀÇ ÆíÀǸ¦ À§ÇØ ¸ðµç ÀζóÀÎ ÇÔ¼ö¸¦ ÀÏ¹Ý ÇÔ¼ö·Î ÄÄÆÄÀÏÇϴµ¥ ÇÁ·ÎÁ§Æ® ¿É¼ÇÀ¸·Î À̸¦ Á¶Á¤ÇÒ ¼ö ÀÖ´Ù. ÇÁ·ÎÁ§Æ® ¼³Á¤ ´ëÈ­»óÀÚÀÇ C/C++ÅÇÀÇ Optimizations ÅÇ¿¡ º¸¸é ÀζóÀÎ ÇÔ¼ö È®Àå¿¡ ´ëÇÑ ¿É¼ÇÀÌ ÀÖ´Ù.

¹Ý´ë·Î inline Ű¿öµå¸¦ ¸í½ÃÀûÀ¸·Î ¾²Áö ¾Ê¾Æµµ ÀÚµ¿À¸·Î ÀζóÀÎ ÇÔ¼ö°¡ µÇ´Â °æ¿ìµµ Àִµ¥ Ŭ·¡½º ¼±¾ð¿¡ Äڵ尡 ÀÛ¼ºµÇ¾î ÀÖ´Â ¸â¹ö ÇÔ¼ö´Â ÀÚµ¿ ÀζóÀÎ ¼Ó¼ºÀ» °¡Áø´Ù. ÇÔ¼ö°¡ ÀζóÀÎÀÌ µÉ °ÍÀΰ¡ ¾Æ´Ñ°¡´Â ¾îµð±îÁö³ª ¼Óµµ¿Í Å©±âÀÇ Â÷À̰¡ ÀÖÀ» »ÓÀÌÁö ÇÁ·Î±×·¥ÀÇ µ¿ÀÛ ÀÚü°¡ ´Þ¶óÁö´Â °ÍÀº ¾Æ´Ï¹Ç·Î ÄÄÆÄÀÏ·¯°¡ Àç·®²¯ inline ÁöÁ¤À» ¹«½ÃÇϰųª °­Á¦ ÁöÁ¤ÇÏ´õ¶óµµ º° »ó°üÀº ¾ø´Ù. ÇÁ·Î±×·¡¸Ó´Â ´Ù¸¸ ÀζóÀÎÀ¸·Î ¸¸µé°í ½ÍÀº ÇÔ¼ö ¾Õ¿¡ inline Ű¿öµå¸¸ ½á ÁÖ¸é µÈ´Ù.