C++ 공용체(Union)
목차
공용체는 구조체와 비슷하게 생겼지만 한번에 한가지의 데이터 형만 보관할 수 있는 구조체입니다. 어떤 데이터형을 정의할 때 하나의 정해진 데이터형이 아니라 int, float 같이 여러개의 데이터형을 사용해야 할 때 유용합니다. 잘 사용하면 메모리 공간을 절약할 수 있습니다.
공용체 작성
공용체는 { } 괄호안에 여러 데이터형의 변수를 나열합니다. 이중에서 한 시점에 하나의 변수만 사용할 수 있습니다. 사용법은 구조체 처럼 . 도트 연산자로 멤버변수에 접근할 수 있습니다.
#include <iostream> using std::cout; using std::endl; union myUnion { char varChar; int varInt; long varLong; float varFloat; double varDouble; }; int main() { myUnion u1; u1.varChar = 'A'; cout << "^ u1.varChar: " << u1.varChar << endl; u1.varInt = 777; cout << "^ u1.varInt: " << u1.varInt << endl; // 값을 바꾸면 varChar는 사용할 수 없다 // 한 시점에 하나의 변수만 사용가능 cout << "^ u1.varChar: " << u1.varChar << endl; u1.varDouble = 3.14; cout << "^ u1.varDouble: " << u1.varDouble << endl; // 역시 그전의 값은 소실된다. // 어떤 결과가 나올지 알수없다. cout << "^ u1.varInt: " << u1.varInt << endl; return 0; }
^ u1.varChar: A ^ u1.varInt: 777 ^ u1.varChar: ^ u1.varDouble: 3.14 ^ u1.varInt: 1374389535
만약 하나의 변수를 사용하는데 다른 변수에 값을 할당하지 않은채 사용하려 시도하면 결과를 알 수 없습니다. 메모리 안에는 랜덤한 쓰레기 값이 들어있을 뿐입니다.
구조체 내부에 공용체 사용
공용체 하나만 사용하는 것 보다 구조체와 함께 사용했을 때 활용도가 높습니다. 구조체의 멤버중에서 데이터 타입을 바꿔야 할 필요가 있는 변수를 공용체로 바꿉니다.
문법적으로는 코드블록(괄호)이 중첩되어 있습니다.
#include <iostream> using std::cout; using std::endl; int main() { struct myCom{ char name[20]; int id; union part{ int varInt; double varDouble; }part1; }; myCom n1; n1.part1.varInt = 10000; cout << "[--- 구조체 안에서 공용체 사용하기 ---]" << endl; cout << n1.part1.varInt << endl; return 0; }
[--- 구조체 안에서 공용체 사용하기 ---] 10000
마찬가지로 한 시점에 하나의 값만 가질 수 있도록 규칙이 적용됩니다. 공용체 값에 접근하려면 이름을 두번 거쳐야 합니다. 구조체 -> 공용체 -> 멤버
익명 공용체 사용하기
익명 공용체는 어차피 구조체 안에 들어가는 경우 이름이 불필요하니까 그냥 구조체의 멤버처럼 사용하는 방식입니다. 공용체 이름을 생략할 수 있다는 장점이 있습니다.
#include <iostream> using std::cout; using std::endl; int main() { struct myCom{ char name[20]; int id; union { int varInt; double varDouble; }; }; myCom n1; n1.varDouble = 19.99; cout << "[--- 익명 공용체 사용하기 ---]" << endl; cout << n1.varDouble << endl; return 0; }
[--- 익명 공용체 사용하기 ---] 19.99
요약
공용체는 그리 복잡한 문법이 아닙니다. 구조체의 연장선상에서 봐야겠죠.
메모리 공간의 효율성을 따져야 하는 경우 사용을 고려할 수 있습니다.
참고문서
Other data types – C++ 공용체 (cplusplus.com)
Unions – Learn C – Free Interactive C Tutorial (learn-c.org)