À̵¿: Home à book04

 

ÁÖ¼Ò: http://www.kernel.bz/book/book04/CM0104.htm

 

Á¦¸ñ: C¾ð¾î¿Í ¾Ë°í¸®Áò ¸ñÂ÷

ÀÌÆäÀÌÁö ÀúÀÛ±ÇÀº ÀúÀÚ¿¡°Ô ÀÖÀ½.

ÀúÀÚ: Á¤ÀçÁØ(rgbi3307(at)nate.com)

ÃÖ±Ù¼öÁ¤ÀÏ:2011-02-20

 

 

 

 

C¾ð¾î¿Í  ¾Ë°í¸®Áò(4)

ÇÔ¼ö¿Í ÇÁ·Î±×·¥ ±¸Á¶

¼­¹®

ÇÊÀÚÀÇ ¿¬Àç¹° "C¾ð¾î¿Í ¾Ë°í¸®Áò"Àº C¾ð¾î¸¦ ü°èÀûÀ¸·Î ÇнÀÇÑ ÈÄ ÀڷᱸÁ¶¿Í ¾Ë°í¸®ÁòÀ» C¾ð¾î·Î ÀÌÇØ ¹× ÀÀ¿ëÇϵµ·Ï µµ¿ÍÁÖ´Â ³»¿ëÀ¸·Î ±¸¼ºÇÑ´Ù.  C¾ð¾î´Â ÀÓº£µðµå´Â ¹°·Ð ¸¹Àº Á¤º¸Åë½Å ºÐ¾ß¿¡¼­ ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î »ç¿ëÇϰí ÀÖ´Ù.  ¶ÇÇÑ, ÀڷᱸÁ¶¿Í ¾Ë°í¸®ÁòÀº ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹ÖÀÇ ±â¹ÝÀ» ÀÌ·ç´Â Ãʼ®ÀÌ´Ù.  ¿À´Ã³¯ ¸¹Àº °øÇÐÀû ÀÀ¿ëÁ¦Ç°µéÀº ÀÚ¿¬°úÇÐ(¼öÇÐ, È­ÇÐ, ¹°¸®)ÀÇ Åä´ë À§¿¡¼­ ¸¸µé¾îÁ³´Ù.  ÄÄÇ»ÅÍ ÀÀ¿ë ÇÁ·Î±×·¥µé ¶ÇÇÑ ÀڷᱸÁ¶¿Í ¾Ë°í¸®Áò ±â¹Ý¿¡¼­ ÄÚµù µÇ¾úÀ¸¸ç, C¾ð¾î´Â ÀڷᱸÁ¶¿Í ¾Ë°í¸®ÁòÀ» ±¸ÇöÇϴµ¥ À¯¿ëÇÑ ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÇ ¼±±¸ÀÚÀÌ´Ù.  ÇÊÀÚ´Â ¿À·§µ¿¾È ÀڷᱸÁ¶¿Í ¾Ë°í¸®ÁòÀ» ÇнÀÇÑ ³»¿ëÀ» C¾ð¾î·Î ü°èÀûÀ¸·Î ½Ç½ÀÇÏ¿© ±× °á°ú¸¦ ±¸Ã¼ÀûÀ¸·Î È®ÀÎÇÑ ³»¿ëµéÀ» Á¤¸®ÇؿԴÙ.  À̰ÍÀ» Åä´ë·Î ¡°C¾ð¾î¿Í ¾Ë°í¸®Áò¡± ¿¬Àç¹°À» ÁýÇÊÇϰí ÀÖ°í ¿©±â¿¡ ÇÊÀÚÀÇ ¸¹Àº ³ë·ÂÀÌ ´ã°ÜÁ® ÀÖ´Ù.  µ¶ÀÚ ¿©·¯ºÐµéÀÇ ¸¹Àº °ü½É°ú °Ý·Á Àֱ⸦ ¹Ù¶õ´Ù.

±Û: Á¤ÀçÁØ / rgbi3307@nate.com / Ä¿³Î¿¬±¸È¸(www.kernel.bz)

 

 

¿¬Àç Â÷·Ê

1. C¾ð¾î ¼Ò°³

 2. ÇüÅÂ, ¿¬»êÀÚ, Ç¥Çö

 3. Á¦¾î È帧

 4. ÇÔ¼ö¿Í ÇÁ·Î±×·¥ ±¸Á¶

 5. Æ÷ÀÎÅÍ¿Í ¹è¿­

 6. ±¸Á¶Ã¼

 7. ¾Ë°í¸®Áò ¼Ò°³

 8. ¼ÒÆÃÀ» ÅëÇÑ ¾Ë°í¸®Áò ºÐ¼®

 9. ½ºÅÃ(Stack) ½Ç½À

10. Å¥(Queue) ½Ç½À

11. ¸®½ºÆ®(List) ½Ç½À

12. Æ®¸®(Tree) ½Ç½À

13. ÇØ½Ì(Hash) ½Ç½À

14. ¾Ë°í¸®Áò ¼³°è ¹× ºÐ¼®±â¹ý

15. Áøº¸µÈ ¾Ë°í¸®Áò ¼Ò°³

 

ÇÊÀÚ ¼Ò°³

 Á¤ÀçÁØ / rgbi3307@nate.com / Ä¿³Î¿¬±¸È¸(www.kernel.bz)

ÇÊÀÚ´Â ÇÐâ½ÃÀý ¸¶ÀÌÅ©·ÎÇÁ·Î¼¼¼­ Á¦¾î ±â¼úÀ» ¹è¿ü°í, 10¿©³âµ¿¾È ½×¾Æ¿Â IT°ü·Ã °³¹ß °æÇèÀ» ¹ÙÅÁÀ¸·Î ¡°¿À¶óŬ½Ç¹«È°¿ëSQLÆ©´×(ÇýÁö¿ø)" Ã¥À» ÁýÇÊÇϰí, "¿ù°£ÀÓº£µðµå¿ùµå" ÀâÁö¿¡ ´Ù¼öÀÇ ±ÛÀ» ±â°íÇÏ¿´´Ù.  ¼­¿ï´ëº´¿ø Àü»ê½Ç¿¡¼­ µ¥ÀÌÅͺ£À̽º °ü·Ã ÀÏÀ» Çϸ鼭 ÇÐâ½ÃÀýºÎÅÍ ²ÙÁØÈ÷ ÇØ¿Â ¸®´ª½º ¿¬±¸µµ °è¼ÓÇϰí ÀÖ´Ù.  ƯÈ÷, ½ºÅÄÆ÷µå´ëÇб³ÀÇ John L. Hennessy ±³¼öÀÇ Àú¼­ ¡°Computer Organization and Design¡± Ã¥À» ÀÐ°í ±íÀº °¨¸íÀ» ¹Þ¾ÒÀ¸¸ç, ÄÄÇ»Åͱ¸Á¶¿Í ÀڷᱸÁ¶ ¹× ¾Ë°í¸®Áò È¿À²¼º ¿¬±¸¸¦ ÅëÇÑ ±â¼ú¼­Àû ÁýÇÊ¿¡ ³ë·ÂÇϰí ÀÖ´Ù.  ¶ÇÇÑ, ¿Â¶óÀÎ »ó¿¡¼­ Ä¿³Î¿¬±¸È¸(http://www.kernel.bz/)¶ó´Â À¥»çÀÌÆ®¸¦ ¿î¿µÇÏ¸ç °ü·Ã±â¼úµéÀ» °øÀ¯Çϰí ÀÖ´Ù.

 

 

¿ä¾à

