오늘은 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" );
}
공용체는 프로그래머가 무엇을 어떻게 구현해야할 때 최적화 할 수 있는 방안 중 하나입니다.
모른다고 불편함은 없지만 아는만큼 할 수 있는 범위가 늘어날 겁니다.