공용체(union)
공용체(Union)은 구조체(Struct)와 같이 여러 멤버 변수를 가실 수 있지만, 이 멤버 변수들이 하나의 메모리 공간을 공유하는 형태입니다.
이는, 메모리를 절약하고, 같은 메모리 위치에 서로 다른 데이터 타입을 저장해야 하는 상황에서 유용하게 쓰일 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct MyStruct
{
int int1;
short short1;
char char1;
};
union MyUnion
{
int int1;
short short1;
char char1;
};
int main()
{
printf("Size of MyStruct: %d\n", sizeof(MyStruct));
printf("Size of MyUnion: %d\n", sizeof(MyUnion));
}
위 코드에서 MyStruct
는 각 멤버 변수가 개별적인 메모리 공간을 가지지만, MyUnion
은 모든 멤버 변수가 같은 메모리 공간을 가지게 됩니다.
따라서, 코드를 실행해 보면, 구조체는 8 byte 크기를 가지는 반면, 공용체는 4byte 크기를 가지는 것을 확인할 수 있습니다.
Union의 주요 특징
조금 어려워 보일수도 있지만, 위에서 설명한 공용체의 주요 특징을 정리해보면 이렇게 됩니다.
- 메모리 절약: Union은 가장 큰 멤버 변수의 크기만큼 메모리를 가집니다.
- 데이터 타입 재해석: 같은 메모리 위치를 서로 다른 데이터 타입으로 공유하기 때문에, 서로 다른 데이터 타입으로 해석할 수 있습니다.
이런 특징을 가진 덕분에 생각보다 많은 곳에서 메모리 공간을 효율적으로 사용하기 위해, 혹은 편리성을 위해 사용 되는 경우가 많습니다.
LARGE_INTEGER
게임 개발을 할 때, FPS 측정을 위해 사용되는 공용체인 LARGE_INTEGER
는 데이터 타입 재해석이 가능한 공용체 중 하나입니다.
1
2
3
4
5
6
7
8
9
10
11
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
} DUMMYSTRUCTNAME;
struct {
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart;
} LARGE_INTEGER;
이 공용체는 하위 32비트 값과 상위 32비트 값을 합쳐서 64비트의 값을 구성합니다.
따라서, 필요에 따라 32비트 두 개로 나눠서 쓸 수도 있고, 64비트 값으로 접근할 수도 있습니다.
D3DMATRIX
다음은 Direct3D에서 사용되는 D3DMATRIX
구조체의 형태입니다.
1
2
3
4
5
6
7
8
9
10
11
typedef struct _D3DMATRIX {
union {
struct {
float _11, _12, _13, _14;
float _21, _22, _23, _24;
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
float m[4][4];
};
} D3DMATRIX;
코드를 보면, 구조체 안에 공용체(Union)로 구성되어 있고, 공용체 안에 구조체와 float
2차원 배열이 정의되어 있습니다.
이 방식은 데이터 타입 재해석이라기 보다는 접근 방법 재해석(?)에 가깝지만, 이 역시 Union의 활용 방법 중 하나입니다.
- union
- 개별 변수 접근:
_11
,_22
, 등과 같은 방법으로 행렬의 각 요소에 접근할 수 있습니다. - 배열 접근:
m[0][0]
,m[1][1]
, 등과 같은 배열로 행렬의 각 요소에 접근할 수 있습니다.
- 개별 변수 접근: