Application/기초

[기초] C++ 유니언 (UNION)

devsalix 2024. 4. 23. 14:38
728x90

 

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++에서 메모리를 효율적으로 사용할 수 있는 강력한 기능입니다.

하지만 사용할 때는 주의가 필요하며, 언제 어떻게 각 필드의 값을 사용할지 명확히 이해하고 있어야 합니다.

유니언을 사용함으로써 데이터를 더 유연하게 관리할 수 있지만,

타입 안전성을 저하시킬 수 있다는 점도 유의해야 합니다.

 

 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
728x90
반응형