13-5.°ø¿ëü

13-5-°¡.Á¤ÀÇ

°ø¿ëü(Union)´Â ¸ðµç ¸é¿¡¼­ ±¸Á¶Ã¼¿Í °°À¸¸ç ¼±¾ð ¹®¹ýÀ̳ª »ç¿ëÇÏ´Â ¹æ¹ýÀÌ µ¿ÀÏÇÏ´Ù. ´Ù¸¸ °ø¿ëü¿¡ ¼ÓÇÑ ¸â¹öµéÀÌ ±â¾ï Àå¼Ò¸¦ °øÀ¯ÇÑ´Ù´Â °Í¸¸ ´Ù¸£´Ù. ±â¾ï Àå¼Ò¸¦ ¾î¶»°Ô °øÀ¯ÇÑ´Ù´Â °ÍÀÎÁö ¼±¶æ ÀÌÇØÇϱâ Èûµçµ¥ ÀÏ´Ü ¶È°°Àº ¸ð¾çÀÇ ±¸Á¶Ã¼¿Í °ø¿ëü¸¦ ¼±¾ðÇØ ³õ°í ºñ±³ÇØ º¸µµ·Ï ÇÏÀÚ. °ø¿ëü¸¦ ¼±¾ðÇÒ ¶§´Â Å°¿öµå struct ´ë½Å¿¡ unionÀ» »ç¿ëÇÑ´Ù.

 

struct {

     int a;

     short b[2];

} st;

union {

     int a;

     short b[2];

} un;

 

µÑ ´Ù Á¤¼öÇü ¸â¹ö a¿Í Å©±â 2ÀÇ shortÇü ¹è¿­ b¸¦ ¸â¹ö·Î °¡Áö°í Àִµ¥ st´Â ±¸Á¶Ã¼ÀÌ°í unÀº °ø¿ëüÀÌ´Ù. ÀÌ µÎ º¯¼ö°¡ ¸Þ¸ð¸®¿¡ ±¸ÇöµÈ ¸ð¾çÀ» ±×¸²À¸·Î ºñ±³ÇØ º¸¸é ´ÙÀ½°ú °°´Ù.

±¸Á¶Ã¼´Â ¼±¾ðµÈ ¸â¹ö°¡ ¼ø¼­´ë·Î ¹èÄ¡µÇ¸ç a°¡ 4¹ÙÀÌÆ®¸¦ Â÷ÁöÇÏ°í À̾ b[0]°¡ 2¹ÙÀÌÆ®, b[1]ÀÌ 2¹ÙÀÌÆ®¸¦ °¢°¢ Â÷ÁöÇÑ´Ù. ±¸Á¶Ã¼ÀÇ Å©±â´Â ¸ðµç ¸â¹ö Å©±âÀÇ ÃÑÇÕ°ú °°À¸¹Ç·Î sizeof(st)´Â 8ÀÌ µÉ °ÍÀÌ´Ù. °ø¿ëü´Â ¸ðµç ¸â¹ö°¡ ±â¾ï Àå¼Ò¸¦ °øÀ¯Çϸç a°¡ ÀÖ´Â ÀÚ¸®¿¡ bµµ °°ÀÌ Á¸ÀçÇÑ´Ù. °ø¿ëüÀÇ Å©±â´Â °¡Àå Å« ¸â¹öÀÇ Å©±â¿Í °°À¸¸ç sizeof(un)Àº 4°¡ µÈ´Ù.

°ø¿ëüÀÇ ¸â¹öµéÀº Ç×»ó °ø¿ëüÀÇ ¼±µÎ ¹øÁö¿Í °°Àº °ø°£¿¡ ¹èÄ¡µÇ´Âµ¥ aÀÇ ¹øÁö³ª bÀÇ ¹øÁö³ª µ¿ÀÏÇÏ´Ù. µû¶ó¼­ a¿¡ ¾î¶² °ªÀ» ´ëÀÔÇÏ¸é °°Àº ±â¾ï °ø°£¿¡ Á¸ÀçÇÏ´Â bÀÇ °ªµµ µ¢´Þ¾Æ ¹Ù²î°Ô µÇ¸ç ¹Ý´ë·Î b¸¦ º¯°æÇϸé aµµ °°ÀÌ º¯°æµÈ´Ù. ´ÙÀ½ ¿¹Á¦·Î ÀÌ·± µ¿ÀÛÀ» È®ÀÎÇØ º¸ÀÚ.

 

¿¹ Á¦ : Union

#include <Turboc.h>

 

