15-2.ÇÔ¼ö Æ÷ÀÎÅÍ

15-2-°¡.Á¤ÀÇ

¿©±â¼­´Â ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ´ëÇØ ¼Ò°³ÇÏ°í °³³äÀûÀÌÁö¸¸ È°¿ë ¹æ¾È¿¡ ´ëÇؼ­µµ ¿¬±¸ÇØ º¸±â·Î ÇÑ´Ù. Æ÷ÀÎÅͶó´Â °ÍÀÌ ¿ø·¡ C/C++ÀÇ ÁÖÁ¦ Áß °¡Àå ¾î·Æ°í ³­ÇØÇѵ¥ ±× Áß¿¡¼­µµ ÇÔ¼ö Æ÷ÀÎÅÍ´Â ³­ÇØÇÔÀÇ ÀýÁ¤¿¡ ÀÖ´Ù°í Æò°¡µÇ´Â ¾î·Á¿î ÁÖÁ¦ÀÌ´Ù. óÀ½ºÎÅÍ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ´Ù ÀÌÇØÇϱâ´Â ¾î·Á¿ì¹Ç·Î ºÎ´ã°®Áö ¸»°í °¡º­¿î ¸¶À½À¸·Î Àо±â ¹Ù¶õ´Ù. ´ÙÇàÈ÷ ÇÔ¼ö Æ÷ÀÎÅÍ´Â ½ÇÀü¿¡¼­ »ç¿ë ºóµµ°¡ ±×¸® ³ôÁö ¾ÊÀ¸¹Ç·Î ¸ð¸¥´Ù°í Çؼ­ ´çÀå ºÒÆíÇÑ Á¤µµ´Â ¾Æ´Ï´Ù.

ÇÔ¼ö Æ÷ÀÎÅÍ(Pointer to Function)¶õ ÇÔ¼ö¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÌ´Ù. Æ÷ÀÎÅͶõ º»·¡ ¸Þ¸ð¸®»óÀÇ ¹øÁö¸¦ ÀúÀåÇÏ´Â º¯¼öÀε¥ ÇÔ¼öµµ ¸Þ¸ð¸®¿¡ Á¸ÀçÇÏ¸ç ½ÃÀÛ ¹øÁö°¡ ÀÖÀ¸¹Ç·Î Æ÷ÀÎÅÍ º¯¼ö·Î °¡¸®Å³ ¼ö ÀÖ´Ù. ÀϹÝÀûÀÎ Æ÷ÀÎÅÍ´Â º¯¼ö°¡ ÀúÀåµÇ¾î ÀÖ´Â ¹øÁö¸¦ °¡¸®Å°Áö¸¸ ÇÔ¼ö Æ÷ÀÎÅÍ´Â ÇÔ¼öÀÇ ½ÃÀÛ ¹øÁö¸¦ °¡¸®Å²´Ù´Â Á¡¿¡¼­ ´Ù¸£´Ù. ÇÔ¼ö Æ÷ÀÎÅÍ¿Í ±¸ºÐÇϱâ À§Çؼ­ º¯¼ö¸¦ °¡¸®Å°´Â ÀϹÝÀûÀÎ Æ÷ÀÎÅ͸¦ Ưº°È÷ µ¥ÀÌÅÍ Æ÷ÀÎÅͶó°í ºÎ¸£±âµµ ÇÑ´Ù.

Á¤¼öÇüÀ» °¡¸®Å°´Â int *pi´Â Á¤¼öÇü º¯¼öÀÇ ¹øÁö¸¦ °¡Áö¸ç ½Ç¼öÇüÀ» °¡¸®Å°´Â double *pd´Â ½Ç¼öÇü º¯¼öÀÇ ¹øÁö¸¦ °¡Áø´Ù. µ¥ÀÌÅÍ Æ÷ÀÎÅÍ´Â ´Ü¼øÈ÷ °¡¸®Å°´Â ´ë»óüÀÇ Å¸ÀÔ¸¸ ¹àÈ÷¸é µÇ¹Ç·Î ¼±¾ð Çü½ÄÀÌ °£´ÜÇÏ´Ù. ¹Ý¸é ÇÔ¼ö Æ÷ÀÎÅÍÀÇ ´ë»óüÀÎ ÇÔ¼ö´Â Çü½ÄÀÌ Á» ´õ º¹ÀâÇϱ⠶§¹®¿¡ ¼±¾ð Çü½Äµµ ´Ù¼Ò º¹ÀâÇÏ´Ù. ´ë»óü°¡ µÇ´Â ÇÔ¼öÀÇ ¸®ÅÏ Å¸ÀÔ°ú ÀμöµéÀÇ ¸ñ·Ï±îÁöµµ °°ÀÌ ¹àÇô¾ß ÇÑ´Ù. ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¼±¾ðÇÏ´Â Çü½ÄÀº ÇÔ¼öÀÇ ¿øÇü ¼±¾ð Çü½Ä°ú À¯»çÇÏ´Ù. ±âº» Çü½ÄÀº ´ÙÀ½°ú °°´Ù.

 

