Jiyong's STUDY
공용체 union의 정의, 설명 본문
메모리 공간을 공유하는 공용체
공용체는 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바이트를 사용해야 하는 경우가 있다고 하자.
그렇다면 대체 어떻게 사용 할 것인가?
물론 찾아본다면 공용체가 아닌 다른 방법이 있을 수도 있다.
하지만 이러한 경우엔 공용체가 가장 편리하다.
즉 요점은, 사용 빈도가 적지만 공용체는 사용되지 않는 자료형이 아니다.
'프로그래밍 > C' 카테고리의 다른 글
fopen와 fclose 그리고 파일 스트림의 모드 (0) | 2018.05.29 |
---|---|
열거형 enum의 정의, 설명 (0) | 2018.05.25 |
구조체의 배열과 포인터의 선언과 -> 접근 (0) | 2018.05.18 |
구조체 struct와 typedef 선언 (0) | 2018.05.18 |
void 포인터 (0) | 2018.05.16 |