15-2-¸¶.ÇÔ¼ö Æ÷ÀÎÅÍ ¸®ÅÏ

ÇÔ¼ö Æ÷ÀÎÅ͸¦ Àμö·Î Àü´ÞÇÒ ¼ö ÀÖ´Ù¸é ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÏ´Â ÇÔ¼öµµ ¸¸µé ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÌ·± ÇÔ¼ö´Â ½Ç¿ë¼ºÀÌ Áö±ØÈ÷ ¶³¾îÁöÁö¸¸ ¾î·µç ¹®¹ýÀº ÀÌ·± ÇÔ¼ö¸¦ ¸¸µå´Â °ÍÀ» Çã¿ëÇϴµ¥ ÇÔ¼ö Æ÷ÀÎÅÍ°¡ ´Ü¼øÇÑ º¯¼öÀÏ »ÓÀ̹ǷΠÀÌ·± º¯¼ö¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼öµµ ´ç¿¬È÷ ¸¸µé ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÏ´Â ÇÔ¼öÀÇ ¿øÇüÀº ´ÙÀ½°ú °°´Ù.

 

fpÀǸ®ÅÏŸÀÔ (*ÇÔ¼ö¸í)(Àμö¸ñ·Ï))(fpÀÇÀμö¸ñ·Ï)

 

ÀÌ ¿øÇü¿¡¼­ fp´Â ¸®ÅϵǴ ´ë»ó ÇÔ¼ö¸¦ ÀǹÌÇÑ´Ù. ÇÔ¼ö ÀÚüÀÇ Àμö¿Í ¸®ÅÏÇÒ ÇÔ¼ö Æ÷ÀÎÅÍÀÇ Àμö ¸ñ·ÏÀ» °°ÀÌ Àû¾î¾ß Çϱ⠶§¹®¿¡ ¿øÇüÀÌ ¹«Ã´ º¹ÀâÇÒ ¼ö¹Û¿¡ ¾ø´Ù. ´ÙÀ½ ¿¹Á¦´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÏ´Â ºñ±³Àû °£´ÜÇÑ(?) ÇÔ¼ö¸¦ Å×½ºÆ®ÇÑ´Ù.

 

¿¹ Á¦ : FpReturn

#include <Turboc.h>

 

int f1(int a, double b)

{

     return 1;

}

 

int f2(int a, double b)

{

     return 2;

}

 

int (*SelectFunc(char ch))(int,double)

{

     if (ch == 'a') {

          return f1;

     } else {

          return f2;

     }

}

 

void main()

{

     int (*fp)(int,double);

 

     fp=SelectFunc('a');

     printf("¸®ÅÏµÈ °ª = %d\n",fp(1,2.3));

}

 

SelectFunc ÇÔ¼öÀÇ ¿øÇüÀ» ¸»·Î Ç®¾î º¸ÀÚ¸é "ÀÚ½ÅÀº charÇüÀ» Àμö·Î ÃëÇϸç, Á¤¼öÇü°ú ½Ç¼öÇüÀ» Àμö·Î ÃëÇÏ°í Á¤¼öÇüÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù."°í ÇÒ ¼ö ÀÖ´Ù. ¿øÇüÀ» º¸³ª ¸»·Î ¼³¸íÇϳª Çò°¥¸®±â´Â ¸¶Âù°¡ÁöÀÎ °Í °°´Ù. ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â Æ÷ÀÎÅÍÀÇ Å¸ÀÔÀº int (*)(int, double) ÇüÀÌ¸ç ¿¹Á¦¿¡´Â ÀÌ·± ÇÔ¼ö°¡ µÎ °³ Á¤ÀǵǾî ÀÖ´Ù.

SelectFunc ÇÔ¼ö´Â Àμö·Î Àü´ÞµÈ char Çü Àμö°¡ 'a'À̸é f1À» ¸®ÅÏÇÏ°í ±×·¸Áö ¾ÊÀ¸¸é f2¸¦ ¸®ÅÏÇÑ´Ù. main¿¡¼­´Â SelectFunc('a')¸¦ È£ÃâÇÑ ÈÄ ÀÌ ÇÔ¼ö°¡ ¸®ÅÏÇÑ °ªÀ» Áö¿ªº¯¼ö fp·Î ´ëÀÔ¹Þ¾Æ fp·Î ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ f1 ÇÔ¼ö°¡ È£ÃâµÇ´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¹°·Ð 'b'¸¦ Àü´ÞÇϸé f2 ÇÔ¼ö°¡ È£ÃâµÉ °ÍÀÌ´Ù. °á±¹ SelectFunc ÇÔ¼ö´Â ÁÖ¾îÁø Á¶°ÇÀ» °è»êÇÏ¿© ÀûÀýÇÑ ÇÔ¼ö¸¦ ¼±ÅÃÇÑ´Ù°í ÇÒ ¼ö ÀÖ´Ù. ¼±¾ð¹®ÀÌ ¹«Ã´ »ý¼ÒÇѵ¥ ´ÙÀ½°ú °°ÀÌ typedef¸¦ ÇÑ ¹ø °ÅÄ¡¸é Á» ÀÐÀ»¸¸ÇØÁø´Ù.

 

typedef int (*PF)(int,double);

PF SelectFunc(char ch)

 