¸®ÅÏŸÀÔ (*º¯¼ö¸í)(ÀμöÀÇ ¸ñ·Ï);

 

ÇÔ¼öÀÇ ¿øÇüÀ» ½á ³õ°í ÇÔ¼ö¸íÀ» º¯¼ö¸íÀ¸·Î ¹Ù²Ù°í ¾Õ¿¡ *¸¦ ºÙÀÎ ÈÄ *º¯¼ö¸íÀ» °ýÈ£·Î ½Î¸é µÈ´Ù. ÇÔ¼ö Æ÷ÀÎÅ͵µ º¯¼öÀ̹ǷΠ°íÀ¯ÇÑ À̸§À» °¡Á®¾ß ÇÏ¸ç ¸íĪ ±ÔÄ¢¿¡ ¸Â°Ô Àû´çÈ÷ À̸§À» ºÙ¿©¾ß ÇÑ´Ù. ¸®ÅÏ°ª°ú Àμö ¸ñ·ÏÀº ±×´ë·Î À¯ÁöÇ쵂 ´Ü Çü½Ä ÀμöÀÇ À̸§Àº »ý·«Çصµ »ó°ü¾ø´Ù. ÇÔ¼ö ¿øÇü ¼±¾ð¿¡¼­ Çü½Ä ÀμöÀÇ À̸§ÀÌ º° Àǹ̰¡ ¾øµíÀÌ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¼±¾ðÇÒ ¶§µµ ÀμöÀÇ Å¸ÀÔ¸¸ Àǹ̰¡ ÀÖ´Ù. ´ÙÀ½ ÇÔ¼ö¸¦ °¡¸®Å°´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¼±¾ðÇÑ´Ù°í ÇØ º¸ÀÚ.

 

int func(int a);

 

Á¤¼öÇü Àμö¸¦ Çϳª ÃëÇϸç Á¤¼öÇüÀ» ¸®ÅÏÇÏ´Â func¶ó´Â ÇÔ¼öÀÇ ¿øÇüÀÌ´Ù. ÀÌ·± ÇÔ¼ö¸¦ °¡¸®Å³ ¼ö ÀÖ´Â ÇÔ¼ö Æ÷ÀÎÅÍ pf¸¦ ¼±¾ðÇÏ´Â ÀýÂ÷´Â ´ÙÀ½°ú °°´Ù.

 

¨ç int pf(int a);            // ÇÔ¼ö¸íÀ» º¯¼ö¸íÀ¸·Î ¹Ù²Û´Ù.

¨è int *pf(int a);      // º¯¼ö¸í ¾Õ¿¡ *¸¦ ºÙÀδÙ.

¨é int (*pf)(int);      // º¯¼ö¸¦ °ýÈ£·Î ½Ñ´Ù. Çü½Ä ÀμöÀÇ À̸§Àº »ý·« °¡´ÉÇÏ´Ù.

 

func°¡ (*pf)·Î ¹Ù²î¾ú´Âµ¥ À̸§ ¹Ù²Ù°í *¸¦ ºÙÀÎ ÈÄ °ýÈ£¸¦ ½Î±â¸¸ ÇÏ¸é µÈ´Ù. ÀÌ ¼±¾ð¹®¿¡¼­ °ýÈ£¸¦ »© ¹ö¸®¸é Á¤¼öÇü Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÏ´Â ÇÔ¼ö°¡ µÇ¾î ¹ö¸®¹Ç·Î °ýÈ£¸¦ »©¸ÔÁö ¾Êµµ·Ï ÁÖÀÇÇØ¾ß ÇÑ´Ù. ¸î ¹ø ¿¬½ÀÇØ º¸¸é ´Ü°è¸¦ °ÅÄ¡Áö ¾Ê°íµµ °ð¹Ù·Î ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¸¸µé ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ÙÀ½¿¡ ¸î °¡Áö ¿¹¸¦ º¸ÀδÙ.

 

