[C++] union(공용체) – 비트 필드

오늘은 union, 공용체에 대해 알아보겠습니다.
공용체는 구조체와 비슷하지만  공용체 안에 선언된 변수들은 메모리를 공유한다는게 제일 큰 차이가 되겠네요.
이것 또한 현재는 많이 사용하지 않지만 과거에 메모리가 부족했을때 많이 사용했습니다.
네트워크 통신에서 과부하를 줄이기 위해 패킷을 최대한 줄일 때에도 많이 사용합니다.

사용 방법은 아래와 같습니다.

union 명칭
{
	변수형 변수명1;
	변수형 변수명2;
	변수형 변수명3;
};

1Byte를 공용체를 사용하여 비트 단위로 관리하면 선언하는데 작업이 더 걸리지만 사용하는 입장에서는 매우 편하게 사용할 수 있습니다.

#include <iostream>
using namespace std;

struct STRUCT_BYTE
{
	unsigned char ucBit0 : 1;
	unsigned char ucBit1 : 1;
	unsigned char ucBit2 : 1;
	unsigned char ucBit3 : 1;
	unsigned char ucBit4 : 1;
	unsigned char ucBit5 : 1;
	unsigned char ucBit6 : 1;
	unsigned char ucBit7 : 1;
};

union UNION_BYTE
{
	unsigned char ucByte;
	struct STRUCT_BYTE stByte;
};


void main()
{
	union UNION_BYTE unByte;
	memset( &unByte, 0, sizeof(unByte) );

	unByte.ucByte = 222;

	cout << "Bit 0 : " << unByte.stByte.ucBit0 << endl;
	cout << "Bit 1 : " << unByte.stByte.ucBit1 << endl;
	cout << "Bit 2 : " << unByte.stByte.ucBit2 << endl;
	cout << "Bit 3 : " << unByte.stByte.ucBit3 << endl;

	cout << "Bit 4 : " << unByte.stByte.ucBit4 << endl;
	cout << "Bit 5 : " << unByte.stByte.ucBit5 << endl;
	cout << "Bit 6 : " << unByte.stByte.ucBit6 << endl;
	cout << "Bit 7 : " << unByte.stByte.ucBit7 << endl;
	// ...

	system("pause");
}

위 코드를 이미지화 하면 아래 그림과 같습니다.


실제 예제로 알아보겠습니다
사람을 구조체로 선언한다고 합시다.
여러가지 신체부위가 있겠지만, 양손(손가락 포함)을 코드로 구현하면 아래와 같습니다.

struct FINGER
{
	bool bFirst;
	bool bSecond;
	bool bThird;
	bool bFourth;
	bool bFifth;
};

struct HUMAN
{
	struct FINGER LeftHand;
	struct FINGER RightHand;
};

만약 위와 같이 bool로 선언하면 변수크기가 총 10Byte로 잡히게 됩니다.

struct FINGER
{
	bool bFirst;
	bool bSecond;
	bool bThird;
	bool bFourth;
	bool bFifth;
};

struct HUMAN
{
	struct FINGER LeftHand;
	struct FINGER RightHand;
};

void main()
{
	struct HUMAN stHuman1;
	memset( &stHuman1, 0, sizeof(stHuman1) );

	cout << "Size : " << sizeof(stHuman1) << endl; // 10 Byte

	system( "pause" );
}

이럴때 union으로 표현하면 위 문제를 해결 할 수 있습니다.

struct FINGER
{
	unsigned char ucFirst : 1;
	unsigned char ucSecond : 1;
	unsigned char ucThird : 1;
	unsigned char ucFourth : 1;
	unsigned char ucFifth : 1;
};

union HAND
{
	unsigned char ucHand;
	struct FINGER finger;
};

struct HUMAN
{
	union HAND LeftHand;
	union HAND RightHand;
};

void main()
{
	struct HUMAN stHuman1;
	memset( &stHuman1, 0, sizeof(stHuman1) );

	cout << "Size : " << sizeof(stHuman1) << endl; // 2 Byte

	system( "pause" );
}

공용체는 프로그래머가 무엇을 어떻게 구현해야할 때 최적화 할 수 있는 방안 중 하나입니다.

모른다고 불편함은 없지만 아는만큼 할 수 있는 범위가 늘어날 겁니다.