ÇÔ¼ö´Â ´ë±Ô¸ð ÇÁ·Î±×·¥ ¼öÇà ÀÓ¹«µéÀ» ÀÛÀº ´ÜÀ§·Î ³ª´©´Â ¿ªÇÒÀ» Çϸç Çѹø »ç¿ëÇÑ °ÍÀ» Àç»ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù.  ¶ÇÇÑ ÇÔ¼ö ³»ºÎÀÇ ÀÚ¼¼ÇÑ Äڵ带 ¸ðµÎ È®ÀÎÇÏÁö ¾Ê¾Æµµ ½±°Ô »ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÇÁ·Î±×·¥ÀÇ À¯Áö º¸¼ö¼ºÀ» Áõ´ë½ÃÄÑÁØ´Ù.  C¾ð¾î´Â ÇÔ¼ö¸¦ È¿À²ÀûÀ̸鼭µµ »ç¿ëÇϱ⠽±µµ·Ï ¼³°èÇß´Ù.  C ÇÁ·Î±×·¥Àº ÀϹÝÀûÀ¸·Î ÀÛÀº ÇÔ¼öµéÀÌ ¿©·¯°³ ¸ð¿©¼­ ±¸¼ºµÈ´Ù.  ¶ÇÇÑ ¼Ò½º ÆÄÀϵéÀÌ ¿©·¯°³·Î ºÐ¸®µÇ¾î ÀÖÀ¸¸ç ÄÄÆÄÀÏ·¯°¡ À̵éÀ» °¢°¢ ÄÄÆÄÀÏÇÑ´Ù.  ±×·±´ÙÀ½ ·Î´õ¿¡ ÀÇÇØ ¶óÀ̺귯¸®¿¡ ÀÌ¹Ì ÄÄÆÄÀϵǾî ÀÖ´Â ÇÔ¼öµé°ú ÇÔ²² ÀûÀçµÈ´Ù.  ÇÔ¼ö¸¦ ¼±¾ðÇÒ¶§ ¸Å°³º¯¼öÀÇ ÇüŸ¦ ¼±¾ðÇϵµ·Ï ÇÑ´Ù.  ÀÌ·¸°Ô ÇÔÀ¸·Î½á ÇÔ¼ö°¡ ½ÇÁ¦ÀûÀ¸·Î Á¤ÀÇµÉ ¶§ ¸Å°³º¯¼ö ÇüŰ¡ »óÈ£ ÀÏÄ¡ÇÏ´ÂÁö Á¡°ËÇÏ¿© ÄÄÆÄÀÏ ¿À·ù¸¦ ÁÙÀÏ ¼ö ÀÖ´Ù.

 

ÇÔ¼öÀÇ ±âÃÊ

ÇÔ¼ö´Â ¾Æ·¡¿Í °°Àº Çü½ÄÀ¸·Î ±¸¼ºµÈ´Ù.  ¡°return-type¡±Àº ÇÔ¼ö°¡ ¹ÝȯÇÏ´Â µ¥ÀÌÅÍ Å¸ÀÔÀÌ´Ù.  À̰ÍÀº »ý·«µÇ¸é Á¤¼öÇüÀ¸·Î °£ÁֵȴÙ.  ¡°function_name¡±Àº »ç¿ëÀÚ°¡ Á¤ÀÇÇÑ ÇÔ¼ö¸íÀÌ´Ù.  °ýÈ£¾È¿¡ ÀÖ´Â ¡°argument declarations¡±Àº ÇÔ¼ö ¾ÈÀ¸·Î Àü´ÞµÇ´Â ÆÄ¶ó¹ÌÅ͵éÀÇ µ¥ÀÌÅÍ Å¸ÀÔ°ú ¸íĪÀÌ´Ù.  ÇÔ¼öÀÇ ¸öü´Â Áß°£°ýÈ£ {}·Î µÑ·¯½Î¿© ÀÖÀ¸¸ç À̰÷¿¡ ÇÔ¼ö°¡ ÀÓ¹«¸¦ ¼öÇàÇϱâ À§ÇÑ °¢Á¾ µ¥ÀÌÅÍ Å¸ÀÔ°ú ¹®ÀåµéÀ» ±â¼úÇÑ´Ù.

 

return-type  function_name (argument declarations)

{

    declarations and statements;

}

 

ÇÁ·Î±×·¥Àº º¯¼öµé°ú ÇÔ¼öµéÀ» Á¤ÀÇÇÑ ÁýÇÕÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù.  ÇÔ¼öµé°£ÀÇ ¼ÒÅëÀº ¸Å°³º¯¼ö(ÀԷ°ª)¿Í ¹Ýȯ°ª(Ãâ·Â°ª)À» ÅëÇÏ¿© Çϰųª ¿ÜºÎº¯¼ö¸¦ »ç¿ëÇÑ´Ù.  ÇÔ¼öµéÀº ¼ø¼­¿¡ »ó°ü¾øÀÌ ¼Ò½º ÆÄÀϾÈÀÇ ¾î´À °÷À̳ª ³ªÅ¸³¯ ¼ö ÀÖ°í, ¼Ò½º ÇÁ·Î±×·¥ ÆÄÀÏÀº ¿©·¯°³·Î ³ª´­ ¼ö ÀÖ´Ù.

 

°£´ÜÇÑ ¿¹Á¦¸¦ ÅëÇÏ¿© ÇÔ¼ö¸¦ ÀÌÇØÇØ º¸µµ·Ï ÇÏÀÚ.  ¸ÕÀú, ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê°í main¿¡ ½ÇÇà ¹®ÀåµéÀ» ¸ðµÎ ±â¼úÇÑ °ÍÀ» ½Ç½ÀÇØ º¸ÀÚ.

 

(½Ç½À ¼Ò½º)

/*

    author:     Jung,JaeJoon(rgbi3307@nate.com, http://www.kernel.bz/)

    comments:   ÇÔ¼öÀDZâÃÊ

*/

 

#include <stdio.h>

 

main ()

{

    int a = 10, b = 20;

 

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

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

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

 

    printf("\nPress any key to end...");

    getchar();

}

 

 

(½ÇÇà °á°ú)

$ cc -o fn01 ch0401_fn01.c  ©¬ ÄÄÆÄÀÏ ¹× ¸µÅ©

$ ./fn01  ©¬ ½ÇÇà

a = 10

b = 20

a+b = 30

 

Press any key to end...

 

¾Æ·¡´Â À§ÀÇ ¿¹Á¦¸¦ ÇÔ¼ö·Î ±â¼úÇÑ °ÍÀ¸·Î¼­ ½ÇÇà°á°ú´Â µ¿ÀÏÇÏ´Ù.

 

(½Ç½À ¼Ò½º)

/*

    author:     Jung,JaeJoon(rgbi3307@nate.com, http://www.kernel.bz/)

    comments:   ÇÔ¼öÀÇ ±âÃÊ

*/

 

#include <stdio.h>

 

//ÇÔ¼ö¼±¾ð

void fn_a (int a);

void fn_b (int b);

int fn_ab (int a, int b);

 

main ()

{

    int a = 10, b = 20;

   

    fn_a (a);

    fn_b (b);

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

 

 printf("\nPress any key to end...");

    getchar();

}

 

//ÇÔ¼öÁ¤ÀÇ

void fn_a (int a)

{

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

}

 

//ÇÔ¼öÁ¤ÀÇ

void fn_b (int b)

{

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

}

 

//ÇÔ¼öÁ¤ÀÇ

int fn_ab (int a, int b)

{

    int c;

    c = a + b;

    return c;

}

 

 

(½ÇÇà °á°ú)

$ cc -o fn02 ch0401_fn02.c  ©¬ ÄÄÆÄÀÏ ¹× ¸µÅ©

$ ./fn02  ©¬ ½ÇÇà

a = 10

b = 20

a+b = 30

 

Press any key to end...

 

 

Á¤¼öÇüÀÌ ¾Æ´Ñ°ÍÀ» ¹ÝȯÇÏ´Â ÇÔ¼öµé