void func(int a, double b);                void (*pf)(int, double);

char *func(char *a, int b);               char *(*pf)(char *,int);

void func(void);                         void (*pf)(void);

 

ÀÌ·¸°Ô ¼±¾ðÇÑ ÇÔ¼ö Æ÷ÀÎÅÍ´Â ÀڽŰú ¿øÇüÀÌ °°Àº ÇÔ¼öÀÇ ½ÃÀÛ ¹øÁö¸¦ °¡¸®Å³ ¼ö Àִµ¥ ´Ü¼øÈ÷ ÇÔ¼öÀÇ À̸§À» ´ëÀÔÇÏ¸é µÈ´Ù. ´ÙÀ½ ´ëÀÔ½ÄÀº int func(int a) ÇÔ¼ö¸¦ °¡¸®Å³ ¼ö ÀÖ´Â ÇÔ¼ö Æ÷ÀÎÅÍ pf¿¡ funcÀÇ ¹øÁö¸¦ ´ëÀÔÇÑ´Ù.

 

pf=func;

 

ÀÌ·± ´ëÀÔÀÌ °¡´ÉÇÑ ÀÌÀ¯´Â °ýÈ£¾øÀÌ ´Üµ¶À¸·Î »ç¿ëµÈ ÇÔ¼ö¸íÀº ÇÔ¼öÀÇ ½ÃÀÛ ¹øÁö¸¦ ³ªÅ¸³»´Â Æ÷ÀÎÅÍ »ó¼öÀ̱⠶§¹®ÀÌ´Ù. ¸¶Ä¡ ¹è¿­¸íÀÌ Ã·ÀÚ¾øÀÌ »ç¿ëµÇ¸é ¹è¿­ÀÇ ½ÃÀÛ ¹øÁö¸¦ ³ªÅ¸³»´Â Æ÷ÀÎÅÍ »ó¼ö°¡ µÇ´Â °Íó·³ ¸»ÀÌ´Ù. func¶ó´Â Ç¥Çö½Ä ÀÚü°¡ ÇÔ¼ö Æ÷ÀÎÅÍ »ó¼öÀ̹ǷΠÇÔ¼ö Æ÷ÀÎÅÍ º¯¼ö pf°¡ ±× ¹øÁö¸¦ ´ëÀÔ¹ÞÀ» ¼ö ÀÖ´Ù. ÇÔ¼ö À̸§ ÀÚü°¡ Æ÷ÀÎÅÍ Å¸ÀÔÀ̹ǷΠpf=&func; ó·³ &¿¬»êÀÚ¸¦ »ç¿ëÇÒ ÇÊ¿ä°¡ ¾ø´Ù. pf ÀÚü´Â º¯¼öÀ̹ǷΠ¿øÇü¸¸ ÀÏÄ¡ÇÑ´Ù¸é ´Ù¸¥ ÇÔ¼ö¸¦ °¡¸®Å³ ¼öµµ ÀÖ´Ù.

ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ÇÔ¼öÀÇ ½ÃÀÛ ¹øÁö¸¦ ÀúÀåÇßÀ¸¸é ÀÌÁ¦ ÇÔ¼ö ´ë½Å Æ÷ÀÎÅÍ·Î ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. º¯¼öÀÇ ¹øÁö¸¦ °¡¸®Å°´Â µ¥ÀÌÅÍ Æ÷ÀÎÅÍ·Î º¯¼ö°ªÀ» ÀÐÀ» ¼ö ÀÖµíÀÌ ÇÔ¼ö Æ÷ÀÎÅͷδ ÀÌ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â ¹øÁöÀÇ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ÇÔ¼ö Æ÷ÀÎÅÍ·Î ÇÔ¼ö¸¦ È£ÃâÇÏ´Â Çü½ÄÀº ´ÙÀ½ µÎ °¡Áö°¡ Àִµ¥ func ÇÔ¼ö¸¦ °¡¸®Å°´Â pf·Î func ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¿¹ÀÌ´Ù.

 

(*pf)(2);

pf(2);

 

