Jiyong's STUDY

공용체 union의 정의, 설명 본문

프로그래밍/C

공용체 union의 정의, 설명

Kingjiyong 2018. 5. 25. 01:27

메모리 공간을 공유하는 공용체


공용체는 union이라는 키워드를 이용하여 정의한다.


union mem

{

int inum;

char cnum;

double dnum;

};


union Mem;


과 같이 선언할 수 있다.

언뜻 보면 구조체와 비슷하다는 느낌이 든다. 단지 struct가 union으로 바뀐 것 이외엔 차이가 없어 보인다.


typedef union

{

int inum;

char cnum;

double dnum;

}mem;


실제로, 구조체와 마찬가지로 typedef 선언 또한 가능하다.


typedef union

{

int inum;

char cnum;

double dnum;

}mem;


int main(){

mem u;

u.inum=20;

u.cnum='A';

u.dnum=3.14;

printf("%d, %c, %2lf", u.inum, u.cnum, u.dnum);

}


 심지어 사용법까지 똑같다.


하지만 결과는 어떨까?


결과>> 쓰레기값, 쓰레기값, 3.14


여기서 이해가 가지 않을 것이다. 분명 mem의 멤버 하나하나에 값을 대입을 했으나,

제대로 출력이 된 것은 마지막에 대입을 한 double형 실수 뿐이다.


그렇다면 다른 예제를 보면


typedef union

{

int inum;

char cnum;

double dnum;

}mem1;


typedef struct

{

int inum;

char cnum;

double dnum;

}mem2;


int main(){

printf("%d, %d", sizeof(mem1), sizeof(mem2));

}


이번엔 구조체와 직접 비교를 하기 위한 예제이다.

sizeof 연산을 진행했는데, 이 예제를 이해하면 이전의 예제의 결과는 자동적으로 이해가 될 것이다.


결과>> 8, 14


mem2의 경우에는 sizeof 결과가 14인 것에 대한 이해는 바로 될 것이다.

int형 4바이트, char형 2바이트, double형 8바이트, 즉 14바이트가 된다.


구조체를 공부했다면 알다시피 구조체의 메모리 공간은 멤버 하나하나의 공간이 할당된다.


그러나 mem1의 경우에는 8바이트다. 이는 유추해볼 수 있다.

공용체의 sizeof 연산 결과는 가장 큰 크기의 멤버의 길이이다.


실제로 mem1에선 가장 큰 크기의 멤버는 double형 변수, 그리고 mem1의 크기는 8바이트다.


그렇다면 이전의 예제의 결과가 이해가 된다.

아무리 공용체의 멤버 하나하나에 대입 연산을 한들, 결국 출력이 되는 것은 마지막에 연산을 한 dnum이다.


즉, 이러한 결론을 낼 수 있다.

공용체는 메모리 공간을 공유한다.


mem1의 경우엔

앞에서부터 2바이트까지 char형, 4바이트까지 int형, 8바이트까지는 double형이 할당 된다.

즉. dnum에 수를 대입 후 cnum에 수를 대입하면 cnum은 제대로 출력되나 dnum은 그렇지 않다. 

당연하게도, 이 경우엔 원치 않는 수가 나온다. 즉 쓰레기값이 나온다고 봐도 무방하다.


그렇다면 공용체는 사용하지 않는가?

그렇지도 않다. 단지 반드시 사용되는 구조체에 비하면 사용 빈도가 낮을 뿐이다.

공용체는 메모리 공간을 절약할 수 있기도 하며, 필요에 따라 공용체를 사용해야 할 경우도 있기 때문이다.


4바이트 길이의 int형 변수에 어떠한 수가 있다고 하자.

여기서 앞의 2바이트와 뒤의 2바이트, 그리고 전체인 4바이트를 사용해야 하는 경우가 있다고 하자.

그렇다면 대체 어떻게 사용 할 것인가?

물론 찾아본다면 공용체가 아닌 다른 방법이 있을 수도 있다.

하지만 이러한 경우엔 공용체가 가장 편리하다.


즉 요점은, 사용 빈도가 적지만 공용체는 사용되지 않는 자료형이 아니다.