¾ÕºÎºÐ¿¡¼­ ÇÔ¼ö°¡ ¹ÝȯÇÏ´Â µ¥ÀÌÅÍ Å¸ÀÔÁß¿¡¼­ ¹Ýȯ µ¥ÀÌÅͰ¡ ¾ø´Â voidÇü°ú int(Á¤¼ö)Çü¿¡ ´ëÇØ¼­ °æÇèÇØ º¸¾ÒÀ¸³ª, ÀÌÁ¦´Â ´Ù¾çÇÑ µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ´ëÇØ¼­ »ìÆìº¸µµ·Ï ÇÏÀÚ.  ¼öÇÐÀûÀÎ °è»êÀ» À§ÇÑ ¸¹Àº ÇÔ¼öµé(sqrt, sin, cos..)Àº ´ëºÎºÐ doubleÇüÀÇ µ¥ÀÌÅ͸¦ ¹ÝȯÇÑ´Ù.  ¹°·Ð ´Ù¸¥ ¸ñÀûÀ¸·Î Ư¼ºÈ­µÈ ÇÔ¼öµéÀº ÇØ´ç ¸ñÀû¿¡ ¸Â´Â µ¥ÀÌÅ͸¦ ¹ÝȯÇϵµ·Ï ÇÑ´Ù.  ¿¹¸¦µé¾î ¹®ÀÚ¿­À» ½Ç¼ö·Î º¯È¯ÇÏ´Â atof()ÇÔ¼ö¸¦ ÀÌÇØÇØ º¸µµ·Ï ÇÏÀÚ.  atof()ÇÔ¼ö´Â ÆÄ¶ó¹ÌÅÍ·Î ÀԷ¹ÞÀº ¹®ÀÚ¿­ sÀ» doubleÇüÀÇ ½Ç¼ö·Î º¯È¯ÇÏ´Â °ÍÀ¸·Î, ¾Õ¿¡¼­ ÀÌ¹Ì ½Ç½ÀÇØº» atoi()ÇÔ¼öÀÇ È®ÀåÇüÀÌ´Ù.  atof()ÇÔ¼ö´Â ºÎÈ£¿Í ¼Ò¼ýÁ¡, Á¤¼öºÎ¿Í ¼Ò¼öºÎ¸¦ ó¸®ÇÑ´Ù.  À̰ÍÀº Ç¥ÁØ ¶óÀ̺귯¸® ÇÔ¼ö·Î¼­ <stdlib.h> Çì´õÆÄÀÏ¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.

 

   #include <ctype.h>

 

   double atof(char s[])

   {

       double val, power;

       int i, sign;

 

       for (i = 0; isspace(s[i]); i++)  //È­ÀÌÆ® ½ºÆäÀ̽º ¹«½Ã

           ;

       sign = (s[i] == '-') ? -1 : 1;

       if (s[i] == '+' || s[i] == '-')

           i++;

       for (val = 0.0; isdigit(s[i]); i++)

           val = 10.0 * val + (s[i] - '0');

       if (s[i] == '.')

           i++;

       for (power = 1.0; isdigit(s[i]); i++) {

           val = 10.0 * val + (s[i] - '0');

           power *= 10;

       }

       return sign * val / power;

   }

 

Âü°íÀûÀ¸·Î, atof ÇÔ¼ö°¡ ¹ÝȯÇÏ´Â doubleÇüÀ» intÇüÀ¸·Î Çüº¯È¯(cast)Çϸé atoi ÇÔ¼ö¿Í µ¿ÀÏÇÑ °á°ú¸¦ ¾òÀ» ¼ö Àִµ¥, À̰ÍÀ» Ȱ¿ëÇÏ¿© atoi ÇÔ¼ö¸¦ ´Ù½Ã ÀÛ¼ºÇÏ¸é ¾Æ·¡¿Í °°´Ù.

 

   //atof ÇÔ¼ö¸¦ Ȱ¿ëÇÏ¿© ¹®ÀÚ¿­À» Á¤¼öÇüÀ¸·Î º¯È¯

   int atoi(char s[])

   {

       double atof(char s[]);  //atof ÇÔ¼ö ¼±¾ð

 

       return (int) atof(s);  //Á¤¼öÇüÀ¸·Î Çüº¯È¯

   }

 

¿ÜºÎ º¯¼öµé

C ÇÁ·Î±×·¥Àº ¿ÜºÎ º¯¼öµéÀ̳ª ÇÔ¼öµéÀÇ ÁýÇÕÀ¸·Î ±¸¼ºµÇ¾î ÀÖ´Ù.  ¿ÜºÎ(external)´Â ³»ºÎ(internal)¶ó´Â ÀÇ¹Ì¿Í ¹Ý´ëµÇ´Â °³³äÀÌ´Ù.  ¿ÜºÎ´Â ÇÔ¼ö ¹Ù±ùÂÊ, ³»ºÎ´Â ÇÔ¼ö ¾ÈÂÊÀ» ÀǹÌÇÑ´Ù.  ¿ì¸®°¡ Áö±Ý±îÁö »ç¿ëÇØ¿Â º¯¼öµéÀº ÇÔ¼ö ¾ÈÂÊ¿¡ Á¤ÀÇÇÑ ³»ºÎ º¯¼öµéÀ̾úÀ¸¸ç ÇÔ¼ö¿¡ Àü´ÞµÇ´Â ÆÄ¶ó¹ÌÅÍ ¶ÇÇÑ ³»ºÎ º¯¼öÀÌ´Ù.  ¿ÜºÎ º¯¼öµéÀº ÇÔ¼ö ¹Ù±ùÂÊ¿¡ Á¤ÀÇ µÇ¹Ç·Î ¼Ò½º ÆÄÀϳ»ÀÇ ¸ðµç ÇÔ¼ö¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¹Ý¸é¿¡, ³»ºÎ º¯¼öµéÀº ÇÔ¼ö ¾È¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù.  ÇÔ¼ö ÀÚ½ÅÀº Ç×»ó ¿ÜºÎÀÌ´Ù.  C¾ð¾î´Â ÇÔ¼ö¸¦ Á¤ÀÇÇÒ¶§ ¶Ç ´Ù¸¥ ÇÔ¼öÀÇ ³»ºÎ¿¡´Â Á¤ÀÇÇÏÁö ¸øÇÑ´Ù.

 

¿ÜºÎ º¯¼ö´Â ÇϳªÀÇ ¼Ò½º ÆÄÀϳ»¿¡¼­ Àü¿ªÀûÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÇÔ¼öµé »çÀÌ¿¡¼­ µ¥ÀÌÅ͸¦ ±³È¯Çϱâ À§ÇÑ ¸Å°³º¯¼ö³ª ¹Ýȯ°ªµéÀ» ´ë½ÅÇÒ ¼ö ÀÖ´Ù.  ¿ÜºÎ º¯¼ö°¡ Á¤ÀÇµÈ ÇÏ´ÜÀÇ ¸ðµç ÇÔ¼ö¿¡¼­ ¿ÜºÎ º¯¼ö¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.  ÇÔ¼öµé°£¿¡ ¸¹Àº ¼öÀÇ º¯¼öµéÀ» °øÀ¯ÇØ¾ß ÇÑ´Ù¸é, ±æ´Ù¶õ ¸Å°³º¯¼ö ¸®½ºÆ®¸¦ »ç¿ëÇÏ´Â °Íº¸´Ù ¿ÜºÎ º¯¼öµéÀ» »ç¿ëÇÏ´Â °ÍÀÌ Á»´õ ÆíÇϰí È¿À²ÀûÀÏ ¼ö ÀÖ´Ù.  ±×·¯³ª ¿ÜºÎ º¯¼öµéÀ» ³Ê¹« ³²¿ëÇÏ°Ô µÇ¸é ÇÔ¼öµé °¢°¢ÀÇ µ¶¸³¼ºÀÌ ºÎÁ·ÇØ Áö¹Ç·Î ÀüüÀûÀÎ ÇÁ·Î±×·¥ ±¸Á¶¿¡ ³ª»Û ¿µÇâÀ» ¹ÌÄ¥ ¼ö ÀÖ´Ù.

 

¿µ¿ª(scope) ±ÔÄ¢µé