union tag_kong {

     int a;

     short b[2];

};

 

void main()

{

     tag_kong un;

     un.a=0x12345678;

     printf("un.a=%x\n",un.a);

     printf("un.b[0]=%x\n",un.b[0]);

     printf("un.b[1]=%x\n",un.b[1]);

 

     un.b[0]=(short)0x9999;

     printf("´ëÀÔ ÈÄÀÇ un.a=%x\n",un.a);

}

 

°ø¿ëü unÀÇ a¸â¹ö¿¡ 0x12345678À» ´ëÀÔÇÑ ÈÄ a¿Í b[0], b[1]ÀÇ °ªÀ» °¢°¢ Ãâ·ÂÇØ º¸¾Ò´Ù. °á°ú´Â ´ÙÀ½°ú °°´Ù.

 

un.a=12345678

un.b[0]=5678

un.b[1]=1234

´ëÀÔ ÈÄÀÇ un.a=12349999

 

a´Â ´ëÀÔÇÑ °ªÀ» ±×´ë·Î °¡Áö¸ç b ¹è¿­ ¿ä¼Ò °¢°¢Àº a°ªÀÇ »óÇÏÀ§ ¿öµå¸¦ ³ª´©¾î °¡Áö°í ÀÖ´Ù. ÀÎÅÚ °è¿­ÀÇ CPU´Â Á¤¼ö°ªÀ» °Å²Ù·Î ÀúÀå(¿ª¿öµå ¹æ½ÄÀ̶ó°í ÇÑ´Ù)ÇϹǷΠb[1]ÀÌ aÀÇ »óÀ§ ¿öµå, b[0]ÀÌ aÀÇ ÇÏÀ§ ¿öµå¸¦ °¡Áø´Ù. ÀÌ »óÅ¿¡¼­ un.b[0]=0x9999´ëÀÔ¹®À» ½ÇÇàÇϸé a´Â 0x12349999°¡ µÉ °ÍÀÌ´Ù. µÎ ¸â¹ö°¡ °°Àº ±â¾ï Àå¼Ò¿¡ ÀúÀåµÇ¾î Àֱ⠶§¹®¿¡ µÑ Áß Çϳª¸¦ ¹Ù²Ù¸é ³ª¸ÓÁö ¸â¹öÀÇ °ªµµ ¹Ù²î´Â °ÍÀÌ ´ç¿¬ÇÏ´Ù.

±×·¸´Ù¸é µµ´ëü ±â¾ï Àå¼Ò¸¦ °øÀ¯Çϵµ·Ï ÇÏ´Â ÀÌÀ¯´Â ¹«¾ùÀϱî? ¾îÂ÷ÇÇ ÇÑ ¹ø¿¡ ÇϳªÀÇ ¸â¹ö¸¸ À¯È¿ÇÑ °ªÀ» °¡Áú ¼ö Àִµ¥ ¸»ÀÌ´Ù. ±× ÀÌÀ¯´Â µÎ °³ÀÇ ¸â¹ö°¡ °°Àº °ø°£¿¡ ¹èÄ¡µÇ¾î ÀÖÀ¸¸é ¿øÇϴ ŸÀÔÀ» ¼±ÅÃÇؼ­ ÀÐ°í ¾µ ¼ö Àֱ⠶§¹®ÀÌ´Ù. À̶§ °ø¿ëü¿¡ ¼ÓÇÑ ¸â¹öµéÀº ÀüÇô »ó°ü¾ø´Â °ªÀÌ ¾Æ´Ï¶ó ³í¸®ÀûÀ¸·Î À¯»çÇÑ °ªÀ̾î¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ¶È°°Àº °ªÀÇ ´Ù¸¥ Ç¥ÇöÀ̶óµç°¡ °ª ÀÚü°¡ Ç¥ÇöÇÏ´Â ¸ñÀûÀÌ µ¿ÀÏÇØ¾ß °ø¿ëü°¡ µÉ ¼ö ÀÖ´Ù.

