¢Ê 6ÀÏ: ¼±¾ð - ¿­°Å


¢¹ A8. ¼±¾ð (Declaration)
  ¼±¾ðÀº °¢ ¸íĪ¿¡ ÁÖ¾îÁö´Â ¿©·¯°¡Áö »çÇ×µéÀ» ¾Ë·ÁÁÖ´Â °ÍÀÏ »Ó, ÇʼöÀûÀ¸·Î ±â¾ïÀå¼Ò¸¦ ÇÒ´çÇÏÁö´Â ¾Ê½À´Ï´Ù. ±â¾ïÀå¼Ò¸¦ ÇÒ´çÇÏ´Â ¼±¾ðÀº Á¤ÀÇ (definition) ¶ó°í ºÎ¸¨´Ï´Ù. ¼±¾ðÀº ¾Æ·¡¿Í °°Àº ÇüŸ¦ °®½À´Ï´Ù.

declaration:
        declaration-specifiers   init-declarator-list opt ;

Ãʱâ-¼±¾ðÀÚ-¸®½ºÆ® (init-declarator-list) ¿¡ ÀÖ´Â ¼±¾ðÀÚ (declarator) ¿¡´Â ¼±¾ðµÇ´Â ¸íĪ (identifier) ÀÌ Æ÷ÇԵ˴ϴÙ; ¼±¾ð-ÁöÁ¤ÀÚ (declaration-specifier) ´Â ÇüÁöÁ¤ÀÚ¿Í ±â¾ïºÎ·ù ÁöÁ¤ÀÚ (type and storage class sprcifier) ·Î ±¸¼ºµË´Ï´Ù.

declaration-specifiers:
        storage-class-specifier   declaraion-specifiers opt
        type-specifier   declaraion-specifiers opt
        type-qualifier   declaraion-specifiers opt

init-declarator-list:
        init-declarator
        init-declarator-list , init-declarator

init-declarator:
        declarator
        declarator = initializer

¼±¾ðÀº ÈÄ¿¡ (A8.5) º¸´Ù ÀÚ¼¼È÷ ¼³¸íÇÒ °ÍÀÔ´Ï´Ù; ¼±¾ð¿¡´Â ¼±¾ðµÉ ¸íεéÀÌ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù. ¼±¾ðÀº ÃÖ¼ÒÇÑ ÇѰ³ÀÇ ¼±¾ðÀÚ (declarator) ¸¦ Æ÷ÇÔÇϰųª, ¾Æ´Ï¸é ÇüÁöÁ¤ÀÚ (type specifier) °¡ ±¸Á¶Ã¼ ÅÃÀ̳ª °ø¿ëü ÅÃ, ¿­°ÅÇü ¸â¹ö¸¦ ¼±¾ðÇØ¾ß¸¸ ÇÕ´Ï´Ù; ºñ¾îÀÖ´Â (empty) ¼±¾ðÀº Çã¿ëµÇÁö ¾Ê½À´Ï´Ù.

  ¢¹ A8.1 ±â¾ïºÎ·ù ÁöÁ¤ÀÚ (Storage Class Specifier)
  ±â¾ïºÎ·ù ÁöÁ¤ÀÚ´Â ´ÙÀ½°ú °°½À´Ï´Ù:

storage-class-specifier:
        auto
        register
        static
        extern
        typedef