C ÇÁ·Î±×·¥À» ÀÌ·ç´Â ÇÔ¼öµé°ú ¿ÜºÎº¯¼öµéÀº µ¿½Ã¿¡ ÄÄÆÄÀÏ µÇÁö ¾Ê¾Æµµ µÈ´Ù.  ÇÁ·Î±×·¥ ¼Ò½ºµéÀº ¿©·¯°³ÀÇ ÆÄÀϵ鿡 ³ª´©¾îÁ® ÀÖÀ» ¼ö ÀÖ°í, ÀÌ¹Ì ÄÄÆÄÀÏµÈ ·çƾµéÀº ¶óÀ̺귯¸®¿¡ ÀúÀåµÉ ¼öµµ ÀÖ´Ù.  ¿µ¿ª(scope)Àº »ç¿ëÀÚ°¡ Á¤ÀÇÇÑ ¸íĪÀÌ ÇÁ·Î±×·¥¿¡¼­ »ç¿ëµÇ´Â ¹üÀ§(¼ö¸í)¸¦ ÀǹÌÇÑ´Ù.  ÇÔ¼ö¾ÈÀÇ ½ÃÀÛ ºÎºÐ¿¡¼­ ¼±¾ðµÈ ÀÚµ¿ º¯¼öÀÇ ¿µ¿ªÀº ±× ÇÔ¼ö ³»ºÎÀÌ´Ù.  ³»ºÎ º¯¼ö´Â ±×°ÍÀÌ Á¤ÀÇµÈ °¢°¢ÀÇ ÇÔ¼ö¾È¿¡¼­ Åë¿ëµÇ¹Ç·Î °¢°¢ÀÇ ÇÔ¼ö¸¶´Ù µ¿ÀÏÇÑ À̸§ÀÇ º¯¼ö°¡ À־ ¹®Á¦µÇÁö ¾Ê´Â´Ù.  ÇÔ¼ö·Î Àü´ÞµÇ´Â ÆÄ¶ó¹ÌÅ͵鵵 ³»ºÎ º¯¼ö¿Í µ¿ÀÏÇÑ Àǹ̷ΠÃë±ÞµÈ´Ù.  ¿ÜºÎº¯¼ö¿Í ÇÔ¼ö´Â ÆÄÀϳ»ºÎ¿¡¼­ ±×µéÀÌ ¼±¾ðµÈ À§Ä¡¿¡¼­ºÎÅÍ ÆÄÀÏÀÇ ³¡±îÁö Åë¿ëµÈ´Ù.

 

ÇÁ·Î±×·¥ ¼Ò½º ÆÄÀÏÀÌ µÎ°³ ÀÌ»óÀ¸·Î ³ª´©¾îÁ® ÀÖÀ»¶§, ¼Ò½º ÆÄÀϰ£¿¡ ¿ÜºÎº¯¼ö¸¦ µ¿ÀÏÇÏ°Ô Ãë±ÞÇÏ·Á¸é extern À̶ó°í ¼±¾ðÇØ ÁÖ¾î¾ßÁö µ¿ÀÏÇÑ ±â¾ïÀå¼Ò¸¦ »ç¿ëÇÑ´Ù.

¿¹¸¦µé¸é,

 

  in file1.c:

      extern int sp;

      extern double val;

 

  in file2.c:

      int sp = 0;

      double val;

 

À§¿Í °°ÀÌ file1.c¿Í file2.c¿¡¼­ sp¿Í valÀ» µ¿ÀÏÇÑ ¿ÜºÎº¯¼ö·Î »ç¿ëÇÏ·Á¸é file1.c¿¡ externÀ¸·Î ¼±¾ðÇØ ÁÖ¾î¾ß ÇÑ´Ù.

 

Çì´õ ÆÄÀϵé

¿ì¸®´Â ÀÌ¹Ì ¾Õ¿¡¼­ #include <stdio.h> Çì´õÆÄÀÏÀ» º¸¾ÒÁö¸¸, À̰Ϳ¡ ´ëÇÑ ÀÚ¼¼ÇÑ °³³äÀ» Áö±ÝºÎÅÍ ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.  Çì´õÆÄÀÏÀº ´Ù¸¥ ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ´Â ÇÔ¼ö¸¦ »ç¿ëÇϰíÀÚÇÒ ¶§ ±× ÇÔ¼öÀÇ ¼±¾ðºÎ¸¦ ÄÄÆÄÀÏ·¯¿¡°Ô ¾Ë·ÁÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù.  º¯¼ö¸¦ »ç¿ëÇÒ¶§ ¹Ì¸® º¯¼öÀÇ µ¥ÀÌÅÍ Å¸ÀÔÀ» ¼±¾ðÇÏ°í »ç¿ëÇÒ ¼ö ÀÖ´Â °Íó·³ ÇÔ¼ö ¶ÇÇÑ ¹Ì¸® ¼±¾ðÇØ ÁÖ¾î¾ß Çϴµ¥, À̶§ ´Ù¸¥ ÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖ´Â ÇÔ¼ö´Â Çì´õÆÄÀÏ¿¡ ¼±¾ðºÎ¸¦ ±â¼úÇÏ°í ±× ÇÔ¼ö¸¦ »ç¿ëÇϰíÀÚ ÇÏ´Â ÆÄÀÏ¿¡¼­ ÇØ´ç Çì´õÆÄÀÏÀ» #include·Î Æ÷ÇÔ½ÃÄÑ ÁÖ¾î¾ß ÇÑ´Ù.

 

Çì´õÆÄÀÏÀº ÇÁ·Î±×·¥ ¼Ò½º¸¦ ¿©·¯°³ÀÇ ÆÄÀÏ·Î ³ª´©¾î¼­ °¢°¢ ºÐ¸®µÈ ÇüÅ·ΠÄÄÆÄÀÏÇÒ¶§ »ç¿ëÇÑ´Ù.

¶ÇÇÑ, ÀÌ¹Ì ÄÄÆÄÀÏµÈ ÆÄÀÏ(¶óÀ̺귯¸®)¿¡ ÀÖ´Â ÇÔ¼ö¸¦ »ç¿ëÇϰíÀÚ ÇÒ¶§µµ »ç¿ëÇÑ´Ù.  ±Ô¸ð°¡ Å« ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ¶§ ¼Ò½º¸¦ ¿©·¯°³ÀÇ ÆÄÀÏ·Î ³ª´©¾î¼­ ÀÛ¼ºÇÏ´Â °ÍÀÌ ÇÊ¿äÇϸç, À̶§ »ç¿ëÇÏ´Â ´Ù¾çÇÑ ÇÔ¼öµéÀÇ ¼±¾ðºÎ¸¦ °øÅëµÈ Çì´õÆÄÀÏ ¾È¿¡ ¸ð¾Æ¼­ ÀÛ¼ºÇØ µÎ´Â °ÍÀÌ È¿À²ÀûÀÌ´Ù.

 

°íÁ¤(Static) º¯¼öµé

¿ÜºÎ °íÁ¤(Static) ¼±¾ðÀº ÇÔ¼öµéÀ» ¼±¾ðÇÒ¶§ ÀÚÁÖ »ç¿ëÇÑ´Ù.  ÇÔ¼ö¸íµéÀº Àü¿ªÀûÀ̱⠶§¹®¿¡ ÇÁ·Î±×·¥ Àüü¿¡¼­ Á¢±Ù°¡´ÉÇÏ´Ù.  ±×·¯³ª, ÇÔ¼ö°¡ °íÁ¤(Static)À¸·Î ¼±¾ðµÇ¸é ÀÌ ÇÔ¼ö°¡ ¼±¾ðµÈ ÆÄÀϳ»¿¡¼­¸¸ Á¢±Ù°¡´ÉÇÏ°í ´Ù¸¥ ÆÄÀÏ¿¡¼­´Â Á¢±Ù ºÒ°¡´ÉÇÏ´Ù.

 

°íÁ¤(static) ¼±¾ðÀº ³»ºÎ º¯¼öµé¿¡µµ Àû¿ëÇÒ ¼ö ÀÖ´Ù.  ³»ºÎ º¯¼ö´Â ÇÔ¼ö°¡ ½ÇÇàµÉ¶§ ÇÒ´ç µÇ¾ú´Ù°¡ ÇÔ¼ö ½ÇÇàÀÌ Á¾·áµÇ¸é ÇÒ´ç ÇØÁ¦ µÇÁö¸¸, ³»ºÎ º¯¼ö¸¦ °íÁ¤À¸·Î ¼±¾ðÇϸé ÇÔ¼öÀÇ È°µ¿ ¿©ºÎ¿¡ »ó°ü¾øÀÌ ³»ºÎ °íÁ¤ º¯¼ö°¡ ¼±¾ðµÈ ÇÔ¼öÀÇ ³»ºÎ¿¡ Áö¼ÓÀûÀ¸·Î ³²¾ÆÀÖ°Ô µÈ´Ù.  Áï, ³»ºÎ °íÁ¤ º¯¼ö´Â ÇØ´ç ÇÔ¼ö ³»ºÎ¿¡¼­ ÀڽŸ¸ÀÇ ÀúÀå°ø°£À» Áö¼ÓÀûÀ¸·Î °¡Áö°í Àִ´Ù.

 