±×·¸´Ù¸é ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÏ´Â ÇÔ¼ö´Â °ú¿¬ ½Ç¿ëÀûÀ¸·Î ¾î¶² Àǹ̸¦ °¡Áö°í ÀÖÀ»±î? ²À ¾ïÁö·Î¶óµµ ¿¹¸¦ µéÀÚ¸é ÀüÇô ¾øÁö´Â ¾Ê°ÚÁö¸¸ ¸¶¶¥È÷ ÀÌ·± ÇÔ¼öÀÇ Á¸Àç Àǹ̸¦ °­º¯ÇÒ¸¸ÇÑ ±¸½ÇÀ» ã±â´Â Âü ¾î·Æ´Ù. ÇÔ¼ö´Â Á¸ÀçÇÏ´Â ¸ðµç ŸÀÔÀ» ¸®ÅÏÇÒ ¼ö ÀÖ¾î¾ß ÇϹǷΠÀÌ·± ¿ä±¸ »çÇ×À» ÃæÁ·ÇÏ°í ÇÔ¼ö Æ÷ÀÎÅ͸¦ Àμö·Î Àü´ÞÇÒ ¼ö ÀÖ´Ù´Â »ç½Ç°ú ´ëĪÀ» ÀÌ·ç±â À§ÇØ ¹®¹ýÀÌ Áö¿øÇÏ°í ÀÖÀ» »Ó ½Ç¿ëÀûÀÎ °¡Ä¡´Â ÀüÇô ¾ø´Ù°í ÇÒ ¼ö ÀÖ´Ù.

´Ù¸¸ ÀÌ·ÐÀûÀ¸·Î ¹®¹ýÀ» ºÐ¼®ÇÏ°í µûÁö±â¸¦ ÁÁ¾ÆÇÏ´Â »ç¶÷µé¿¡°Ô ¾à°£ÀÇ Àç¹Ì¸¦ ÁÖ´Â Á¤µµ°¡ ¾Æ´Ñ°¡ »ý°¢µÉ »ÓÀÌ´Ù. ÇÔ¼ö°¡ ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÒ ¼ö ÀÖ´Ù¸é ÀÌ·± ÇÔ¼ö¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¶Ç Á¤ÀÇÇÒ ¼ö ÀÖÀ» °ÍÀÌ°í ¶Ç ±×·± Æ÷ÀÎÅ͸¦ Àμö·Î ÃëÇÏ´Â ÇÔ¼öµµ ÀÖÀ» °ÍÀÌ°í ±×·± ÇÔ¼öÀÇ ¹è¿­À» Á¤ÀÇÇÏ´Â °Íµµ °¡´ÉÇÒ °ÍÀÌ´Ù. ÀÌ·± ½ÄÀ¸·Î ¼±¾ð¹®À» ²¿±â·Î ÀÛÁ¤ÇÑ´Ù¸é ¾ó¸¶µçÁö º¯ÅÂÀûÀÎ ¼±¾ð¹®À» ¸¸µé ¼öµµ ÀÖ´Ù. ´ÙÀ½ ¼±¾ð¹®À» Çؼ®ÇØ º¸ÀÚ.

 

char (*func(char **buf, char *(*strf[9])(void), int *pi))(unsigned short,unsigned (**)(const char *));

 

¹®ÀÚÇü ÀÌÁß Æ÷ÀÎÅÍ buf¸¦ ù ¹ø° Àμö·Î ÃëÇÏ°í, Àμö°¡ ¾øÀ¸¸ç ¹®ÀÚÇü Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÏ´Â ÇÔ¼ö¸¦ Æ÷ÀÎÆ® ÇÏ´Â Å©±â 9ÀÇ ÇÔ¼ö Æ÷ÀÎÅÍ ¹è¿­À» µÎ ¹ø° Àμö·Î ÃëÇÏ°í, Á¤¼öÇü Æ÷ÀÎÅ͸¦ ¼¼ ¹ø° Àμö·Î ÃëÇϸç, ºÎÈ£¾ø´Â 16ºñÆ® Á¤¼ö¸¦ ù ¹ø° Àμö·Î ÃëÇϸç, ¹®ÀÚÇü »ó¼ö Áö½Ã Æ÷ÀÎÅ͸¦ Àμö·Î ÃëÇÏ°í ºÎÈ£¾ø´Â Á¤¼ö¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼öÀÇ ÀÌÁß Æ÷ÀÎÅ͸¦ µÎ ¹ø° Àμö·Î ÃëÇÏ¸ç ¹®ÀÚÇüÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö¸¦ Æ÷ÀÎÆ®ÇÏ´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÏ´Â ÇÔ¼ö funcÀ» ¼±¾ðÇÑ´Ù.

µµ´ëü ÀÌ°Ô ÇÔ¼öÀÎÁö º¯¼öÀÎÁöÁ¶Â÷µµ Àß ºÐ°£ÀÌ µÇÁö ¾Ê´Â Áö°æÀÌ´Ù. Àç¹Ì·Î ÇÑ ¹ø º¸¶ó°í ¸¸µç °Í »ÓÀÌÁö ÀÌ·± ÇÔ¼ö¸¦ ¸¸µé ÀÏÀº ÀüÇô ¾ø´Ù°í Àå´ãÇÒ ¼ö ÀÖ´Ù. ÀÌ·± ¼±¾ð¹®À» ÀÐÁö ¸øÇÑ´Ù°í Çؼ­ °í¹ÎÇÒ ÇÊ¿ä´Â ÀüÇô ¾ø´Ù. ¿ÀÈ÷·Á ÀÌ·± ¼±¾ð¹®À» °Åħ¾øÀÌ ÀÐÀ» ¼ö ÀÖ´Â »ç¶÷ÀÌ ÀÌ»óÇÑ »ç¶÷ÀÌ°í Àú·± ¼±¾ð¹®À» ¸¸µç »ç¶÷Àº ´õ ÀÌ»óÇÑ »ç¶÷ÀÌ´Ù.