±â¾ïºÎ·ù ÁöÁ¤ÀÚÀÇ Àǹ̴ A4 Àý¿¡¼­ ¾Ë¾Æº¸¾Ò½À´Ï´Ù.
  auto ¿Í register ´Â ¼±¾ðµÈ ´ë»óü¸¦ ÀÚµ¿ ±â¾ïºÎ·ù (automatic storage class) ·Î ¸¸µé¾î ÁÖ¸ç, ÇÔ¼ö ¾È¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ¼±¾ðÀº 'Á¤ÀÇ'ó·³ ±â¾ïÀå¼Ò¸¦ ÇÒ´çÇØ ÁÝ´Ï´Ù. register ¼±¾ðÀº auto ¼±¾ð°ú µ¿ÀÏÇÏÁö¸¸, ÄÄÆÄÀÏ·¯¿¡°Ô ¼±¾ðµÈ ´ë»óü°¡ ºó¹øÈ÷ »ç¿ëµÊÀ» ¾Ë·ÁÁÝ´Ï´Ù. ½ÇÁ¦·Î CPU ·¹Áö½ºÅÍ¿¡ ÀúÀåµÉ ¼ö ÀÖ´Â ´ë»óüÀÇ °³¼ö¿Í µ¥ÀÌÅÍÇü¿¡´Â Á¦ÇÑÀÌ ÀÖÀ¸¸ç, ÀÚ¼¼ÇÑ Á¦ÇÑ»çÇ×Àº ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸¨´Ï´Ù (implementation-dependent). ÇÏÁö¸¸ ÀÏ´Ü ´ë»óü°¡ register ·Î ¼±¾ðµÈ´Ù¸é, ¸í½ÃÀûÀÌµç ¾Æ´Ïµç ´ÜÇ× & ¿¬»êÀÚ°¡ Àû¿ëµÉ ¼ö ¾ø½À´Ï´Ù.

  ½ÇÁ¦·Î´Â ´ë»óü°¡ ÀϹÝÀûÀÎ auto ·Î Ãë±ÞµÈ´Ù°í ÇØµµ, register ·Î ¼±¾ðµÇ¾ú´Ù¸é ±× ´ë»óüÀÇ ÁÖ¼Ò¸¦ ¾òÀ» ¼ö ¾ø´Ù´Â °ÍÀº »õ·Î¿î ±ÔÄ¢ÀÔ´Ï´Ù.

  static ÁöÁ¤ÀÚ´Â ¼±¾ðµÈ ´ë»óü¸¦ Á¤Àû ±â¾ïºÎ·ù (static storage class) ·Î ¸¸µé¾î ÁÖ¸ç, ÇÔ¼ö ¾ÈÆÆ¿¡¼­ ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÔ¼ö ¾È¿¡¼­, ÀÌ ÁöÁ¤ÀÚ´Â 'Á¤ÀÇ'ó·³ ±â¾ïÀå¼Ò¸¦ ÇÒ´çÇØ ÁÝ´Ï´Ù; ÇÔ¼ö ¹Û¿¡¼­ÀÇ ¿µÇâÀº A11.2 ¸¦ Âü°íÇϽñ⠹ٶø´Ï´Ù.
  ÇÔ¼ö ¾È¿¡¼­ »ç¿ëµÇ´Â extern ¼±¾ðÀº, ¼±¾ðµÈ ´ë»óü¸¦ À§ÇÑ ±â¾ïÀå¼Ò°¡ ´Ù¸¥ °÷¿¡¼­ Á¤ÀǵǾúÀ½À» ¾Ë·ÁÁÝ´Ï´Ù. ÇÔ¼ö ¹Û¿¡¼­ÀÇ ¿µÇâÀº A11.2 ¸¦ Âü°íÇϽñ⠹ٶø´Ï´Ù.
  »ç¿ëÀÚ Á¤ÀÇ typedef ÁöÁ¤ÀÚ´Â ±â¾ïÀå¼Ò¸¦ ¿¹¾àÇÏÁö ¾ÊÀ¸¸ç, ¹®¹ýÀû ÆíÀǸ¦ À§ÇØ ±â¾ïºÎ·ù ÁöÁ¤ÀÚ·Î ºÐ·ùÇÕ´Ï´Ù.
  ¼±¾ð¿¡´Â ÃÖ´ë ÇѰ³ÀÇ ±â¾ïºÎ·ù ÁöÁ¤ÀÚ°¡ ÁÖ¾îÁ®¾ß ÇÕ´Ï´Ù. ¸¸¾à ÁÖ¾îÁöÁö ¾Ê´Â´Ù¸é ´ÙÀ½°ú °°Àº ±ÔÄ¢ÀÌ Àû¿ëµË´Ï´Ù: ÇÔ¼ö ¾È¿¡¼­ ¼±¾ðµÈ ´ë»óü´Â auto ·Î Ãë±ÞµË´Ï´Ù; ÇÔ¼ö ¾È¿¡¼­ ¼±¾ðµÈ ÇÔ¼ö´Â extern À¸·Î Ãë±ÞµË´Ï´Ù; ÇÔ¼ö ¹Û¿¡¼­ ¼±¾ðµÈ ´ë»óü¿Í ÇÔ¼ö´Â ¿ÜºÎ¿¬°á (external linkage) °ú Á¤Àû ±â¾ïºÎ·ù¸¦ °®½À´Ï´Ù. (A10 - A11 Âü°í)

¢¹ A8.2 ÇüÁöÁ¤ÀÚ (Type Qualifier)
  ÇüÁöÁ¤ÀÚ´Â ´ÙÀ½°ú °°½À´Ï´Ù.

type-specifier:
        void
        char
        short
        int
        long
        float
        double
        signed
        unsigned
        struct-or-union-specifier
        enum-specifier
        typedef-name

long °ú short Áß Çϳª¸¸ÀÌ int ¿Í ÇÔ²² »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. long, short °¡ ÀÖÀ¸¸é int ¸¦ ½áÁÖÁö ¾Ê¾Æµµ Àǹ̴ int ÇüÀÔ´Ï´Ù. long Àº double °ú ÇÔ²² ¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù. signed ¿Í unsigned Áß Çϳª°¡ int, short int, long int, char ¿Í ÇÔ²² ¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù. signed ³ª unsigned °¡ È¥ÀÚ ³ªÅ¸³ª¸é int ÇüÀ¸·Î Àνĵ˴ϴÙ. signed ÁöÁ¤ÀÚ´Â char Çü ´ë»óü°¡ ºÎÈ£ÀÖ´Â °ªÀ» °®µµ·Ï Çϴµ¥ À¯¿ëÇÕ´Ï´Ù; Á¤¼öÇü¿¡µµ signed ¸¦ ºÙÀÏ ¼ö´Â ÀÖÁö¸¸ Áߺ¹µÈ ¼±¾ðÀÔ´Ï´Ù.
  À§ÀÇ °æ¿ì°¡ ¾Æ´Ï¶ó¸é, ÃÖ´ë 1°³ÀÇ ÇüÁöÁ¤ÀÚ¸¸ÀÌ ¼±¾ð¿¡ ³ª¿Ã ¼ö ÀÖ½À´Ï´Ù. ¼±¾ð¿¡ ÇüÁöÁ¤ÀÚ°¡ »ý·«µÇ¸é, int ÇüÀ¸·Î Ãë±ÞµË´Ï´Ù.
  µ¥ÀÌÅÍÇüÀº ¼±¾ðµÈ ´ë»óü¿¡ Ưº°ÇÑ Æ¯¼ºÀ» ³ªÅ¸³»±â À§ÇØ ÇÑÁ¤µÇ±âµµ (qualified) ÇÕ´Ï´Ù.

type-qualifier:
        const
        volatile