·¹Áö½ºÅÍ º¯¼öµé

·¹Áö½ºÅÍ(register) ¼±¾ðÀº º¯¼ö¸¦ CPUÀÇ ·¹Áö½ºÅÍ¿¡ À§Ä¡Çϵµ·Ï ÄÄÆÄÀÏ·¯¿¡°Ô Áö½ÃÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.  º¯¼ö°¡ CPUÀÇ ·¹Áö½ºÅÍ¿¡ À§Ä¡Çϸé 󸮼ӵµ°¡ »¡¶óÁø´Ù.  ´Ü, ·¹Áö½ºÅÍ(register) ¼±¾ðÀº ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ¼­ ¼±ÅÃÀûÀ¸·Î ¹Þ¾Æµé¿© Áø´Ù.  ·¹Áö½ºÅÍ(register) ¼±¾ðÀº ´ÙÀ½°ú °°´Ù.

 

   register int  x;

   register char c;

 

·¹Áö½ºÅÍ º¯¼ö´Â ¾Æ·¡Ã³·³ ÀÚµ¿ º¯¼ö³ª ÇÔ¼öÀÇ ÆÄ¶ó¹ÌÅÍ º¯¼ö¿¡ ¼±¾ðÇÒ ¼ö ÀÖ´Ù.

 

   function (register unsigned m, register long n)

   {

       register int i;

       ...

   }

 

½ÇÁ¦ÀûÀ¸·Î ·¹Áö½ºÅÍ º¯¼öµéÀº Á¦¾à»çÇ×µéÀÌ ÀÖ´Ù.  ·¹Áö½ºÅÍ´Â ¿ë·®ÀÌ Á¦ÇѵǾî Àֱ⠶§¹®¿¡ ´ÜÁö ¸î°³ÀÇ º¯¼öµé¸¸ ·¹Áö½ºÅÍ¿¡ ¹èÄ¡µÉ ¼ö ÀÖ´Ù.  ·¹Áö½ºÅÍ ¼±¾ðÀÌ ¼ö·® Á¦ÇÑÀ» ÃʰúÇϸé ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ¼­ ¹«½ÃµÇ±â ¶§¹®¿¡ ¹®Á¦´Â ¹ß»ýÇÏÁö ¾Ê´Â´Ù.  ·¹Áö½ºÅÍ´Â ÁÖ¼Ò°¡ ¾ø±â ¶§¹®¿¡ ÁÖ¼Ò(Æ÷ÀÎÅÍ)¸¦ ÅëÇØ¼­´Â Á¢±ÙÇÒ ¼ö ¾ø´Ù.  ±âŸ ·¹Áö½ºÅÍ º¯¼öÀÇ Æ¯Â¡Àº ¸Ó½Å(CPU)ÀÇ Á¾·ù¿¡ ÀÇÁ¸ÇÑ´Ù.

 

ºí·Ï ±¸Á¶

C¾ð¾î´Â ÇÔ¼ö ³»ºÎ¿¡¼­ ¶Ç´Ù¸¥ ÇÔ¼ö¸¦ Á¤ÀÇÇÏÁö ¸øÇÏÁö¸¸, º¯¼öµéÀº ÇÔ¼ö ³»ºÎ¿¡¼­ ºí·° ±¸Á¶·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.  C¾ð¾î¿¡¼­ ºí·ÏÀº Áß°£°ýÈ£ {À¸·Î ½ÃÀÛÇØ¼­ }À¸·Î ³¡³­´Ù.  ºí·Ï¾È¿¡ ¼±¾ðµÈ º¯¼ö´Â ºí·ÏÀÌ ³¡³ª´Â °÷¿¡¼­ ¼Ò¸êµÈ´Ù.  ¾Æ·¡ Äڵ忡¼­ Á¤¼öÇü º¯¼ö i´Â if Á¶°ÇÀÌ ÂüÀÎ ºí·Ï ¾È¿¡¼­ À¯È¿ÇÏ´Ù.  i´Â ÀÚµ¿º¯¼öÀÌ¸ç ºí·Ï¿¡ ÁøÀÔÇÑ »ó´Ü¿¡¼­ ÃʱâÈ­µÇ°í ºí·Ï¿¡¼­ ¹þ¾î³¯¶§ ¼Ò¸êµÈ´Ù.

 

   if (n > 0) {

       int i;  //iº¯¼ö ¼±¾ð

 

       for (i = 0; i < n; i++)

           ...

   }

 

ÇÔ¼ö·Î Àü´ÞµÇ´Â ¸Å°³º¯¼öµµ ÀÚµ¿º¯¼öÀÌ´Ù.  ¾Æ·¡ Äڵ忡¼­ ÇÔ¼ö f()·Î Àü´ÞµÇ´Â double x´Â ÇÔ¼ö f()ÀÇ ºí·Ï ³»ºÎ¿¡¼­¸¸ À¯È¿Çϰí ÇÔ¼ö f()ÀÇ ºí·ÏÀ» ¹þ¾î³ª¸é ¼Ò¸ê µÇ¹Ç·Î »ó´Ü¿¡¼­ Àü¿ªº¯¼ö·Î ¼±¾ðµÈ int x¿Í º¯¼ö¸íÀº °°Áö¸¸ ´Ù¸¥ µ¥ÀÌÅÍ Å¸ÀÔÀÎ double·Î Ãë±ÞµÈ´Ù.  Áï, º¯¼ö x´Â ÇÔ¼ö f()ÀÇ ºí·Ï ¿ÜºÎ¿¡¼­´Â Á¤¼öÇüÀ¸·Î ÇÔ¼ö f()ÀÇ ºí·Ï ³»ºÎ¿¡¼­´Â doubleÇüÀ¸·Î Ãë±ÞµÈ´Ù.

 

   int x;

   int y;

 

   f(double x)

   {

       double y;

   }

 

±×·¯³ª À§ÀÇ ÄÚµå¿Í °°ÀÌ º¯¼ö¸í xÀ» ºí·Ï ¿ÜºÎ¿Í ³»ºÎ¿¡¼­ µ¿ÀÏÇÑ ¸íĪÀ¸·Î »ç¿ëÇÏ´Â °ÍÀº Äڵ带 À¯Áö º¸¼öÇÒ¶§ È¥µ¿ÀÇ ¹®Á¦°¡ ÀÖÀ¸¹Ç·Î ÇÇÇÏ´Â °ÍÀÌ ÁÁ´Ù.

 

(½Ç½À ¼Ò½º)

/*

    author:     Jung,JaeJoon(rgbi3307@nate.com, http://www.kernel.bz/)

    comments:   ºí·°±¸Á¶

*/

 

#include <stdio.h>

 

main()

{

    int n = 10;

int i = 20;

 

    if (n > 0) {

        int i;  //»õ·Î¿îº¯¼öi ¼±¾ð

 

        for (i = 0; i < n; i++)

            printf ("%d ", i);

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

    } else {

        int i = 30;

    }

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

 

    printf("\nPress any key to end...");

    getchar();

}

 

 

(½ÇÇà °á°ú)

$ cc -o ch0408 ch0408_block01.c   ©¬ ÄÄÆÄÀÏ ¹× ¸µÅ©

$ ./ch0408   ©¬ ½ÇÇà

0 1 2 3 4 5 6 7 8 9

i=10

i=20

 

Press any key to end...

 

 

(½Ç½À ¼Ò½º)

/*

    author:     Jung,JaeJoon(rgbi3307@nate.com, http://www.kernel.bz/)

    comments:   ºí·°±¸Á¶

*/

 

#include <stdio.h>

 

static int x, y;

 

fn (double x)

{

    double y;

 

    y = x;

    printf ("y=%f\n", y);

}

 

main ()

