¿©±â¼´Â ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ´ëÇØ ¼Ò°³ÇÏ°í °³³äÀûÀÌÁö¸¸ È°¿ë ¹æ¾È¿¡ ´ëÇؼµµ ¿¬±¸ÇØ º¸±â·Î ÇÑ´Ù. Æ÷ÀÎÅͶó´Â °ÍÀÌ ¿ø·¡ 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") È£Ãâ¹®¿¡¼ °æ°í³ª ¿¡·¯°¡ ³ª´Â °Í°ú °°Àº ÀÌÀ¯ÀÌ´Ù. ÄÄÆÄÀÏ·¯°¡ ÀÌ·± ¿¡·¯ 󸮸¦ Çϱâ À§Çؼ´Â ÇÔ¼ö Æ÷ÀÎÅÍÀÇ ´ë»óü ÇÔ¼ö°¡ ¾î¶² Àμö¸¦ ÃëÇÏ°í ¸®ÅÏ°ªÀÇ Å¸ÀÔÀÌ ¹«¾ùÀÎÁö¸¦ Á¤È®ÇÏ°Ô ¾Ë¾Æ¾ß ÇÏ¸ç ±×·¡¼ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¼±¾ðÇÏ´Â ¹®ÀåÀÌ ´Ù¸¥ º¯¼ö ¼±¾ð¹®º¸´Ù ´õ º¹ÀâÇÑ °ÍÀÌ´Ù.