프로그래밍 C언어

공용체 (Union)

게임첫걸음 2024. 8. 20. 17:08
#include <stdio.h>

union Umemory
{
	char c;
	int i;
	double d;	// size는 큰 놈 기준으로
};

void main()
{
	// 공용체(Union)
	union Umemory mem;
	printf("mem: %p\n", &mem);			//mem: (위치값)
	mem.c = 'a';					//mem.c: 'a' 초기화
	printf("mem.c: %c (%p)\n", mem.c, &mem.c);	//mem.c: a (위치값)
	mem.i = 123;					//mem.i: 123 초기화
	printf("mem.i: %d (%p)\n", mem.i, &mem.i);	//mem.i: 123 (위치값)
	mem.d = 3.14;					//mem.d: 3.14 초기화
	printf("mem.d: %lf (%p)\n", mem.d, &mem.d);	//mem.d: 3.140000 (위치값)

	printf("mem Size: %d byte\n", sizeof(mem)); 	//mem Size: 8byte (double)
}

 공용체는 구조체와 비슷하지만 다른 점은 각 멤버 변수의 메모리 할당인데, 구조체는 각 멤버가 독립적인 메모리에 배치되지만, 공용체는 같은 메모리 공간을 공유합니다. 그 메모리의 크기는 큰 자료형의 기준을 가집니다. 위의 코드상 double이 가장 크기 때문에 c, i, d 모두 8byte 안에 사용됩니다. 구조체라면 16byte가 나왔을 겁니다. 메모리를 아끼고 싶을 때 사용합니다.

위의 코드는 Umemory라는 공용체에 c, i, d의 멤버 변수를 정의합니다. 위의 주석에 나오는 %p의 위치값은 같은 메모리를 공유하는 공용체의 특성상 모두 같은 주소값이 출력됩니다.