ÇüÇÑÁ¤¾î´Â ÇüÁöÁ¤ÀÚ¿Í ÇÔ²² ³ªÅ¸³¯ ¼ö ÀÖ½À´Ï´Ù. const ´ë»óü´Â ÃʱâÈ­´Â µÇÁö¸¸ °ªÀÌ ´ëÀ﵃ ¼ö´Â ¾ø½À´Ï´Ù. volatile ·Î ÇÑÁ¤µÈ ´ë»óü¿¡ ´ëÇÑ »çÇ×Àº ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸£°Ô Á¤ÀÇÇÕ´Ï´Ù (implementation-dependent).

  const ¿Í volatile ÀÇ Æ¯¼ºÀº ANSI ¿¡¼­ »õ·ÎÀÌ Á¤ÇÑ °ÍÀÔ´Ï´Ù. const ÀÇ ¸ñÀûÀº ´ë»óü°¡ ROM ¿¡ À§Ä¡ÇÒ ¼öµµ ÀÖÀ½À» ¾Ë·Á, ÃÖÀûÈ­ÀÇ ±âȸ¸¦ Áõ°¡½ÃŰ´Â °ÍÀÔ´Ï´Ù. volatile ÀÇ ¸ñÀûÀº ÄÄÆÄÀÏ·¯¿¡°Ô ÃÖÀûÈ­¸¦ ¾ïÁ¦Çϵµ·Ï ¾Ë¸®´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î, ¸Þ¸ð¸® ¸ÊÇÎ ÀÔÃâ·Â (memory-mapping input/output) À» ÇÏ´Â ±âÁ¾¿¡¼­, ÀåÄ¡ ·¹Áö½ºÅÍ (device register) ¸¦ °¡¸£Å°´Â Æ÷ÀÎÅ͸¦ ÅëÇØ ºÐ¸íÈ÷ Áߺ¹µÈ ÂüÁ¶¸¦ ÇÒ¶§, ÄÄÆÄÀÏ·¯°¡ À̸¦ ¾ø¾Ö´Â °ÍÀ» ¸·±â À§Çؼ­ ±× Æ÷ÀÎÅ͸¦ volatile ·Î ¼±¾ðÇÒ ¼ö ÀÖ½À´Ï´Ù. const ´ë»óüÀÇ °ªÀ» º¯°æÇÏ·Á´Â ¸í¹éÇÑ ½Ãµµ¸¦ °Ë»çÇÏ´Â °ÍÀ» Á¦¿ÜÇϸé, ÄÄÆÄÀÏ·¯´Â ÀÌ·¯ÇÑ ÇÑÁ¤¾î¸¦ ¹«½ÃÇÒ ¼ö ÀÖ½À´Ï´Ù.

¢¹ A8.3 ±¸Á¶Ã¼¿Í °ø¿ëü ¼±¾ð (Structure and Union Declarations)
  ±¸Á¶Ã¼´Â ´Ù¾çÇÑ µ¥ÀÌÅÍÇüÀÇ ¿©·¯ ¸â¹ö¸¦ Æ÷ÇÔÇÏ´Â ´ë»óüÀÔ´Ï´Ù. °ø¿ëü´Â ´Ù¸¥ ½Ã°£¿¡ (µ¿½Ã¿¡´Â ºÒ°¡´ÉÇÏ´Ù´Â ¶æ) ´Ù¾çÇÑ µ¥ÀÌÅÍÇüÀÇ ¿©·¯ ¸â¹öÁß Çϳª¸¦ ´ãÀ» ¼ö ÀÖ´Â ´ë»óüÀÔ´Ï´Ù. ±¸Á¶Ã¼ ÁöÁ¤ÀÚ¿Í °ø¿ëü ÁöÁ¤ÀÚ´Â °°Àº ÇüŸ¦ °®½À´Ï´Ù.

struct-or-union-specifiers:
        struct-or-union   identifier opt   { struct-declaration-list }
        struct-or-union   identifier

struct-or-union:
        struct
        union

±¸Á¶Ã¼-¼±¾ð-¸®½ºÆ® (struct-declaration-list) ´Â ±¸Á¶Ã¼³ª °ø¿ëü ¸â¹öµéÀÌ ³ª¿­µÈ °ÍÀÔ´Ï´Ù:

struct-declaration-list:
        struct-declaration
        struct-declaration-list   struct-declaration

struct-declaration:
        specifier-qualifier-list   struct-declarator-list ;

specifier-qualifier-list:
        type-specifier   specifier-qualifier-list opt
        type-qualifier   specifier-qualifier-list opt

struct-declarator-list:
        struct-declarator
        struct-declarator-list , struct-declarator

º¸Åë, ±¸Á¶Ã¼-¼±¾ðÀÚ (struct-declarator) ´Â ±¸Á¶Ã¼³ª °ø¿ëüÀÇ ¸â¹öµéÀ» À§ÇÑ ¼±¾ðÀÚÀÔ´Ï´Ù. ±¸Á¶Ã¼ ¸â¹ö´Â ¶ÇÇÑ ºñÆ®¼ö¸¦ ÁöÁ¤ÇÑ °ªÀ» Æ÷ÇÔÇϱ⵵ ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ¸â¹ö´Â ºñÆ®Çʵå (bit-field), ȤÀº µå¹É°Ô ±×³É Çʵå (field) ¶ó°í ºÎ¸¨´Ï´Ù; ºñÆ®ÇʵåÀÇ ±æÀÌ´Â ¼±¾ðÀڷκÎÅÍ ÄÝ·Ð(:)À¸·Î ºÐ¸®µÇ¾î ÁöÁ¤µË´Ï´Ù.

struct-declarator:
        declarator
        declarator opt : constant-expression

  ¾Æ·¡¿Í °°Àº ÇüÅÂÀÇ ÇüÁöÁ¤ÀÚ´Â ¸íĪÀ», ¸®½ºÆ®¿¡ ÀÇÇØ ¼­¼úµÈ ±¸Á¶Ã¼³ª °ø¿ëüÀÇ Åà (tag) À¸·Î ¼±¾ðÇÕ´Ï´Ù.

struct-or-union identifier { struct-declaration-list }

  À§¿Í °°ÀÌ ¼±¾ðÀÌ µÇ¸é, °°°Å³ª ´õ ¾ÈÂÊÀÇ Åë¿ë¹üÀ§ (scope) ¿¡¼­ ¸®½ºÆ® ¾øÀÌ Åø¸À» »ç¿ëÇØ¼­ °°Àº µ¥ÀÌÅÍÇüÀ» ÂüÁ¶ÇÒ ¼ö ÀÖ½À´Ï´Ù:

