[C++] 공용체
공용체
공용체(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;
}
Data
가 int
자료형으로 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;
}
마지막 출력에서 Data.BValue
를 출력하지 않고 Data.AValue
에 접근해 값을 출력하려하자 이상한 값이 출력된 것을 알 수 있습니다.
그 이유는 간단하게 자료형이 다르기 때문입니다.
각각의 자료형은 서로 다른 메모리 공간을 가지기도 하며, 고유한 비트 표현을 가지고 있습니다.
정수인 int
와 부동 소수점 자료형인 double
는 각각 4바이트와 8바이트로 메모리 크기가 다릅니다.
또한 비트 패턴이 다르므로 int
자료형으로 저장한 10
은 16진수로 읽을 때 0xA
로 저장되고, double
자료형으로 저장되는 5.1
은 16진수로 읽을 때 0x4014666666666666
로 저장됩니다.
이렇게 double
자료형으로 저장된 값을 int
자료형으로 해석하려 시도하면 비트 패턴을 엉뚱하게 해석하게 되어 이상한 값이 출력됩니다.
댓글남기기