공용체(Union Type)
구조체는 struct라는 키워드를 사용해서 정의하는 반면, 공용체는 union이라는 키워드를 사용해서 정의합니다.
유니온이라고 읽습니다.
공용체는 일반적으로 잘 쓰이지 않습니다.
정의와 선언
union uPoint
{
int xpos;
int ypos;
};
정의에서 구조체와 차이점이라면 키워드 struct 대신에 union을 사용합니다.
그 외에는 동일합니다.
변수 선언할때는 struct대신에 union 키워드를 쓰면 됩니다.
구조체와 차이점
각각의 변수가 메모리 공간에 할당되는 방식과 접근의 결과에는 많은 차이가 있습니다.
struct sPoint
{
int xpos;
int ypos;
};
union uPoint
{
int xpos;
int ypos;
};
위의 구조체와 공용체를 대상으로 sizeof 연산을 하면 sPoint는 8바이트 uPoint는 4바이트가 나옵니다.
구조체는 구조체 변수의 바이트 크기를 모두 합한 결과이고, 공용체는 멤버 중에서 가장 큰 바이트가 4라서 4라고 나온 것입니다.
즉 공용체의 크기를 결정짓는 건 멤버 중에 가장 큰 메모리 공간이 필요한 크기에 결정됩니다.
구조체는 구성하는 멤버가 각각 할당이 됩니다.
반면 공용체 변수가 선언되면,공용체를 구성하는 멤버는 각각 할당되지 않고 그중 크기가 가장 큰 멤버의 변수만 할당되어 이를 공유하게 됩니다. (주소값도 똑같다.)
#include <stdio.h>
union uPoint
{
int xpos;
int ypos;
};
int main(void) {
union uPoint point;
point.xpos = 10;
printf("%d", point.ypos);
}
위 코드를 실행하면
10
이 출력됩니다.
그이유는 메모리 공간을 공유하기 때문에 xpos의 값이 바뀌면 ypos의 값도 바뀌게 됩니다.
어디에 쓰이는가
고의로 메모리를 공유해야 한다던가, 아니면 상황에 따라 여러 변수가 주어지고 그중 하나만 사용될 때 주로 사용합니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
struct Spy{
int xpos; //x좌표
int ypos; //y좌표
union Info {
char p_class[100]; //프로세스의 클래스이름
char p_name[100]; //프로세스의 타이틀
};
};
int main(void) {
struct Spy spy;
strncpy(spy.p_class, "Name", 100);
printf("%s %s", spy.p_class, spy.p_name);
}
예를 들어서 특정 윈도우의 클래스를 알고 있다면 타이틀은 필요 없고, 클래스를 모른다면 타이틀을 사용해야 하는 상황입니다.
이때 둘 중 하나만 사용하면 됩니다.
메모리 측면에서 보면 구조체보다 공용체가 더 합리적입니다.
왜냐하면 200바이트 할당될거 100바이트로 줄였기 때문입니다.
만약 둘 다 쓰인다면 설계부터 잘못된 거니 공용체 말고 구조체를 사용해야 합니다.
댓글