struct-or-union identifier

¸¸¾à, ¸®½ºÆ® ¾øÀÌ Åø¸ ÁöÁ¤µÇ°í ¶Ç ÀÌ ÅÃÀÌ Àü¿¡ ¼±¾ðµÈ ÀûÀÌ ¾ø´Ù¸é, ºÒ¿ÏÀüÇÑ Çü (incomplete type) ÀÌ µË´Ï´Ù. ºÒ¿ÏÀüÇÑ ±¸Á¶Ã¼³ª °ø¿ëüÇüÀÇ ´ë»óü´Â ¼±¾ðÀ̳ª (Á¤ÀÇ´Â ¾ÈµÊ), Æ÷ÀÎÅÍ ÁöÁ¤, typedef »ý¼º°ú °°ÀÌ ±¸Ã¼ÀûÀÎ Å©±â¸¦ ÇÊ¿ä·Î ÇÏÁö ¾Ê´Â °÷¿¡¼­¸¸ ¾²ÀÏ ¼ö ÀÖ½À´Ï´Ù. ºÒ¿ÏÀüÇÑ ÇüÀº ¼±¾ð ¸®½ºÆ®¸¦ °®´Â µ¿ÀÏÇÑ ÅÃÀÇ ¼±¾ðÀÌ ³ªÅ¸³ª¸é ¿ÏÀüÇÑ ÇüÀÌ µÉ ¼ö ÀÖ½À´Ï´Ù. ºñ·Ï ¸®½ºÆ®¸¦ °®°í ÀÖ´Â ÁöÁ¤ÀÚ¶ó°í ÇØµµ, ±¸Á¶Ã¼³ª °ø¿ëü´Â ¸®½ºÆ® ¾È¿¡¼­´Â ºÒ¿ÏÀüÇÑ ÇüÀ̸ç, ÁöÁ¤ÀÚ¸¦ Á¾·á½ÃÄÑÁÖ´Â } °¡ ³ª¿Í¾ß¸¸ ¿ÏÀüÇÑ ÇüÀÌ µË´Ï´Ù.
  ±¸Á¶Ã¼´Â ºÒ¿ÏÀüÇÑ ÇüÀÇ ¸â¹ö¸¦ Æ÷ÇÔÇÒ ¼ö ¾ø½À´Ï´Ù. µû¶ó¼­ ÀÚ±â ÀÚ½ÅÀ» Æ÷ÇÔÇÏ´Â, ±¸Á¶Ã¼³ª °ø¿ëü¸¦ ¼±¾ðÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÕ´Ï´Ù. ÇÏÁö¸¸ ºÒ¿ÏÀüÇÑ ÇüÀ» °¡¸£Å°´Â Æ÷ÀÎÅÍ´Â ¼±¾ðÇÒ ¼ö ÀÖ°í, ¶Ç ±¸Á¶Ã¼³ª °ø¿ëü´Â ÀÚ±â ÀÚ½ÅÀ» ÂüÁ¶ÇÏ´Â Æ÷ÀÎÅ͸¦ Æ÷ÇÔÇÒ ¼ö Àֱ⠶§¹®¿¡, °á±¹ ÀÚ±âÂüÁ¶ ±¸Á¶Ã¼ (self-referential structure) ¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ °¡´ÉÇÕ´Ï´Ù.
  ¼±¾ð ¸®½ºÆ® (declaration list) ¿Í ¼±¾ðÀÚ (declarator) ¾øÀÌ ±¸Á¶Ã¼¿Í °ø¿ëü¸¦ ¼±¾ðÇÏ´Â ¾Æ·¡¿Í °°Àº ¼±¾ð¿¡´Â ¸Å¿ì Ưº°ÇÑ ±ÔÄ¢ÀÌ Àû¿ëµË´Ï´Ù.

struct-or-union identifier;

¸íĪÀÌ ÀÌ¹Ì ¹Ù±ùÂÊ Åë¿ë¹üÀ§ (outer scope) ¿¡¼­ ¼±¾ðµÈ ±¸Á¶Ã¼³ª °ø¿ëüÀÇ ÅÃÀ̶ó°í ÇØµµ, À§¿Í °°Àº ¼±¾ðÀº ÇöÀçÀÇ Åë¿ë¹üÀ§ ³»¿¡¼­ ±× ¸íĪÀ» ºÒ¿ÏÀüÇÑ ÇüÀ» °®´Â ±¸Á¶Ã¼³ª °ø¿ëüÀÇ ÅÃÀ¸·Î ¸¸µé¾î ÁÝ´Ï´Ù.

  ÀÌ·¯ÇÑ ³­ÇØÇÑ ±ÔÄ¢Àº »õ·Î¿î °ÍÀÔ´Ï´Ù. ÀÌ ±ÔÄ¢ÀÇ ¸ñÀûÀº ¹Ù±ù Åë¿ë¹üÀ§¿¡¼­ ÀÌ¹Ì ¼±¾ðµÈ ÅÃÀ» °®´Â, ¾ÈÂÊ ¹üÀ§¿¡¼­ ¼±¾ðµÈ »óÈ£-Àç±ÍÀûÀÎ (mutually-recursive) ±¸Á¶Ã¼¸¦ ´Ù·ç±â À§ÇÑ °ÍÀÔ´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  »óÈ£ Àç±ÍÀûÀÎ ±¸Á¶Ã¼¶õ ´ÙÀ½°ú °°Àº °ÍÀ» ¸»ÇÕ´Ï´Ù.

struct x { int a; struct y *yp };
struct y { int b; struct x *xp };