ÇÔ¼ö Æ÷ÀÎÅÍ ´ÙÀ½¿¡ ÀμöÀÇ ¸ñ·ÏÀ» ³ª¿­Çϴµ¥ func ÇÔ¼ö´Â Á¤¼öÇü Àμö Çϳª¸¦ ÃëÇϹǷΠ»ó¼ö 2¸¦ ³Ñ°Ü ÁÖ¾ú´Ù. ¹°·Ð 3À̳ª 5 ¶Ç´Â Á¤¼ö¿Í ȣȯµÇ´Â º¯¼ö¸¦ Àμö·Î ³Ñ±æ ¼öµµ ÀÖ´Ù. pf°¡ funcÀÇ ¹øÁö¸¦ °¡Áö°í ÀÖÀ¸´Ï *pf´Â °ð func¿Í µ¿ÀÏÇÏ¸ç ±×·¡¼­ (*pf)(2)´Â func(2)¿Í °°´Ù. À̶§ *pf¸¦ °¨½Î´Â °ýÈ£´Â »ý·«ÇÒ ¼ö ¾ø´Âµ¥ *pf(2)¿Í °°ÀÌ ¾²¸é * ¿¬»êÀÚº¸´Ù () ¿¬»êÀÚ°¡ ´õ ¼øÀ§°¡ ³ô¾Æ pf(2) È£Ãâ¹®ÀÌ ¸®ÅÏÇÏ´Â Æ÷ÀÎÅͷκÎÅÍ ´ë»óü¸¦ Àд ¹®ÀåÀÌ µÇ¾î ¹ö¸°´Ù. *¿¬»êÀÚ°¡ ¸ÕÀú ½ÇÇàµÇ¾î ÀÌ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â ÇÔ¼ö¸¦ ãÀº ÈÄ ÀÌ ÇÔ¼ö·Î Àμö¸¦ ³Ñ°Ü¾ß ÇÑ´Ù.

(*pf)(2) È£Ãâ ±¸¹®ÀÌ ¹®¹ý»ó ¿øÄ¢ÀûÀ¸·Î ¸Â´Â ¹æ¹ýÀÌÁö¸¸ °ýÈ£¿Í *¿¬»êÀÚ¸¦ ¾²´Â °ÍÀÌ ¹ø°Å·Ó±â ¶§¹®¿¡ CÄÄÆÄÀÏ·¯µéÀº Á» ´õ °£·«È­µÈ È£Ãâ ¹æ¹ýÀ» Áö¿øÇϴµ¥ ±×°ÍÀÌ ¹Ù·Î ¾Æ·¡ÂÊ¿¡ ÀÖ´Â pf(2)È£Ãâ Çü½ÄÀÌ´Ù. ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¸¶Ä¡ ÇÔ¼öÀÎ °Íó·³ ¾²°í °ýÈ£¾È¿¡ Àμö¸¦ ³Ñ±ä´Ù. ¹®¹ýÀûÀ¸·Î ¾ö°ÝÇÏ°Ô µûÁöÀÚ¸é pf(2) Çü½ÄÀº À߸øµÈ °ÍÀÌÁö¸¸ ÄÄÆÄÀÏ·¯°¡ Ưº°È÷ ÀÌ·± ¿¹¿Ü¸¦ ÀÎÁ¤ÇÑ´Ù. pf°¡ ÇÔ¼ö Æ÷ÀÎÅͶó´Â °ÍÀ» ÄÄÆÄÀÏ·¯°¡ ¾Ë°í ÀÖÀ¸¹Ç·Î ±»ÀÌ *¿¬»êÀÚ¿Í ()°ýÈ£¸¦ ¾²Áö ¾Ê¾Æµµ pf°¡ °¡¸®Å°´Â ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¹®ÀåÀ̶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ¸¸ç ¸ðÈ£ÇÏÁö ¾Ê´Ù. ±×·¡¼­ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ÇÔ¼ö¿Í µ¿ÀÏÇÑ ¹æ¹ýÀ¸·Î »ç¿ëÇÏ´Â °ÍÀ» Çã¿ëÇÑ´Ù.