{

    x = 10;

    y = 20;

 

    fn (2.71828);

 

    printf("\nPress any key to end...");

    getchar();

}

 

 

(½ÇÇà °á°ú)

$ cc -o ch0408 ch0408_block02.c   ©¬ ÄÄÆÄÀÏ ¹× ¸µÅ©

$ ./ch0408   ©¬ ½ÇÇà

y=2.718280

 

Press any key to end...

 

 

ÃʱâÈ­

º¯¼öÀÇ ÃʱâÈ­¿¡ ´ëÇØ¼­ Áö±Ý±îÁö ¿©·¯¹ø ¾ð±ÞµÇ¾úÀ¸³ª, ¸î°¡Áö Áß¿äÇÑ »çÇ×À» ¾Ë¾Æº¸µµ·Ï ÇÏÀÚ.

º¯¼ö¸¦ ¼±¾ðÇÒ¶§ ´ëÀÔ(=) ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ÃʱâÈ­¸¦ ¸í½ÃÀûÀ¸·Î ÇÏÁö ¾ÊÀ¸¸é, ¿ÜºÎ(external) º¯¼ö¿Í °íÁ¤(static) º¯¼ö´Â ¿µÀ¸·Î ÃʱâÈ­ µÇ°í, ÀÚµ¿(automatic) º¯¼ö¿Í ·¹Áö½ºÅÍ(register) º¯¼ö´Â ÃʱâÈ­ µÇ´Â °ª ¾øÀÌ ÀÓÀÇÀÇ °ª(garbage)ÀÌ µé¾î°£´Ù.  º¯¼öÀÇ ÃʱâÈ­´Â ¾Æ·¡¿Í °°ÀÌ ´ëÀÔ(=) ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ¸í½ÃÀûÀ¸·Î ÇÒ ¼ö ÀÖ´Ù.

 

   int x = 1;

   char squota = "\'";

   long day = 1000L * 60L * 60L * 24L; /* milliseconds/day */

 

¿ÜºÎ¿Í °íÁ¤ º¯¼ö´Â ÃʱâÈ­ µÇ´Â °ªÀÌ »ó¼ö°ªÀ¸·Î Ç¥Çö µÇ¾î¾ß Çϸç ÇÁ·Î±×·¥ÀÇ ½ÇÇàÀÌ ½ÃÀÛµÉ ¶§ Çѹø¸¸ ÃʱâÈ­°¡ ÀÌ·ç¾î Áø´Ù.  ¹Ý¸é¿¡ ÀÚµ¿º¯¼ö¿Í ·¹Áö½ºÅÍ º¯¼ö´Â ÃʱâÈ­µÇ´Â °ªÀÌ »ó¼ö°¡ ¾Æ´Ï¾îµµ µÇ¸ç ´Ù¾çÇÑ Ç¥Çö½ÄÀÌ °¡´ÉÇÏ´Ù.  ÀÚµ¿º¯¼ö¿Í ·¹Áö½ºÅÍ º¯¼ö´Â »ç¿ëÀÚÀÇ ÃëÇâ¿¡ ¸Â°Ô ¸í½ÃÀûÀ¸·Î ÃʱâÈ­½ÃÄÑ ÁÖ´Â °ÍÀÌ ÁÁ´Ù.

 

Àç±Í(Recursion)

C ¾ð¾îÀÇ ÇÔ¼ö´Â Àç±Í(Recursion)ÀûÀ¸·Î È£ÃâÇÒ ¼ö ÀÖ´Ù.  ÇÔ¼ö ³»ºÎ¿¡¼­ ÇØ´ç ÇÔ¼ö¸¦ ´Ù½Ã È£ÃâÇÒ ¼ö ÀÖ´Â ¹æ½ÄÀε¥ ¿¹Á¦¸¦ ÅëÇÏ¿© ÀÍÇô º¸µµ·Ï ÇÏÀÚ.

 

(½Ç½À ¼Ò½º)

/*

    author:     Jung,JaeJoon(rgbi3307@nate.com, http://www.kernel.bz/)

    comments:   Àç±ÍÈ£Ãâ

*/

 

#include <stdio.h>

 

void printd (int n)

{

   if (n < 0) {

       putchar('-');

       n = -n;

   }

   if (n / 10)

       printd(n / 10);

 

   putchar(n % 10 + '0');

}

 

main ()

{

    printd (123);

 

     printf("\nPress any key to end...");

    getchar();

}

 

 

(½ÇÇà °á°ú)

$ cc -o recur01 ch0410_recur01.c  ©¬ ÄÄÆÄÀÏ ¹× ¸µÅ©

$ ./recur01  ©¬ ½ÇÇà

123

 

Press any key to end...

 

¾Æ·¡ÀÇ ½Ç½À¿¹Á¦´Â Àç±ÍÈ£ÃâÀ» Àß È°¿ëÇϰí ÀÖ´Â quick sort ÄÚµåÀÌ´Ù.  ÀÌ ¾Ë°í¸®ÁòÀº 1962³â¿¡ ¿µ±¹ÀÇ ÄÄÇ»ÅÍ °úÇÐÀÚ C.A.R.Hoare¿¡ ÀÇÇØ¼­ °³¹ßµÇ¾ú´Ù.

 

(½Ç½À ¼Ò½º)

/*

    author:     Jung,JaeJoon(rgbi3307@nate.com, http://www.kernel.bz/)

    comments:   Àç±ÍÈ£Ãâ(quicksort, a sorting algorithm developed by C.A.R.Hoare in 1962)

*/

 

#include <stdio.h>

 

//swap: ¹è¿­¿ä¼Òv[i] ¿Ív[j]ÀǰªÀ»¹Ù²Þ

void swap (int v[], int i, int j)

{

   int temp;

 

   temp = v[i];

   v[i] = v[j];

   v[j] = temp;

}

 

//qsort: ¹è¿­¿ä¼Òv[left]¿¡¼­v[right] »çÀÌÀǰªÀ»¿À¸§Â÷¼øÀ¸·ÎÁ¤·Ä

void qsort(int v[], int left, int right)

{

   int i, last;

   void swap(int v[], int i, int j);

  

   if (left >= right)

       return;

 

   swap (v, left, (left + right)/2);

 

   last = left;

   for (i = left + 1; i <= right; i++)

       if (v[i] < v[left])

           swap (v, ++last, i);

 

   swap(v, left, last);

 

   qsort(v, left, last-1);

   qsort(v, last+1, right);

}

 

main ()

{

    int i;

    int v[] = {2, 9, 4, 7, 6, 7, 5, 8, 3, 1};

 

    qsort (v, 0, 9);

 

    for (i = 0; i < 9; i++)

        printf("%d, ", v[i]);

    printf("%d", v[i]);

}

 

 

(½ÇÇà °á°ú)

$ cc -o recur02 ch0410_recur02.c  ©¬ ÄÄÆÄÀÏ ¹× ¸µÅ©

$ ./recur02  ©¬ ½ÇÇà

1, 2, 3, 4, 5, 6, 7, 7, 8, 9

 

 

C¾ð¾î Àü󸮱â(Preprocessor)

C¾ð¾î´Â ÄÄÆÄÀϽà ¿ì¼±ÀûÀ¸·Î ó¸®ÇÏ´Â Àü󸮱⸦ Á¦°øÇÑ´Ù.  ´ëÇ¥ÀûÀÎ °ÍÀ¸·Î #include¿Í #define, #if°¡ ÀÖ´Ù.  #include´Â ÄÄÆÄÀϽà ÆÄÀÏÀÇ ³»¿ë¹°À» Æ÷ÇÔ ½ÃŰ´Â ¿ªÇÒÀ» Çϸç, #defineÀº ¹®ÀÚ¿­À» Á¤ÀÇÇÏ¿© ġȯÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.  #if´Â Á¶°ÇºÎ ÄÄÆÄÀÏÀ» Çϵµ·Ï ÇØÁØ´Ù.

 

ÆÄÀÏ Æ÷ÇÔ±â(#include)

ÆÄÀÏÀÇ ³»¿ë¹°À» Æ÷ÇÔ ½ÃŰ´Â #include´Â ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇÑ´Ù.

 

   #include "filename"

ȤÀº

   #include <filename>

 

Áï, filenameÀÇ ³»¿ëÀ» Æ÷ÇÔ½ÃŲ´Ù.  ÆÄÀϸíÀ» "filename" ó·³ ""À» »ç¿ëÇϸé ÇöÀç ¼Ò½º ÇÁ·Î±×·¥ÀÌ ÀÖ´Â °÷¿¡¼­ filenameÀ» ã¾Æ¼­ ³»¿ëÀ» Æ÷ÇÔ½ÃŲ´Ù.  ÆÄÀϸíÀ» <filename>ó·³ <>À» »ç¿ëÇÏ¸é ÆÄÀÏÀÌ ±¸ÇöµÉ¶§ Á¤ÀÇµÈ °÷(¶óÀ̺귯¸®)¿¡¼­ ÆÄÀÏÀ» ã¾Æ¼­ ³»¿ëÀ» Æ÷ÇÔ½ÃŲ´Ù.  #include´Â ÇÁ·Î±×·¥ÀÇ ±Ô¸ð°¡ Å©Áú¶§ º¯¼öµé°ú ÇÔ¼öµéÀÇ ¼±¾ðºÎ¸¦ Çì´õ ÆÄÀÏ·Î ´ÙÇÔ²² ¹­¾î¼­ Æ÷ÇÔ ½Ã۰í½Ã ÇÒ ¶§ À¯¿ëÇÏ°Ô »ç¿ëµÈ´Ù.  ÀÌ·¸°Ô Çϸé ÇÁ·Î±×·¥ ¼Ò½ºÀÇ À¯Áöº¸¼ö ¹× °ü¸®°¡ ½¬¾îÁø´Ù.

 

¸ÅÅ©·Î ġȯ(#define)

#defineÀ» »ç¿ëÇÑ ¸ÅÅ©·Î ġȯÀÇ ¹®¹ýÀº ¾Æ·¡¿Í °°´Ù.

 

#define name replacement text

 

ÅäÅ« nameÀº replacement text·Î ġȯ(±³Ã¼,replacement)µÈ´Ù.  replacement text´Â ¶óÀÎÀÇ ³¡±îÁö ±â¼úÇÒ ¼ö ÀÖ°í, ³Ê¹« ±æ´Ù¸é ¹é½½·¡½Ã ¹®ÀÚ(\)¸¦ ³¡¿¡ Ç¥½ÃÇÏ¿© °³Çà ÇÑÈÄ °è¼Ó Ç¥½ÃÇÒ ¼ö ÀÖ´Ù.  nameÀ¸·Î ġȯµÈ ¹®ÀåÀº ÄÄÆÄÀÏÀÌ µÇ¸é¼­ Á¤Àǰ¡ ½ÃÀ۵Ǵ ½ÃÁ¡¿¡¼­ ¼Ò½ºÆÄÀÏÀÇ ƒP±îÁö À¯È¿ÇÏ´Ù.

 

¿©·¯°¡Áö ¿¹Á¦¸¦ ÅëÇÏ¿© #defineÀ¸·Î ¸ÅÅ©·Î¸¦ Á¤ÀÇÇÏ´Â ¹æ¹ýÀ» ÀÍÇôº¸ÀÚ.

 

#define forever for (;;)

 

À§ÀÇ ¹®ÀåÀº forever¶ó´Â nameÀ¸·Î ¹«ÇÑ·çÇÁ¸¦ Á¤ÀÇÇÑ´Ù.  forever´Â for(;;)·Î ġȯµÇ¾î ¹«ÇÑ·çÇÁ¿Í °°Àº ¹®ÀåÀÌ µÈ´Ù.  ¶ÇÇÑ ¾Æ·¡¿Í °°ÀÌ ¸Å°³Àμö(arguments)µéÀ» Á¤ÀÇÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù.

 

#define max(A, B) ((A) > (B) ? (A) : (B))

 

ÇÔ¼öÈ£Ãâó·³ º¸ÀÏÁö ¸ð¸£³ª, max(A, B)´Â ÀζóÀÎ ÄÚµå·Î ġȯµÈ´Ù.  ¿¹¸¦µé¸é,

 

x = max(p+q, r+s);

 

À§ÀÇ ¹®ÀåÀº

 

x = ((p+q) > (r+s) ? (p+q) : (r+s));

 

À¸·Î ġȯ(±³Ã¼)µÈ´Ù.

 

±×·¯³ª À̰ÍÀ» »ç¿ëÇÒ¶§ ¸î°¡Áö ÇÔÁ¤¿¡ ºüÁöÁö ¾Êµµ·Ï ÁÖÀÇÇÑ´Ù.

 

max(i++, j++);   /* À߸øµÈ »ç¿ë */

 

Áõ°¡¿¬»êÀÌ µÎ¹ø ¹ß»ýÇÑ´Ù.

 

#define square(x) x * x

 

À§ÀÇ ¸ÅÅ©·Î¸¦ square(z+1)¿Í °°ÀÌ È£ÃâÇÏ¸é ¿øÇÏÁö ¾Ê´Â °á°ú°¡ ³ª¿Ã ¼ö ÀÖ´Ù.

 

À§¿Í °°ÀÌ ¸î°¡Áö »çÇ×À» ÁÖÀÇÇϸé, ¸ÅÅ©·Î´Â ¾ÆÁÖ À¯¿ëÇÏ´Ù.  <stdio.h>¿¡ ÀÖ´Â ÄÚµåµéÀ» º¸¸é, getchar ¿Í putchar ´Â ¸ÅÅ©·Î·Î Á¤ÀǵǾî À־ ½ÇÇà(run-rime)½Ã ÇÔ¼öÈ£ÃúÀÇ ºÎÇÏ(overhead)¸¦ ÇÇÇÒ ¼ö ÀÖ´Ù.  ¸ÅÅ©·Î¸¦ Á¤ÀÇÇÒ ¶§ ¹®ÀÚ¿­À» ¸Å°³Àμö·Î ³Ñ°Ü¾ß ÇÏ´Â °æ¿ì°¡ ÀÖÀ» ¼ö ÀÖ´Ù.  À̶§ ¸Å°³Àμö¿¡ #¹®ÀÚ¸¦ ³ÖÀ¸¸é µÈ´Ù.  ¿¹¸¦µé¸é,

 

#define dprint(expr) printf(#expr ¡° = %g\n¡±, expr)

 

ÀÌ·¸°Ô ¸ÅÅ©·Î¸¦ Á¤ÀÇÇϰí,

 

dprint(x/y);

 

¸¦ È£ÃâÇϸé, ¾Æ·¡¿Í °°ÀÌ Ä¡È¯µÈ´Ù.

 

printf(¡°x/y¡± ¡° = &g\n¡±, x/y);

 

¹®ÀÚ¿­ÀÌ ÇÕÃÄÁ®¼­ °á±¹ ´ÙÀ½°ú °°ÀÌ µÈ´Ù.

 

printf(¡°x/y = &g\n¡±, x/y);

 

Àü󸮱⠿¬»êÀÚ ##Àº ¸ÅÅ©·Î°¡ È®Àå(ġȯ)µÉ¶§ ¸Å°³ÀÎÀÚµéÀ» ÇÕÄ¡´Âµ¥ »ç¿ëÇÑ´Ù.  ¿¹¸¦µé¸é,

 

#define paste(front, back) front ## back

 

ÀÌ·¸°Ô Á¤ÀÇÇϸé, paste(name, 1) ´Â name1 ÅäÅ«À» »ý¼ºÇÑ´Ù.

 

(½Ç½À ¼Ò½º)

/*

    author:     Jung,JaeJoon(rgbi3307@nate.com, http://www.kernel.bz/)

    comments:   Àü󸮱â, ¸ÅÅ©·Îġȯ

*/

 

#include <stdio.h>

 

#define max(A, B) ((A) > (B) ? (A) : (B))

#define square(x) x * x

#define dprint(expr) printf(#expr " = %d\n", expr)

#define paste(front, back) front ## back

 

main ()

{

    int i, j, k;

    int ia=5, ib=10, iaib=0;

 

    i = 3;

    j = 7;

    k = max (i++, j++);

    printf("i=%d, j=%d, k=%d\n", i, j, k);

 

    printf("square=%d, %d, %d\n", square(ia), square(ia+1), square(ia+2));

 

    dprint(max(ia, ib));

 

    printf("%d", paste(ia, ib));

 

    printf("\nPress any key to end...");

    getchar();

}

 

 

(½ÇÇà °á°ú)

$ cc -o ch0411 ch0411_mac01.c   ©¬ ÄÄÆÄÀÏ ¹× ¸µÅ©

$ ./ch0411   ©¬ ½ÇÇà

i=4, j=9, k=8

square=25, 11, 17

max(ia, ib) = 10

0

Press any key to end...

 

Á¶°ÇºÎ ÄÄÆÄÀÏ(#if)

ÇÁ·Î±×·¥ ¼Ò½º¸¦ ÄÄÆÄÀÏÇÏ´Â µ¿¾È¿¡ #if¸¦ ÅëÇÏ¿© ¹®ÀåµéÀ» Á¶°ÇÀûÀ¸·Î Æ÷ÇÔ½Ãų ¼ö ÀÖ´Ù.  #if´Â »ó¼ö Á¤¼ö Ç¥Çö½ÄÀ» Æò°¡ÇÑ´Ù(sizeof, Çüº¯È¯, enum »ó¼öµéÀº Æ÷ÇÔµÇÁö ¾ÊÀ½).  ¸¸ÀÏ #if Ç¥Çö½ÄÀÌ zero°¡ ¾Æ´Ï¶ó¸é, ÇÏÀ§ÀÇ ¶óÀÎÀÌ #endif ȤÀº #elif ȤÀº #else¸¦ ¸¸³¯¶§±îÁö Æ÷ÇԵȴÙ(#elif´Â else-if¿Í À¯»çÇÔ).  ¸¸¾à nameÀÌ Á¤ÀÇ µÇ¾î ÀÖ´Ù¸é, #if¿¡¼­ defined(name)À¸·Î Ç¥ÇöµÇ´Â ³í¸® °á°ú°ªÀº 1À̰í, ±×·¸Áö ¾ÊÀº °æ¿ì´Â 0ÀÌ´Ù.  ¿¹¸¦µé¸é, hdr.h Çì´õÆÄÀÏÀÇ ³»¿ëÀ» Çѹø¸¸ Æ÷ÇÔ½Ã۰íÀÚ ÇÑ´Ù¸é, ¾Æ·¡¿Í °°ÀÌ #if ¿Í #endif »çÀÌ¿¡ ³»¿ëÀ» ÀÛ¼ºÇÑ´Ù.

 

#if !defined(HDR)

   #define HDR

       /* Çì´õÆÄÀÏ hdr.h ÀÇ ³»¿ëÀ» ¿©±â¿¡ ÀÛ¼º */

#endif

 

hdr.h Çì´õÆÄÀÏÀÌ Ã³À½À¸·Î Æ÷ÇÔ(include)µÉ¶§ HDRÀÌ Á¤ÀǵȴÙ.  ±×ÀÌÈÄ¿¡ Æ÷ÇԵǴ °ÍµéÀº ÀÌ¹Ì HDRÀÌ Á¤ÀÇ µÇ¾î ÀÖ¾î #ifÀÇ Á¶°ÇÀ» ¸¸Á·ÇÏÁö ¾ÊÀ¸¹Ç·Î #endif ´ÙÀ½À¸·Î À̵¿(skip)ÇÏ°Ô µÈ´Ù.  À§¿Í À¯»çÇÑ ¹æ½ÄÀ» »ç¿ëÇÏ¿© ƯÁ¤ ÆÄÀÏÀÌ ¿©·¯°³ Æ÷ÇԵǴ °ÍÀ» ¹æÁöÇϰí, ƯÁ¤È¯°æ¿¡¼­ ¿øÇÏ´Â Çì´õ ÆÄÀϸ¸ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.  #if Á¶°ÇÀ» ¾Æ·¡¿Í °°ÀÌ ±¸¼ºÇÏ¸é Æ¯Á¤ SYSTEM¿¡ ¸Â´Â Çì´õÆÄÀÏÀ» Áߺ¹¾øÀÌ µ¶¸³ÀûÀ¸·Î Æ÷ÇÔ½Ãų ¼ö ÀÖ´Ù.

 

   #if SYSTEM == LINUX

       #define HDR ¡°linux.h¡±

   #elif SYSTEM == BSD

       #define HDR ¡°bsd.h¡±

   #elif SYSTEM == MSDOS

       #define HDR ¡°msdos.h¡±

   #else

       #define HDR ¡°default.h¡±

   #endif

   #include HDR

 

¶ÇÇÑ, #ifdef ¿Í #ifndefÀº ¸íĪ(name)ÀÌ Á¤ÀǵǾî ÀÖ´ÂÁö ¿©ºÎ¸¦ ÆÇ´ÜÇÑ´Ù.  #if¿¡ ´ëÇÑ À§ÀÇ Ã¹¹øÂ° ¿¹Á¦´Â ´ÙÀ½°ú °°ÀÌ ´Ù½Ã ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.

 

#ifndef HDR

   #define HDR

        /* Çì´õÆÄÀÏ hdr.h ÀÇ ³»¿ëÀ» ¿©±â¿¡ ÀÛ¼º */

#endif

 

(½Ç½À ¼Ò½º)

/*

    author:     Jung,JaeJoon(rgbi3307@nate.com, http://www.kernel.bz/)

    comments:   Á¶°ÇÄÄÆÄÀÏ

*/

 

#include <stdio.h>

#define SYSTEM LINUX

 

#if SYSTEM == LINUX

   #define HDR "linux.h"

#elif SYSTEM == BSD

   #define HDR "bsd.h"

#elif SYSTEM == MSDOS

   #define HDR "msdos.h"

#else

   #define HDR "default.h"

#endif

 

//#include HDR

 

int main ()

{

    printf("%s", HDR);

 

    printf("\nPress any key to end...");

    getchar();

    return 0;

}

 

 

(½ÇÇà °á°ú)

$ cc -o ch0411 ch0411_mac02.c   ©¬ ÄÄÆÄÀÏ ¹× ¸µÅ©

$ ./ch0411   ©¬ ½ÇÇà

linux.h

Press any key to end...

 

¸ÎÀ½¸»

À̹ø ¿¬Àç¿¡¼­´Â C¾ð¾î ÇÔ¼öÀÇ ±âÃÊ, Á¤¼öÇüÀÌ ¾Æ´Ñ°ÍÀ» ¹ÝȯÇÏ´Â ÇÔ¼öµé, ¿ÜºÎ º¯¼öµé, ¿µ¿ª(scope) ±ÔÄ¢µé, Çì´õ ÆÄÀϵé,  °íÁ¤(Static) º¯¼öµé, ·¹Áö½ºÅÍ º¯¼öµé, ºí·Ï ±¸Á¶, ÃʱâÈ­, Àç±Í(Recursion), C¾ð¾î Àü󸮱â(Preprocessor) µî¿¡ ´ëÇØ¼­ ±â¼úÇß´Ù.  ÀÌ·¯ÇÑ ³»¿ëµéÀº C¾ð¾î ÇÁ·Î±×·¡¹ÖÀ» ±¸Á¶ÀûÀ¸·Î Çϴµ¥ µµ¿òÀÌ µÇ¹Ç·Î ¸¹ÀÌ ¿¬½ÀÇØ µÎµµ·Ï ÇÏÀÚ.

 

À̵¿: Home à book04

 

ÁÖ¼Ò: http://www.kernel.bz/book/book04/CM0104.htm

 

Á¦¸ñ: C¾ð¾î¿Í ¾Ë°í¸®Áò ¸ñÂ÷

ÀÌÆäÀÌÁö ÀúÀÛ±ÇÀº ÀúÀÚ¿¡°Ô ÀÖÀ½.

ÀúÀÚ: Á¤ÀçÁØ(rgbi3307(at)nate.com)

ÃÖ±Ù¼öÁ¤ÀÏ:2011-02-20