un °ø¿ëüÀÇ °æ¿ì intÇüÀ» ¾²°í ½ÍÀ¸¸é a¸â¹ö¸¦ ÂüÁ¶ÇÏ°í shortÇüÀ» ¾²°í ½ÍÀ¸¸é b¸â¹ö¸¦ ÂüÁ¶ÇÏ¸é µÈ´Ù. ±â·ÏÇÒ ¶§´Â intÇüÀ¸·Î ±â·ÏÇÏ°í ÀÐÀ» ¶§´Â »óÇÏÀ§ ¿öµå¸¦ ³ª´©¾î shortÇüÀ¸·Î ÀÐÀ» ¼öµµ ÀÖÀ¸¸ç ¹Ý´ë·Î »óÇÏÀ§ ¿öµå¸¦ °¢°¢ µû·Î º¯°æÇÑ ÈÄ ÀÐÀ» ¶§´Â 32ºñÆ®ÀÇ intÇüÀ¸·Î Àд °Íµµ °¡´ÉÇÏ´Ù. Á» ´õ °³³äÀûÀ¸·Î ÀÌÇØÇϱ⠽¬¿î ¿¹¸¦ µé¾î º¸µµ·Ï ÇÏÀÚ.

 

union tag_ip {

     unsigned long addr;

     unsigned char sub[4];

};

 

ÀÌ °ø¿ëü´Â ÀÎÅÍ³Ý ÁÖ¼ÒÀÎ IP°ªÀ» ÀúÀåÇϴµ¥ IP´Â 32ºñÆ®ÀÇ ºÎÈ£¾ø´Â Á¤¼ö·Î µÇ¾î ÀÖÁö¸¸ Ç¥±âÇÒ ¶§´Â 210.238.128.136°ú °°ÀÌ ÇÑ ¹ÙÀÌÆ®¾¿ 10Áø¼ö·Î ¾²´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù. Ç¥±â¸¦ À§Çؼ­ °ªÀ» ÀÐÀ» ¶§´Â sub ¹è¿­À» Àд °ÍÀÌ Æí¸®ÇÏ°í ½ÇÁ¦ Åë½ÅÀ» À§ÇØ ÁÖ¼Ò°ªÀ» Àü´ÞÇÒ ¶§´Â 32ºñÆ®ÀÇ addr¸â¹ö¸¦ Àд °ÍÀÌ È¿À²ÀûÀÌ´Ù. ´ÙÀ½Àº °ø¿ëüÀÇ ¶Ç ´Ù¸¥ È°¿ë¿¹¸¦ º¸ÀÚ.

 

union tag_unit {

     int mili;

     double inch;

};

tag_unit length;

 

ÀÌ °ø¿ëü´Â ±æÀÌ°ªÀ» ÀúÀåÇϴµ¥ ±æÀ̸¦ Ç¥ÇöÇÏ´Â ¹æ½Ä µÎ°¡Áö¸¦ µ¿½Ã¿¡ Áö¿øÇÑ´Ù. ¹Ð¸®¹ÌÅÍ ´ÜÀ§·Î ±æÀ̸¦ ÁöÁ¤ÇÒ ¼öµµ ÀÖ°í ÀÎÄ¡ ´ÜÀ§¸¦ »ç¿ëÇÒ ¼öµµ Àִµ¥ ÀÎÄ¡´Â ¹Ð¸®¹ÌÅͺ¸´Ù Å©±â ¶§¹®¿¡ ¼Ò¼öÁ¡ ÀÌÇÏ µÎÀÚ¸®±îÁö ÁöÁ¤Çϱâ·Î ÇÑ´Ù. ±×·¡¼­ mili ¸â¹ö´Â Á¤¼öÇüÀ¸·Î ¼±¾ðÇß°í inch ¸â¹ö´Â ½Ç¼öÇüÀ¸·Î ¼±¾ðÇß´Ù. ¹°·Ð Æ®À¬½º³ª Æ÷ÀÎÆ®, Çȼ¿ µî ´Ù¸¥ ´ÜÀ§·Îµµ Ç¥ÇöÇÏ°í ½Í´Ù¸é ¸â¹ö¸¦ ´õ ´Ã¸®¸é µÈ´Ù.

¹Ð¸®°ªÀ» ÀúÀåÇÏ°í ½Í´Ù¸é length.mili ¸â¹ö¿¡ °ªÀ» ÀúÀåÇÏ°í ÀÎÄ¡·Î ÀúÀåÇÏ°í ½Í´Ù¸é length.inch ¸â¹ö¸¦ »ç¿ëÇÑ´Ù. µÑ Áß ÇϳªÀÇ ´ÜÀ§·Î ±æÀ̸¦ Ç¥ÇöÇÒ ¼ö ÀÖÀ¸¹Ç·Î ±»ÀÌ µÎ ´ÜÀ§ ¸ðµÎÀÇ °ªÀ» °¡Áú ÇÊ¿ä´Â ¾øÀ¸¸ç ±×·¡¼­ °¢ ¸â¹ö°¡ µû·Î °ªÀ» ÀúÀåÇÏ´Â ±¸Á¶Ã¼°¡ ¾Æ´Ñ °ø¿ëü·Î ¼±¾ðÇÑ °ÍÀÌ´Ù.

