C++ 공용체(Union) | C++ 자습서 10

C++ 공용체(Union)

공용체는 구조체와 비슷하게 생겼지만 한번에 한가지의 데이터 형만 보관할 수 있는 구조체입니다. 어떤 데이터형을 정의할 때 하나의 정해진 데이터형이 아니라 int, float 같이 여러개의 데이터형을 사용해야 할 때 유용합니다. 잘 사용하면 메모리 공간을 절약할 수 있습니다.

공용체 작성

공용체는 { } 괄호안에 여러 데이터형의 변수를 나열합니다. 이중에서 한 시점에 하나의 변수만 사용할 수 있습니다. 사용법은 구조체 처럼 . 도트 연산자로 멤버변수에 접근할 수 있습니다.

#include <iostream>

using std::cout;
using std::endl;

union myUnion
{
    char varChar;
    int varInt;
    long varLong;
    float varFloat;
    double varDouble;
};

int main()
{
    myUnion u1;

    u1.varChar = 'A';

    cout << "^ u1.varChar: " << u1.varChar << endl;

    u1.varInt = 777;

    cout << "^ u1.varInt: " << u1.varInt << endl;

    // 값을 바꾸면 varChar는 사용할 수 없다
    // 한 시점에 하나의 변수만 사용가능
    cout << "^ u1.varChar: " << u1.varChar << endl;

    u1.varDouble = 3.14;

    cout << "^ u1.varDouble: " << u1.varDouble << endl;

    // 역시 그전의 값은 소실된다. 
    // 어떤 결과가 나올지 알수없다.
    cout << "^ u1.varInt: " << u1.varInt << endl;

   return 0;

}
^ u1.varChar: A
^ u1.varInt: 777
^ u1.varChar:
^ u1.varDouble: 3.14
^ u1.varInt: 1374389535

만약 하나의 변수를 사용하는데 다른 변수에 값을 할당하지 않은채 사용하려 시도하면 결과를 알 수 없습니다. 메모리 안에는 랜덤한 쓰레기 값이 들어있을 뿐입니다.

구조체 내부에 공용체 사용

공용체 하나만 사용하는 것 보다 구조체와 함께 사용했을 때 활용도가 높습니다. 구조체의 멤버중에서 데이터 타입을 바꿔야 할 필요가 있는 변수를 공용체로 바꿉니다.

문법적으로는 코드블록(괄호)이 중첩되어 있습니다.

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    struct myCom{
        char name[20];
        int id;

        union part{
            int varInt;
            double varDouble;
        }part1;
    };

    myCom n1;
    n1.part1.varInt = 10000;

    cout << "[--- 구조체 안에서 공용체 사용하기 ---]" << endl;
    cout << n1.part1.varInt << endl;
    
   return 0;

}
[--- 구조체 안에서 공용체 사용하기 ---]
10000

마찬가지로 한 시점에 하나의 값만 가질 수 있도록 규칙이 적용됩니다. 공용체 값에 접근하려면 이름을 두번 거쳐야 합니다. 구조체 -> 공용체 -> 멤버

익명 공용체 사용하기

익명 공용체는 어차피 구조체 안에 들어가는 경우 이름이 불필요하니까 그냥 구조체의 멤버처럼 사용하는 방식입니다. 공용체 이름을 생략할 수 있다는 장점이 있습니다.

#include <iostream>

using std::cout;
using std::endl;

int main()
{
    struct myCom{
        char name[20];
        int id;

        union {
            int varInt;
            double varDouble;
        };
    };

    myCom n1;
    n1.varDouble = 19.99;

    cout << "[--- 익명 공용체 사용하기 ---]" << endl;
    cout << n1.varDouble << endl;
    
   return 0;
}
[--- 익명 공용체 사용하기 ---]
19.99

요약

공용체는 그리 복잡한 문법이 아닙니다. 구조체의 연장선상에서 봐야겠죠.

메모리 공간의 효율성을 따져야 하는 경우 사용을 고려할 수 있습니다.

참고문서

union | Microsoft Docs

Other data types – C++ 공용체 (cplusplus.com)

Unions – Learn C – Free Interactive C Tutorial (learn-c.org)

C Union – javatpoint

Leave a Comment