공용체

공용체(Union)는 순서가 규칙적이지 않으며, 다양한 타입의 데이터를 저장할 수 있도록 설계된 타입입니다.

구조체와 유사하지만 모든 멤버가 동일한 메모리 위치를 공유한다는 점이 다릅니다.
메모리를 할당 받을 경우 크기가 가장 큰 멤버 변수의 크기를 기준으로 할당 받습니다.

공용체는 내부에 여러가지 타입의 멤버 변수를 선언하지만 실제 사용할 때에는 하나의 멤버 변수만 사용할 수 있습니다.

struct나 class에 포함하여 사용하는 경우가 많습니다.
여러 데이터 유형 중 하나만 필요하고, 하나의 변수에 다양한 형식의 데이터를 저장해야하는 경우 자주 사용됩니다.

공용체 정의

union MyType{
    int AValue;
    double BValue; 
};

구조체와 비슷하게 정의하지만 구조체에서 사용했던 키워드 struct와 다르게 union이라는 키워드를 사용합니다.
키워드를 제외하면 구조체의 정의 방법과 같습니다.

사용법

#include <iostream>

union MyType {
    int AValue;
    double BValue;
};

int main()
{
    MyType Data;

    Data.AValue = 10;
    std::cout << "Data.AValue: " << Data.AValue << std::endl;

    Data.BValue = 5.1;
    std::cout << "Data.BValue: " << Data.BValue << std::endl;
}

Union_Usage

Dataint 자료형으로 10을 저장하고, 출력을 한 뒤 double 자료형으로 5.1을 저장하고, 출력합니다.

각 멤버가 덮어씌워지므로 이전에 저장된 값은 유효하지 않습니다.
이 부분은 주의점에서 좀 더 자세하게 다루겠습니다.

주의점

유니온을 사용할 때는 멤버 간의 메모리 공유로 인해 잘못된 값을 읽을 수 있으므로 주의해야합니다.

사용법에서 Data.BValue에 값을 5.1로 저장하고, 이전에 저장했던 Data.AValue에 접근해 값을 읽으려고 하면 이상한 값이 출력될 것입니다.

예시는 다음과 같습니다.

#include <iostream>

union MyType {
    int AValue;
    double BValue;
};

int main()
{
    MyType Data;

    Data.AValue = 10;
    std::cout << "Data.AValue: " << Data.AValue << std::endl;

    Data.BValue = 5.1;
    std::cout << "Data.AValue: " << Data.AValue << std::endl;
}

Union_Precautions

마지막 출력에서 Data.BValue를 출력하지 않고 Data.AValue에 접근해 값을 출력하려하자 이상한 값이 출력된 것을 알 수 있습니다.

그 이유는 간단하게 자료형이 다르기 때문입니다.
각각의 자료형은 서로 다른 메모리 공간을 가지기도 하며, 고유한 비트 표현을 가지고 있습니다.
정수인 int와 부동 소수점 자료형인 double는 각각 4바이트와 8바이트로 메모리 크기가 다릅니다.
또한 비트 패턴이 다르므로 int자료형으로 저장한 10은 16진수로 읽을 때 0xA로 저장되고, double자료형으로 저장되는 5.1은 16진수로 읽을 때 0x4014666666666666로 저장됩니다.

이렇게 double자료형으로 저장된 값을 int자료형으로 해석하려 시도하면 비트 패턴을 엉뚱하게 해석하게 되어 이상한 값이 출력됩니다.

Date:     Updated:

카테고리:

태그:

Cpp 카테고리 내 다른 글 보러가기

댓글남기기