[기초] C++ 유니언 (UNION)
C++ 프로그래밍에서 'union'은 여러 타입의 데이터를 하나의 메모리 위치에 저장할 수 있게 해주는 데이터 구조입니다.
이 특성은 여러 다른 형태의 데이터를 같은 메모리 공간에 저장하여 메모리를 효율적으로 사용할 수 있도록 합니다.
'union'은 주로 시스템 프로그래밍, 장치 드라이버 개발, 네트워크 통신 등에서 데이터를 다룰 때 유용하게 사용됩니다.
기본 구조
유니언을 정의하는 기본 구조는 다음과 같습니다.
union MyUnion {
int intValue;
float floatValue;
char charValue;
};
위 예제에서 'MyUnion'이라는 유니언은 'int', 'float', 'char' 타입의 데이터를 저장할 수 있습니다.
유니언의 크기는 가장 큰 데이터 타입의 크기와 같습니다.
따라서, 'MyUnion'의 크기는 'float'의 크기와 같을 것입니다 (일반적으로 4바이트)
사용 예제
유니언을 사용하는 간단한 예제를 통해 자세히 알아보겠습니다.
#include <iostream>
union MyUnion {
int intValue;
float floatValue;
char charValue;
};
int main() {
MyUnion test;
test.intValue = 123;
std::cout << "Int Value: " << test.intValue << std::endl;
test.floatValue = 98.76;
std::cout << "Float Value: " << test.floatValue << std::endl;
test.charValue = 'A';
std::cout << "Char Value: " << test.charValue << std::endl;
return 0;
}
이 코드를 실행하면, 각 필드에 값을 할당한 후 해당 값을 출력합니다.
중요한 점은, 한 번에 하나의 필드만 안전하게 사용할 수 있다는 것입니다.
즉, 'intValue'를 설정한 후 'floatValue'를 설정하면, 'intValue'에 저장된 값은 더 이상 안전하지 않습니다.
실용적 사용
유니언은 비트 필드를 조작하거나 특정 데이터 타입을 다른 형태로 해석할 때 매우 유용합니다.
예를 들어, 네트워크 프로토콜에서 패킷을 다룰 때 유니언을 사용하여 패키지된 데이터 구조를 쉽게 해석할 수 있습니다.
#include <iostream>
union Packet {
uint32_t whole;
struct {
uint16_t low;
uint16_t high;
} part;
};
int main() {
Packet p;
p.whole = 0x12345678;
std::cout << "Whole: " << std::hex << p.whole << std::endl;
std::cout << "High: " << std::hex << p.part.high << std::endl;
std::cout << "Low: " << std::hex << p.part.low << std::endl;
return 0;
}
이 예제에서는 'Packet'이라는 유니언을 사용하여 32비트 정수를 두 개의 16비트 부분으로 나누고 있습니다.
이는 특히 메모리를 절약하고자 할 때나 특정한 메모리 레이아웃을 강제하고자 할 때 유용합니다.
마무리
유니언은 C++에서 메모리를 효율적으로 사용할 수 있는 강력한 기능입니다.
하지만 사용할 때는 주의가 필요하며, 언제 어떻게 각 필드의 값을 사용할지 명확히 이해하고 있어야 합니다.
유니언을 사용함으로써 데이터를 더 유연하게 관리할 수 있지만,
타입 안전성을 저하시킬 수 있다는 점도 유의해야 합니다.
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