공용체(Union type)?

<aside> 💡 구조체는 사용자 정의 자료형을 만들 수 있는 친구였다. 공용체와 열거형 역시 일종의 자료형이라고 이해할 수 있다. 다만 고유한 특징들이 구조체와는 다른 결과를 만들어 낸다. 오늘은 공용체의 기본적인 특징들을 배워보자.

</aside>


구조체와 공용체

구조체와 공용체 모두 사용자 정의 자료형이다. 사용자 정의 자료형이라는 범주에 같이 속해있기 때문에, 구조체와 공용체를 비교하면 쉽게 공용체를 이해할 수 있다.

//구조체 정의
typedef struct s_42struct
{
	int          n1;
	size_t       n2;
	unsigned int n3;
} t_42struct;

//공용체 정의
typedef union u_42union
{
	int          n1;
	size_t       n2;
	unsigned int n3;
} t_42union;

위의 코드를 살펴보면, 구조체와 공용체의 선언이 굉장히 흡사하다는 것을 알 수 있다. 두 정의방식의 차이는 struct 선언과 union선언 뿐이다. 그러나, 이를 통해 정의된 구조체와 공용체의 결과는 굉장히 다르다. 메모리 공간을 사용하는 방식에 많은 차이가 있는 것이다.

위의 구조체와 공용체를 대상으로 자료형의 사이즈를 측정해보자.

printf ("%lu \\n", sizeof(t_42struct)); -> 24출력
printf ("%lu \\n", sizeof(t_42union)); -> 8출력

값이 다르다! 구조체는 16의 값을, 공용체는 8의 값을 가지고 있는 것을 알 수 있다.

이번에는 각 멤버들의 주소를 출력해보자(실제로 해보자)

//구조체 주소출력
printf ("%p \\n", &t_42struct);
//구조체 멤버 주소 출력
printf ("%p %p %p\\n", &t_42struct.n1, &t_42struct.n2 &t_42struct.n3);
//공용체 주소 출력
printf ("%p \\n", &t_42union);
//공용체 멤버 주소 출력
printf ("%p %p %p\\n", &t_42union.n1, &t_42union.n2 &t_42union.n3);

어떤 결과값이 나왔을까? 직접 해보자.


실행결과:

공용체를 구성하는 멤버들의 주소 값이 동일하다는 것을 알 수 있다. 바로 우리는 여기서 공용체의 메모리 할당 특성을 알 수 있다!

만약 구조체를 선언한다면, 구조체를 구성하는 멤버 변수들은 각각의 메모리를 따로 할당받게 된다.

반면 공용체를 선언한다면, 공용체는 공용체의 멤버들 중 가장 큰 메모리 사이즈를 가지고 있는 멤버의 사이즈만큼만 할당되어, 이를 공유하게 된다.