ÀÌÁ¦ À§¿¡¼­ À̾߱âÇÑ À̸¥¹Ù '³­ÇØÇÑ ±ÔÄ¢'ÀÌ ÇÊ¿äÇÑ °æ¿ì¸¦ ¿¹·Î µé¾îº¸°Ú½À´Ï´Ù.

struct alpha { char c; };
struct beta { float f; };

int main()
{
    struct alpha { int x; struct beta *b; } aa;
    struct beta { int y; sttuct alpha *a; } bb;
    aa.b = &bb;
    bb.a = &aa;
    return 0;
}

À§ÀÇ ¿¹¿¡¼­ ´ëÀÔ¹® aa.b = &bb ´Â Çã°¡µÇÁö ¾Ê½À´Ï´Ù. ±× ÀÌÀ¯´Â ±¸Á¶Ã¼ aa ¾È¿¡ ÀÖ´Â 'struct beta' °¡ main() ¹Û¿¡ ÀÖ´Â beta ¸¦ ÂüÁ¶Çϱ⠶§¹®ÀÔ´Ï´Ù. (¿ø·¡ Àǵµ´Â main() ¾ÈÀÇ alpha ¹Ø¿¡ ÀÖ´Â beta ¸¦ ÂüÁ¶ÇÏ´Â °ÍÀÓ) ÀÌ¿Í °°Àº °æ¿ì main() ¾È¿¡ ÀÖ´Â alpha ¿Í beta ÀÇ ¼±¾ð ¼ø¼­¸¦ ¹Ù²ãµµ ¹®Á¦´Â ÇØ°áµÇÁö ¾Ê½À´Ï´Ù. ÀÌ·² ¶§, main() ÇÔ¼öÀÇ º»Ã¼ ¾È¿¡¼­ alpha, beta ¸¦ ¼±¾ðÇϱâ Àü¿¡ ´ÙÀ½°ú °°Àº ¼±¾ðÀ» ³Ö¾îÁÖ¸é, À§¿¡¼­ À̾߱âÇÑ '³­ÇØÇÑ ±ÔÄ¢' ¿¡ ÀÇÇØ ºí·°¹Û°ú´Â ´Ù¸¥ »õ·Î¿î ±¸Á¶Ã¼ alpha, beta °¡ ¼±¾ðµË´Ï´Ù.

struct alpha;          
struct beta;            

¹°·Ð À§ÀÇ ¿¹´Â ºí·°¹ÛÀÇ alpha, beta °¡ ¸íÈ®È÷ ´«¿¡ º¸À̱⠶§¹®¿¡ ¾î´À ÇÑÂÊÀ» °íÄ¡¸é »ó°ü¾øÁö¸¸, ºí·°¹ÛÀÇ ±¸Á¶Ã¼ ¼±¾ðÀÌ ´Ù¸¥ »ç¶÷ÀÌ ÀÛ¼ºÇÑ Çì´õÆÄÀÏ¿¡ ÆÄ¹¯Çô ÀÖ´Â °æ¿ì¶ó¸é ¹®Á¦°¡ µÉ ¼öµµ ÀÖ½À´Ï´Ù.

  ÅþøÀÌ ¸®½ºÆ®¸¸ ÀÖ´Â ±¸Á¶Ã¼ ¡¤ °ø¿ëü ÁöÁ¤ÀÚ´Â ÇϳªÀÇ Á¦´ë·ÎµÈ µ¥ÀÌÅÍÇüÀ» ¸¸µéÁö ¸øÇÕ´Ï´Ù; µû¶ó¼­ ÀÌ·¯ÇÑ ±¸Á¶Ã¼³ª °ø¿ëü´Â ¿ÀÁ÷ ¼±¾ðµÇ´Â ºÎºÐ¿¡¼­¸¸ Á÷Á¢ÀûÀ¸·Î ÂüÁ¶µÉ ¼ö ÀÖ½À´Ï´Ù.
  ¸â¹ö¸í°ú ÅøíÀº ¼­·Î°£¿¡ ȤÀº ÀÏ¹Ý º¯¼ö¿Í Ãæµ¹ÇÏÁö ¾Ê½À´Ï´Ù. µ¿ÀÏÇÑ ±¸Á¶Ã¼³ª °ø¿ëü¿¡ °°Àº ¸â¹ö¸íÀÌ µÎ¹ø ³ª¿Ã ¼ö´Â ¾øÁö¸¸, ´Ù¸¥ ±¸Á¶Ã¼¿¡´Â µ¿ÀÏÇÑ ¸â¹ö¸íÀÌ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.

  ÀÌ Ã¥ÀÇ ÃÊÆÇ¿¡¼­´Â, ±¸Á¶Ã¼³ª °ø¿ëüÀÇ ¸â¹ö¸íÀÌ ±×°ÍÀÇ Åðú´Â ¾Æ¹«·± °ü°è°¡ ¾ø¾ú½À´Ï´Ù. ÇÏÁö¸¸, ÀÌ·¯ÇÑ Åðú ¸â¹ö¸íÀÇ °ü°è´Â ANSI Ç¥ÁØ¾È ÀÌÀüºÎÅÍ ¿©·¯ ÄÄÆÄÀÏ·¯¿¡°Ô´Â º¸ÆíÀûÀÎ °ÍÀ̾ú½À´Ï´Ù.

  ±¸Á¶Ã¼³ª °ø¿ëüÀÇ ºñÆ®Çʵ尡 ¾Æ´Ñ ¸â¹ö´Â ¾î¶°ÇÑ µ¥ÀÌÅÍÇüÀ» °¡Á®µµ ÁÁ½À´Ï´Ù. (¼±¾ðÀÚ°¡ ÇÊ¿ä¾ø°í, µû¶ó¼­ À̸§ÀÌ ºÙÁö ¾Ê¾Æµµ µÇ´Â) ºñÆ®ÇÊµå ¸â¹ö´Â int, unsigned int ȤÀº signed int ÇüÀ» °®À¸¸ç, ÁÖ¾îÁø ºñÆ®¸¸Å­ÀÇ ±æÀ̸¦ °®´Â Á¤¼ö ´ë»óü (integral) ·Î ÇØ¼®µË´Ï´Ù; int Çü ºñÆ®Çʵ尡 ºÎÈ£ÀÖ´Â µ¥ÀÌÅÍÇüÀ¸·Î ´Ù·ç¾îÁö´ÂÁö´Â ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸¨´Ï´Ù (implementation-dependent). ±¸Á¶Ã¼ÀÇ ÀÎÁ¢ÇØ ÀÖ´Â ºñÆ®ÇÊµå ¸â¹öµéÀº ÄÄÆÄÀÏ·¯°¡ Á¤ÇÑ ¹æÇâÀ¸·Î, ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸¥ ±â¾ï´ÜÀ§ (storage unit) ·Î ¹­ÀÔ´Ï´Ù. ºñÆ®Çʵ尡 ºÎºÐÀûÀ¸·Î ä¿öÁø ±â¾ï´ÜÀ§¿¡ ¸ÂÁö ¾ÊÀ» °æ¿ì, µÎ ±â¾ï´ÜÀ§¿¡ °ÉÃÄ ºÐ¸®µÇ¾î ÀúÀåµÉ ¼öµµ ÀÖ°í, ºÎºÐÀûÀ¸·Î ä¿öÁø ±â¾ï´ÜÀ§¸¦ ¹«ÀǹÌÇÑ °ªÀ¸·Î ä¿ö¼­ (padding) ¹ö¸± ¼öµµ ÀÖ½À´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  padding À̶õ, ¾µ¸ð¾ø´Â ±â¾ïÀå¼Ò¿¡ ¹«ÀǹÌÇÑ °ªÀ» ä¿ö¼­ ÇÊ¿ä¾ø´Â ºÎºÐÀ» ¹ö¸®´Â ÀÛ¾÷À» ÀǹÌÇÕ´Ï´Ù.