±×·¸´Ù¸é °ø¿ëü¿¡ ÀúÀåµÈ °ªÀÌ ¾î¶² ¸â¹ö¸¦ ±âÁØÀ¸·Î ÇÑ °ÍÀÎÁö´Â ¾î¶»°Ô ¾Ë ¼ö ÀÖÀ»±î? ¿¹¸¦ µé¾î length¿¡ 123À̶ó´Â °ªÀÌ ÀúÀåµÇ¾î ÀÖ´Ù¸é ÀÌ°ÍÀº 123¹Ð¸®¹ÌÅÍÀΰ¡ ¾Æ´Ï¸é 123ÀÎÄ¡Àΰ¡? Á» ÀÌ»óÇÏ°Ô µé¸®°ÚÁö¸¸ ¾î¶² ¸â¹ö¸¦ ±âÁØÀ¸·Î ÀúÀåµÈ °ªÀÎÁö ¾Ë ¼ö ÀÖ´Â ¹æ¹ýÀº µû·Î Á¦°øµÇÁö ¾Ê´Â´Ù. ¿Ö³ÄÇÏ¸é °ø¿ëü´Â µÑ ÀÌ»óÀÇ ¸â¹ö°¡ ±â¾ï Àå¼Ò¸¦ °øÀ¯Çϵµ·Ï¸¸ ÇÒ »ÓÀÌÁö ¾î¶² ¸â¹ö¸¦ ÅëÇØ °ªÀ» ´ëÀÔ¹Þ¾Ò´ÂÁö´Â ±â¾ïÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù.

°ø¿ëü¿¡ ÀúÀåµÈ °ªÀÇ Àǹ̴ ´ëÀÔÇÒ ¶§ ¾î¶² ¸â¹ö¸¦ »ç¿ëÇߴ°¡¿¡ µû¶ó ´Þ¶óÁö´Âµ¥ À̸¦ Á¤È®ÇÏ°Ô ¾Æ´Â »ç¶÷Àº ¿©±â¿¡ °ªÀ» ´ëÀÔÇÑ »ç¶÷»ÓÀÌ´Ù. °ªÀ» ´ëÀÔÇÒ ¶§ ¾î¶² ¸â¹ö¿¡ °ªÀ» ±â¾ï½Ãų °ÍÀΰ¡¸¦ ¼±ÅÃÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ °ªÀ» »ç¿ëÇÒ ¶§´Â ¾î¶² ÀǹÌÀÎÁö ¾Ë¾Æ¼­ »ç¿ëÇØ¾ß ÇÑ´Ù. ÇÊ¿äÇÏ´Ù¸é °ø¿ëü°¡ ¾î¶² ŸÀÔÀÇ °ªÀ» ÀúÀåÇÏ°í ÀÖ´ÂÁö¸¦ ±â¾ïÇÏ´Â º°µµÀÇ º¯¼ö¸¦ µÑ ¼öµµ ÀÖ´Ù.

°ø¿ëüµµ ¼±¾ðÇϸ鼭 ÃʱâÈ­¸¦ ÇÒ ¼ö Àִµ¥ ´Ü ù ¹ø° ¸â¹ö¿¡ ´ëÇؼ­¸¸ ÃʱⰪÀ» ÁÙ ¼ö ÀÖ´Ù. ´ÙÀ½ ¼±¾ð¹®Àº length °ø¿ëü¸¦ ¼±¾ðÇϸ鼭 mili¿¡ 15¸¦ ´ëÀÔÇÑ´Ù.

 

tag_unit length={15};

 

¸¸¾à inch ´ÜÀ§·Î ÃʱⰪÀ» ÁÖ°í ½Í´Ù¸é ¸â¹öÀÇ ¼ø¼­¸¦ ¹Ù²Û ÈÄ ½Ç¼ö ÃʱⰪÀ» Áְųª ¾Æ´Ï¸é ÁöÁ¤ÇÏ°í ½ÍÀº ÀÎÄ¡°ªÀ» ¹Ð¸®¹ÌÅÍ ´ÜÀ§·Î ¹Ù²Ù¾î mili¿¡ ÃʱⰪÀ» ÁÖ´Â ¹æ¹ý¹Û¿¡ ¾ø´Ù.