ÇÔ¼ö Æ÷ÀÎÅͷκÎÅÍ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â µÎ Çü½Ä¿¡ ´ëÇؼ­´Â ÇÐÀÚ¸¶´Ù ÀÇ°ßÀÌ ºÐºÐÇÏ¸ç ¾ÆÁ÷±îÁöµµ ¿ÏÀüÈ÷ ÅëÀϵǾî ÀÖÁö ¾Ê´Ù. ¿øÄ¢´ë·Î¶ó¸é (*pf)(2) Çü½ÄÀÌ ¿ÇÀ¸¸ç ½ÇÁ¦·Î Ŭ·¡½Ä C´Â ÀÌ Çü½Ä¸¸ ÀÎÁ¤ÇÏÁö¸¸ ANSI C ÀÌÈÄ´Â µÑ ´Ù ÀÎÁ¤µÈ´Ù. (*pf)(2) È£Ãâ¹®°ú pf(2) È£Ãâ¹®Àº ÄÄÆÄÀÏ·¯ÀÇ ¿¹¿Ü ÀÎÁ¤¿¡ ÀÇÇØ ¿ÏÀüÈ÷ µ¿ÀÏÇϸç ÃÖ±Ù¿¡´Â pf(2) Çü½ÄÀÌ ´õ ¿ì¼¼ÇÏ´Ù. µÑ Áß ¸¶À½¿¡ µå´Â Çü½ÄÀ» »ç¿ëÇ쵂 ¾Æ¹«·¡µµ ÈÄÀÚ°¡ ´õ °£ÆíÇϱâ´Â ÇÏ´Ù. ´ÙÀ½ ¿¹Á¦´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ¿© ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ¿¹¸¦ º¸¿©ÁØ´Ù.

 

¿¹ Á¦ : FuncPointer

#include <Turboc.h>

 

int func(int a)

{

     return a*2;

}

 

void main()

{

     int i;

     int (*pf)(int a);

     pf=func;

     i=(*pf)(2);

     printf("%d\n",i);

}

 

func ÇÔ¼ö´Â Á¤¼ö°ª Çϳª¸¦ Àμö·Î ¹Þ¾Æ ÀÌ °ªÀÇ 2¹è°ªÀ» ¸®ÅÏÇÏ´Â ¾ÆÁÖ °£´ÜÇÑ ÇÔ¼öÀÌ´Ù. main¿¡¼­´Â ÀÌ·± Çü½ÄÀÇ ÇÔ¼ö¸¦ °¡¸®Å³ ¼ö ÀÖ´Â ÇÔ¼ö Æ÷ÀÎÅÍ pf¸¦ ¼±¾ðÇßÀ¸¸ç pf¿¡ funcÀÇ ½ÃÀÛ ¹øÁö¸¦ ´ëÀÔÇß´Ù. ±×¸®°í (*pf)(2) È£Ãâ¹®À¸·Î func ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ±× ¸®ÅÏ°ªÀ» Áö¿ªº¯¼ö i¿¡ ´ëÀÔÇÑ ÈÄ Ãâ·ÂÇß´Ù. Àμö·Î 2¸¦ Àü´ÞÇßÀ¸¹Ç·Î Ãâ·Â °á°ú´Â ¹°·Ð 4ÀÌ´Ù. (*pf)(2) È£Ãâ¹®À» pf(2)·Î ¹Ù²Ù¾îµµ µ¿ÀÏÇÏ´Ù.

pf°¡ °¡¸®Å°´Â ÇÔ¼ö´Â Á¤¼öÇü Àμö Çϳª¸¸ ÃëÇϵµ·Ï µÇ¾î ÀÖÀ¸¹Ç·Î pf¸¦ ÅëÇØ ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§µµ ¿øÇü¿¡ ¸Â°Ô È£ÃâÇØ¾ß ÇÑ´Ù. (*pf)(2.5) È£ÃâÀº °æ°í·Î 󸮵Ǹç (*pf)("string")È£ÃâÀº ÄÄÆÄÀÏ ¿¡·¯·Î 󸮵Ǵµ¥ func(2.5)³ª func("string") È£Ãâ¹®¿¡¼­ °æ°í³ª ¿¡·¯°¡ ³ª´Â °Í°ú °°Àº ÀÌÀ¯ÀÌ´Ù. ÄÄÆÄÀÏ·¯°¡ ÀÌ·± ¿¡·¯ 󸮸¦ Çϱâ À§Çؼ­´Â ÇÔ¼ö Æ÷ÀÎÅÍÀÇ ´ë»óü ÇÔ¼ö°¡ ¾î¶² Àμö¸¦ ÃëÇÏ°í ¸®ÅÏ°ªÀÇ Å¸ÀÔÀÌ ¹«¾ùÀÎÁö¸¦ Á¤È®ÇÏ°Ô ¾Ë¾Æ¾ß ÇÏ¸ç ±×·¡¼­ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¼±¾ðÇÏ´Â ¹®ÀåÀÌ ´Ù¸¥ º¯¼ö ¼±¾ð¹®º¸´Ù ´õ º¹ÀâÇÑ °ÍÀÌ´Ù.