±æÀÌ 0 À» °®´Â À̸§¾ø´Â ºñÆ®Çʵå´Â ÀÌ·¸°Ô ÇÊ¿ä¾ø´Â ºÎºÐÀ» ä¿ìµµ·Ï ÇØ¼­, ´ÙÀ½¹ø ºñÆ®Çʵ尡 »õ·Î¿î ±â¾ï´ÜÀ§ºÎÅÍ ½ÃÀÛÇϵµ·Ï ÇØÁÝ´Ï´Ù.

  ANSI ´Â ºñÆ®Çʵå¿Í °ü·ÃµÈ ³»¿ëÀ» ÀÌÀüº¸´Ù ´õ¿í ÄÄÆÄÀÏ·¯¿¡ ¸Ã°ÜµÎ¾ú½À´Ï´Ù (implementation-dependent). ÀÌ´Â °ð ºñÆ®Çʵå ÀúÀå°ú °ü·ÃµÈ ¾ð¾îÀÇ ±ÔÄ¢Àº ¹«Á¶°Ç ÄÄÆÄÀÏ·¯¿¡ ´Þ·ÁÀÖ´Ù´Â ¶æÀÔ´Ï´Ù. ºñÆ®Çʵ尡 ÀÖ´Â ±¸Á¶Ã¼´Â (Çʵ带 ´Ù·ç±â À§ÇÑ ³»ºÎ ¸í·É¾î°¡ ´õ º¹ÀâÇØÁö°í, Çʵ忡 Á¢±ÙÇÏ´Â ½Ã°£ÀÌ ±æ¾îÁø´Ù°í ÇØµµ) ºñÆ®Çʵ带 À§ÇÑ ±â¾ïÀå¼Ò¸¦ ÁÙÀÌ´Â À̽ļºÀÖ´Â ¹æ¹ý (portable way) À¸·Î ´Ù·ç±âµµ Çϰí, ºñÆ® ¼öÁØ¿¡¼­ ¾Ë¾Æº¸±â ½¬¿î À̽ļº¾ø´Â ¹æ¹ý (non-portable way) À¸·Î ´Ù·ç±âµµ ÇÕ´Ï´Ù. µÎ¹øÂ° °æ¿ì¶ó°í ÇØµµ, °¢ ÄÄÆÄÀÏ·¯ÀÇ ±ÔÄ¢À» µû·Î ¾Ë¾Æ¾ß ÇÕ´Ï´Ù.

  ±¸Á¶Ã¼ÀÇ ¸â¹ö´Â ¼±¾ðµÈ ¼ø¼­´ë·Î ¸Þ¸ð¸®»óÀÇ ÁÖ¼Ò°¡ Áõ°¡µÇ¾î ÀúÀåµË´Ï´Ù. ºñÆ®Çʵ尡 ¾Æ´Ñ ±¸Á¶Ã¼ ¸â¹ö´Â ±× ¸â¹öÀÇ µ¥ÀÌÅÍÇü¿¡ µû¸¥ ÁÖ¼Ò¸¦ °æ°è·Î Á¤·ÄµË´Ï´Ù; µû¶ó¼­ ±¸Á¶Ã¼ ³»¿¡´Â ¸íĪÀÌ ºÙÁö¾ÊÀº ºó°ø°£ (hole) ÀÌ »ý±æ ¼ö ÀÖ½À´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  A6.6 Àý¿¡¼­ ¼³¸íÇßµíÀÌ, ¸¹Àº ¼öÀÇ ±âÁ¾ (machine) µéÀº ±â¾ïÀå¼Ò°¡ Àû´çÈ÷ Á¤·ÄÀÌ µÇ¾î¾ß ±â¾ïÀå¼Ò¿¡ È¿À²ÀûÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖÀ¸¸ç, ½ÉÁö¾î´Â Á¤·ÄÀÌ µÇÁö ¾ÊÀº ±â¾ïÀå¼Ò¿¡´Â Á¢±ÙÀ» ¸øÇÏ´Â °æ¿ìµµ ÀÖ½À´Ï´Ù. ¹ÙÀÌÆ® ±â¹ÝÀÇ ±âÁ¾¿¡¼­, 2 ¹ÙÀÌÆ®ÀÇ short int ´Â ¦¼ö¹øÁö¿¡, 4 ¹ÙÀÌÆ®ÀÇ long int ´Â 4ÀÇ ¹è¼ö¹øÁö¿¡ Á¤·ÄµÇ´Â °æ¿ì°¡ ÀÖ½À´Ï´Ù. ±×·² ¶§, ´ÙÀ½°ú °°Àº ±¸Á¶Ã¼°¡ ÀÖ´Ù°í °¡Á¤Çϸé,

