°ø¿ëü(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¿¡ ÃʱⰪÀ» ÁÖ´Â ¹æ¹ý¹Û¿¡ ¾ø´Ù.