반응형
union (공용체)
가장 크기가 큰 변수의 메모리 하나만 공동으로 사용
나중의 것으로 덮어씌워진다.
예시 1)
void main()
{
union player
{
int a;
int b;
double c; // 가장 크기가 큰 자료형 double의 8바이트를 공용체 메모리로 사용
} park;
park.a = 123456789;
park.b = 444;
printf("%d \n",park.a); // a(4바이트)가 b(4바이트)로 덮어씌워지므로 444출력
park.c = 3.14;
printf("%d \n",park.a); //정수 a에 실수(3.14)가 덮어씌워져서 park.a는 알수 없는 값 출력
printf("%.2lf \n",park.c); // 3.14 출력
}
예시 2)
정수를 입력받아 상위 2바이트, 하위 2바이트의 값을 정수로,
상위 1바이트, 하위 1바이트의 값을 아스키코드로 출력하시오
#include<stdio.h>
typedef struct STC
{
short upper;
short lower;
}stc;
typedef union UNI
{
// 보면 변수들이 다 똑같이 4바이트 이지만 쪼개지는 단위가 다르다.
int num;
char c[4]; // 1바이트씩 쪼갤 수 있음 (char)
stc s; // 2바이트씩 쪼갤 수 있음 (short)
}uni;
void main()
{
uni u;
printf("정수 입력 : ");
scanf("%d",&u.num);
printf("upper:%u lower:%u \n",u.s.upper,u.s.lower);
printf("first:%c last:%c \n",u.c[0],u.c[3]);
}
메모리를 그림으로 표현하면 다음과 같다.
활용 예
C 언어를 사용하신다면 struct는 아마도 대부분 사용하실 것이라고 생각됩니다.
그런데 의외로 사용하지 않는 것이 있는데 바로 union입니다.
저 같은 겨우 union을 시리얼 통신이나 TCP/IP 통신에서 가끔 사용합니다.
혹시, 이런 경우 있지 않나요? 시리얼로 한 바이트씩 정수 값을 받아 들이는 경우 말이죠.
상대방이 보내려는 정수 값 : 0x12345678
상대방이 하나 씩 보낸 순서 : 0x12, 0x34, 0x56, 0x78
이럴 때 union을 사용하면 편한데, 대부분 버퍼로 받아서는 직접 계산을 하더군요.
n_size = buff[3] * 256 * 256 * 256 + buff[2] * 256 * 256 + buff[1] * 256 + buff[0]
또는 비트를 shift 하기도 하지만, 어찌되었든 같은 방법입니다. 그러나 union을 사용하면 매우 간단해 집니다.
#include<stdio.h>
typedef unsigned char byte;
typedef unsigned int u32;
typedef struct
{
byte b1, b2, b3, b4;
} size_byte_t;
typedef union
{
u32 size;
size_byte_t bytes;
} size_data_t;
int main (void)
{
size_data_t s_size;
// 시리얼로 4개의 바이트를 buff[]로 받았다면
s_size.bytes.b1 = buff[0];
s_size.bytes.b2 = buff[1];
s_size.bytes.b3 = buff[2];
s_size.bytes.b4 = buff[3];
printf( "data size =%x \n", s_size.size);
return 0;
}
반응형