포스트

공용체(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
    1. 개별 변수 접근: _11, _22, 등과 같은 방법으로 행렬의 각 요소에 접근할 수 있습니다.
    2. 배열 접근: m[0][0], m[1][1], 등과 같은 배열로 행렬의 각 요소에 접근할 수 있습니다.

D3DMATRIX


참고

구조체(struct)

[자료구조 기본] 배열

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.