struct {
      char c;
      int i;
};

ÄÄÆÄÀÏ·¯´Â int ¸â¹ö°¡ Àû´çÈ÷ Á¤·ÄµÇµµ·Ï, char ¿Í int ¸â¹ö »çÀÌ¿¡ À̸§µµ ¾ø°í, »ç¿ëµÇÁö ¾Ê´Â °ø°£ (hole) À» ³²°ÜµÓ´Ï´Ù.

±¸Á¶Ã¼¸¦ °¡¸£Å°´ø Æ÷ÀÎÅͰ¡ ù¹øÂ° ¸â¹ö¸¦ °¡¸£Å°´Â Æ÷ÀÎÅÍÇüÀ¸·Î ij½ºÆ® µÈ´Ù¸é, °á°ú´Â ù¹øÂ° ¸â¹ö¸¦ ÂüÁ¶ÇÕ´Ï´Ù.
  °ø¿ëü´Â ¸â¹ö°¡ ¸ðµÎ »ó´ë¹øÁö (offset) 0 ¿¡¼­ ½ÃÀÛÇϰí, ¸â¹öÁß ¾î¶°ÇÑ °Íµµ ÀúÀåÇÒ ¼ö ÀÖ´Â ÃæºÐÇÑ Å©±â¸¦ °®´Â ±¸Á¶Ã¼¶ó°í »ý°¢ÇÏ¸é µË´Ï´Ù. °ø¿ëü¿¡´Â ¸â¹öÁß Çϳª¸¸À» ÀúÀåÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à °ø¿ëü¸¦ °¡¸£Å°´ø Æ÷ÀÎÅͰ¡ ¾î¶°ÇÑ ¸â¹ö¸¦ °¡¸£Å°´Â Æ÷ÀÎÅÍÇüÀ¸·Î ij½ºÆ® µÈ´Ù¸é, °á°ú´Â ±× ¸â¹ö¸¦ ÂüÁ¶ÇÕ´Ï´Ù.
  ±¸Á¶Ã¼ ¼±¾ðÀÇ °£´ÜÇÑ ¿¹´Â ´ÙÀ½°ú °°½À´Ï´Ù.

struct tnode {
        char tword[20];
        int count;
        struct tnode *left;
        struct tnode *right;
};

ÀÌ ±¸Á¶Ã¼´Â ¹®ÀÚ 20°³¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â ¹è¿­, Á¤¼öÇü (integer), ÀÚ±â ÀÚ½ÅÀ» ÂüÁ¶ÇÏ´Â Æ÷ÀÎÅÍ 2°³¸¦ ´ã°í ÀÖ½À´Ï´Ù. ¿ì¼± À§¿Í°°Àº ¼±¾ðÀÌ ÁÖ¾îÁö¸é, ´ÙÀ½°ú °°Àº ¼±¾ðÀº, s ¸¦ ÁÖ¾îÁø Á¾·ùÀÇ ±¸Á¶Ã¼·Î, sp ¸¦ ÁÖ¾îÁø Á¾·ùÀÇ ±¸Á¶Ã¼ Æ÷ÀÎÅÍ·Î ¼±¾ðÇØ ÁÝ´Ï´Ù.

struct tnode s, *sp;

À§¿Í °°Àº ¼±¾ðÀÌ ÁÖ¾îÁö¸é, ¼ö½Ä

sp -> count

´Â sp °¡ °¡¸£Å°´Â ±¸Á¶Ã¼ÀÇ count ¸â¹ö¸¦ ÂüÁ¶ÇÕ´Ï´Ù;

sp.left

À§ÀÇ ¼ö½ÄÀº ±¸Á¶Ã¼ s ÀÇ ÁÂÃø ºÎºÐÆ®¸® (subtree) ¸¦ ÂüÁ¶ÇÕ´Ï´Ù;

s.right -> tword[0]

±×¸®°í À§ ¼ö½ÄÀº s ÀÇ ¿ìÃø ºÎºÐÆ®¸®ÀÇ tword ÀÇ Ã¹¹øÂ° ¹®ÀÚ¸¦ °¡¸£Åµ´Ï´Ù.
  ÀϹÝÀûÀ¸·Î, °ªÀÌ ´ëÀÔµÇÁö ¾ÊÀº °ø¿ëüÀÇ ¸â¹ö´Â Á¶»çÇÒ ¼ö°¡ ¾ø½À´Ï´Ù. ÇÏÁö¸¸ ÇѰ¡Áö »ç½ÇÀÌ È®½ÇÈ÷ º¸ÀåµÇ¾î À־, °ø¿ëüÀÇ »ç¿ëÀ» ÆíÇÏ°Ô ÇØÁÝ´Ï´Ù: ¸¸¾à °ø¿ëü°¡ °°Àº Ãʱâ¸â¹ö (initial sequence) ¸¦ °øÀ¯ÇÏ´Â ¿©·¯°³ÀÇ ±¸Á¶Ã¼¸¦ Æ÷ÇÔÇϰí ÀÖ°í, ÇöÀç »ç¿ëÁßÀÎ °ø¿ëü°¡ ÀÌ ±¸Á¶Ã¼Áß Çϳª¸¦ Æ÷ÇÔÇÑ´Ù¸é, Æ÷ÇÔµÈ ±¸Á¶Ã¼Áß ¾î¶°ÇÑ (°øÅëµÈ) Ãʱâ¸â¹ö¶óµµ ÂüÁ¶ÇÏ´Â °ÍÀÌ Çã°¡µÇ¾î ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î, ¾Æ·¡¿Í °°Àº °æ¿ì´Â Àû¹ýÇÑ °ÍÀÔ´Ï´Ù:

union {
         struct {
                   int type;
         } n;
         struct {
                   int type;
                   int intnode;
         } ni;
         struct {
                   int type;
                   float floatnode;
         } nf;
} u;
...
u.nf.type = FLOAT;
u.nf.floatnode = 3.14;
...
if (u.n.type == FLOAT)
      ... sin(u.nf.floatnode) ...

¢¹ A8.4 ¿­°Å (Enumeration)
  ¿­°Å´Â ¿­°ÅÀÚ (enumerator) ¶ó°í ºÒ¸®´Â, À̸§ÀÌ ºÙ¾îÀÖ´Â »ó¼öÀÇ ÁýÇÕ³»¿¡¼­ °ªÀÌ º¯ÇÏ´Â µ¶Æ¯ÇÑ µ¥ÀÌÅÍÇü ÀÔ´Ï´Ù. ¿­°Å ÁöÁ¤ÀÚ (enumeration specifier) ÀÇ ÇüÅ´ ±¸Á¶Ã¼ ¡¤ °ø¿ëü ÁöÁ¤ÀÚÀÇ ÇüÅÂ¿Í ºñ½ÁÇÕ´Ï´Ù.

enum-specifiers:
        enum   identifier opt   { enumerator-list }
        enum   identifier

enumerator-list:
        enumerator
        enumerator-list , enumerator

enumerator:
        identifier
        identifier = constant-expression

¿­°ÅÀÚ ¸®½ºÆ® (enumerator list) ÀÇ ¸íĪÀº int ÇüÀÇ »ó¼ö·Î ¼±¾ðµÇ°í, »ó¼ö°¡ ¿ä±¸µÇ´Â °÷¿¡ »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¸¸¾à ¿­°ÅÀÚ¿¡ = °¡ ¾øÀ¸¸é, ´ëÀÀÇÏ´Â »ó¼öÀÇ °ªÀº, 0 ¿¡¼­ ½ÃÀÛÇÏ°í ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î °¡¸é¼­ 1¾¿ Áõ°¡µË´Ï´Ù. = °¡ ÁÖ¾îÁø ¿­°ÅÀÚ´Â °ü·ÃµÈ ¸íĪ¿¡ ¸í½ÃµÈ °ªÀ» ´ëÀÔÇØ ÁÝ´Ï´Ù; = °¡ ¾øÀÌ À̾îÁö´Â ¸íĪÀº ÀÌÀü¿¡ ´ëÀÔµÈ °ªºÎÅÍ °è¼ÓÇØ¼­ Áõ°¡ÇÕ´Ï´Ù.
  °°Àº Åë¿ë¹üÀ§ (scope) ³»¿¡ ÀÖ´Â ¿­°ÅÀÚ ¸íĪÀº, ¼­·Î°£¿¡ ȤÀº º¸ÅëÀÇ º¯¼öµé°ú ±¸ºÐµÇ¾î¾ß ÇÕ´Ï´Ù. ÇÏÁö¸¸ °ªÀº ±¸ºÐµÉ Çʿ䰡 ¾ø½À´Ï´Ù.
  ¿­°Å-ÁöÁ¤ÀÚ (enum-specifier) ¿¡ ÁÖ¾îÁø ¸íĪ (identifier) ÀÇ ¿ªÇÒÀº ±¸Á¶Ã¼-ÁöÁ¤ÀÚ (struct-specifier) ÀÇ ±¸Á¶Ã¼ Åðú À¯»çÇÕ´Ï´Ù; Áï Æ¯º°ÇÑ ¿­°Å¸¦ ¸í¸íÇÏ°Ô µË´Ï´Ù. Åðú ¸®½ºÆ®°¡ ÀÖµç ¾øµç ¿­°Å-ÁöÁ¤ÀÚ (enum-spicifier) ÀÇ ±ÔÄ¢Àº ±¸Á¶Ã¼ ¡¤ °ø¿ëü ÁöÁ¤ÀÚ¿Í °°½À´Ï´Ù. ´Ü ºÒ¿ÏÀüÇÑ ¿­°ÅÇü (incomplete enumeration type) Àº Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù; µû¶ó¼­ ¿­°ÅÀÚ ¸®½ºÆ®°¡ ¾ø´Â ¿­°Å-ÁöÁ¤ÀÚÀÇ ÅÃÀº, Åë¿ë¹üÀ§ ¾ÈÀÇ ¸®½ºÆ®°¡ ÀÖ´Â ÁöÁ¤ÀÚ¸¦ ÂüÁ¶Çؾ߸¸ ÇÕ´Ï´Ù.

  ¿­°ÅÇüÀº ÀÌ Ã¥ÀÇ ÃÊÆÇ ÀÌÈÄ »õ·Î¿î °ÍÀÌÁö¸¸, ÀÌ¹Ì ¿©·¯Çص¿¾È C ¾ð¾îÀÇ ÇÑ ºÎºÐÀ̾ú½À´Ï´Ù.


ÀÌÀü [¡ã ¸ÇÀ§·Î]
[¢Ê ¸ñÂ÷·Î]
´ÙÀ½