C 공용체(Union)

프로그래밍/C 2019.05.29 댓글 Plorence

공용체(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 연산을 하면 sPoint8바이트 uPoint4바이트가 나옵니다.

구조체는 구조체 변수의 바이트 크기를 모두 합한 결과이고, 공용체는 멤버 중에서 가장 큰 바이트가 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바이트로 줄였기 때문입니다.

만약 둘 다 쓰인다면 설계부터 잘못된 거니 공용체 말고 구조체를 사용해야 합니다.

댓글