공용체란 동일한 저장공간을 서로다른 자료형으로 사용하기 위한 자료형입니다.
공용체는 union 키워드를 사용하며 사용방법은 구조체와 매우 비슷 합니다. 다음 예제는 구조체와 공용체를 비교합니다.
#include <stdio.h>
typedef struct _sValue{
int a;
float b;
double c;
} sValue;
typedef union _uValue{
int a;
float b;
double c;
} uValue;
int main(void) {
sValue sVal;
uValue uVal;
printf("구조체 정보 \n");
printf("sVal size : %d\n", sizeof(sVal));
printf("sVal.a : %p\n", &sVal.a);
printf("sVal.b : %p\n", &sVal.b);
printf("sVal.c : %p\n", &sVal.c);
printf("\n공용체 정보 \n");
printf("uVal size : %d\n", sizeof(uVal));
printf("uVal.a : %p\n", &uVal.a);
printf("uVal.b : %p\n", &uVal.b);
printf("uVal.c : %p\n", &uVal.c);
return 0;
}
구조체는 int(4), float(4), double(8) 해서 크기가 16이고, 각 멤버의 주소가 다릅니다.
공용체는 가장큰 double(8)멤버의 크기가 되어 8이고 각멤버의 주소가 모두 같습니다.
공용체의 유용함은 하나의 메모리 공간을 둘이상의 방식으로 접근할 수 있다는 것입니다.
다음은 정수의 곱셈 나눗셈 프로그램입니다.
#include <stdio.h>
typedef union _value {
int valInt;
double valDouble;
} Value;
Value mul(int num1, int num2);
Value div(int num1, int num2);
int main(void) {
Value a = mul(10, 3);
Value b = div(10, 3);
printf("a : %d\n", a.valInt);
printf("b : %f\n", b.valDouble);
}
Value mul(int num1, int num2) {
Value val;
val.valInt = num1 * num2;
return val;
}
Value div(int num1, int num2) {
Value val;
val.valDouble = (double)num1 / num2;
return val;
}
곱셈함수와 나눗셈함수 모두 Value 자료형을 반환합니다.
곱셈함수에서는 int 값으로 저장하고, 나눗셈함수에서는 double 값으로 저장합니다.
공용체를 사용하면 같은 메모리 공간을 다른 형식으로 접근할 수 있습니다.