1. 공용체
 공용체는 여러 멤버들이 메모리를 공유하게 하는 것이다. 즉, 모든 멤버들의 주소가 같다. 구조체는 메모리에
순차적으로 멤버를 할당하지만 공용체는 같은 메모리를 함께 사용하는 이다.

union 태그명{
 데이터형 멤버형;
 데이터형 멤버형;
 ...
};

ex)
union data{
 unsigned int num;
 unsigned char arr[4];
}; 

 union data d1; //공용체 변수의 선언

 공용체 변수는 메모리에 할당될 때 같은 주소에 할당되는데 공용체 크기는 가장 큰 멤버의 크기와 같다.
위의 예에서는 멤버 모두 4바이트이므로 전체 크기도 4바이트가 된다.
<--------------------------------------------------- num --------------------------------------------------->
 arr[0] arr[1]  arr[2]  arr[3] 
<-------------------------------------------------- 4바이트-------------------------------------------------->

 공용체의 초기화나 접근 방법은 구조체와 동일하게 {}와 .을 사용한다. 다만 초기화할 때 여러 멤버 중 한 번에
하나만 사용할 수 있으므로 첫 번째 멤버의 초기값만 지정한다.

<예제> 공용체의 사용 예
 #include <stdio.h>
union data{
 unsigned int num;
 unsigned char arr[4];
};
int main(void){
union data d1;
int i;
printf("data 공용체의 크기 : %d\n", sizeof(union data));
d1.num = 0x12345678;
printf("d1.num = %08x\n", d1.num);
for(i=0;i<4;i++)
 printf("d1.arr[%d] = %02x\n", i, d1.arr[i]);
return 0;
}

d1.num을 0x12345678로 초기화했기 때문에 같은 메모미를 사용하는 d1.arr 역시 같은 값을 가진다. d1.arr는 배열이므로
4바이트인 num의 값을 바이트 단위로 접근이 가능하다. 따라서 실행결과는 다음과 같다.

 data 공용체의 크기 : 4
d1.num = 12345678
d1.arr[0] = 78
d1.arr[1] = 56
d1.arr[2] = 34
d1.arr[3] = 12

※ 리틀 엔디안과 빅 엔디안
리틀 엔디안(little endian) : 최하위 바이트부터 메모리에 저장하는 방식 (인텔 계열 CPU)
빅 엔디안(big endian) : 최상위 바이트부터 메모리에 저장하는 방식 (모토로라 계열 CPU)

                                                                     unsugned int num = 0x12345678;

 12  34 56  78    78  56  34  12 
0x1000          0x1001           0x1002          0x1003                                0x1000          0x1001           0x1002          0x1003
                             빅 엔디안 방식                                                                            리틀 엔디안 방식

PC는 주로 인텔 계열의 CPU를 사용하므로 예제의 결과도 리틀 엔디안 방식으로 메모리에 값이 저장된 것을 확인할 수 있다.

공용체가 유용하게 사용되는 경우를 살펴보자.

 struct info{
 char name[10];
 int job_code;
 char company_name[20];
 char school_name [20];
};
job_code가 0이면 학생, 1이면 회사원이라고 가정하자. 이때 위와 같이 구조체로 정의하면 job_code가 어떤 것이라도
일단 메모리에 company_name 변수와 school_name 변수가 할당된다. 따라서 학생일 경우 company_name 변수를
사용하지 않고 회사원일 경우 school_name 변수를 사용하지 않으므로 메모리가 낭비된다.
이런 경우 공용체를 이용해서 구조체를 정의하면 메모리 낭비를 막을 수 있다.

 struct info{
 char name[10];
 int job_code;
union{
 char company_name[20];
 char school_name [20];
}job_info;
};

2. 열거체
열거체(enumerated type)는 열거형이라고도 하며, 정수형의 일종이다.

 enum 태그명 {열거상수1, 열거상수2, ...};

ex) enum week {sun, mon, tue, wed, thu, fri, sat};
 위와 같이 열거체 변수에는 열거체 정의에 나열된 열거상수 값 중 하나를 저장해야 한다.
 열거체와 열거상수는 프로그램의 가독성(readability)을 향상시키는 기능을 한다.


'프로그래밍 > C' 카테고리의 다른 글

이중배열과 포인터 문제 하나  (0) 2013.12.01
malloc & free 기본 사용법  (0) 2013.07.23
typedef  (0) 2011.01.22
구조체  (0) 2010.10.23
배열과 포인터의 관계  (0) 2010.10.09
포인터 (Pointer)  (0) 2010.10.09
선택정렬 (Selection Sort)  (0) 2010.10.09

+ Recent posts