블로그는 나의 힘!
[ Programing ]/C++2020. 6. 5. 12:28

* union ?
struct가 구조체라면 union은 공용체.

struct와 비슷하게 사용 하지만, 메모리를 공유한다.

 

예제를 보면 쉽게 이해가 되는데
struct stBUNDLE { byte btValue; short shValue; int nValue; };
구조체 stBUNDLE의 사이즈 체크를 해 보면 byte 1 + short 2 + int 4
즉, 7바이트 값의 크기가 나오며 각각 변수들은 나뉘어져 있다.

 

union unBUNDLE { byte btValue; short shValue; int btValue; };
유니온 unBUNDLE의 사이즈 체크를 해 보면 사이즈가 제일 큰 크기로 할당된다.
즉, int 4바이트 값의 크기. 쉽게 말해 메모리를 공유한다.
다른 의미로 서로 서로 데이터를 침범 한다는 이야기.
그러므로 구조체와 다르게 3가지 변수 모두를 쓸수 있지 않으니 관리에 유념해 사용해야 한다.

 

흔히 유용하게 사용하는 게 각각 구조체를 담아 가각 다른 데이터가 들어가야 하는 상황.
같은 테이블 정보 이지만 각 타입에 따라 다른 데이터를 로드 할때 간단하게 해결해 버릴때 사용한다.
사용 하는 구조체는 1개 뿐인데 사용하지 않을 데이터를 쥐고 있을 필요가 없어지는 장점이 있다.
하지만 잘못 사용 하면 데이터가 어긋나는 현상이 있으니 관리가 철저해야 한다는 단점 이슈가 있다.

 

struct INFO_1 { byte btValue; int nValue; };
struct INFO_2 { short shValue; int nValue; };
struct INFO_3 { byte btValue; short shValue; };
struct INFO_4 { byte btValue; short shValue; int nValue };

 

struct BUNDLE {
     int nType;
     union {
          INFO_1 info1;
          INFO_2 info2;
          INFO_3 info3;
          INFO_4 info4;
     };
};

 

BUNDLE arrBundle[4];
arrBundle[0].nType = 1;
arrBundle[0].info1.btValue = 1001;
arrBundle[0].info1.shValue = 1002;

 

arrBundle[1].nType = 2;
arrBundle[1].info2.shValue = 1003;
arrBundle[1].info2.nValue = 1004;

 

arrBundle[2].nType = 3;
arrBundle[2].info3.btValue = 1005;
arrBundle[2].info3.nValue = 1006;

 

arrBundle[3].nType = 4;
arrBundle[3].info4.btValue = 1006;
arrBundle[3].info4.shValue = 1007;
arrBundle[3].info4.nValue = 1008;

 

사용은 일반적인 구조체와 같으나 구조체로 각 INFO_ 를 선언 했다면
INFO_1 = 1 + 4
INFO_2 = 2 + 4
INFO_3 = 1 + 2
INFO_4 = 1 + 2 + 4
BUNDLE = 4 + (INFO_1 + INFO_2 + INFO_3 + INFO_4 )
즉, 배열 하나당 25바이트 크기.

 

구조체가 아닌 위와 같이 유니온으로 선언 했다면
union Max size = INFO_4
INFO_4 = 1 + 2 + 4
BUNDLE = 4 + ( union INFO_4 )

즉, 배열 하나당 11바이트 크기가 된다.

 

불필요한 리소스 낭비에 유용하나 단점은 역시 철저한 관리가 되지 않으면
접근시 char 인데 int로 접근하여 데이터가 어긋나는 현상이 나타나니 철저한 관리 이슈가 있다.

 

 

'[ Programing ] > C++' 카테고리의 다른 글

SRand() 사이즈. 최대 범위.  (0) 2020.10.12
C++ Type Traits  (0) 2020.09.09
IOCP 선언.  (0) 2020.06.03
char - wchar_t 변환  (0) 2020.04.07
C++ 11이상 STL vector erase() 오류시 Exception 관련  (0) 2020.03.05
Posted by Mister_Q