공용체의 문법적인 형태는 구조체와 비슷하다. 즉, 사용 방법이 유사하다. 하지만 전혀 다른 특징을 가진다.

공용체는 변수가 사용하는 메모리 공간이 중첩된다. 따라서 공용체의 멤버 변수는 한 번에 하나만 사용할 수 있다.

흔히들 메모리를 공유한다고 표현한다.


#include <stdio.h>

union test
{
    int num1;
    float num2;
};

int main()
{
    union test T;
    
    T.num1=0;
    T.num2=1.1;

    printf("T.num1 = %d\n",T.num1);
    printf("T.num2 = %f\n",T.num2);

    return 0;
}


 위 코드에서 멤버 변수가 사용하는 실제 메모리의 모습은 아래와 같다.


1000번지        1001        1002        1003

 num1

num2


 출력 값을 보면 num1이 0으로 나오지 않는다. 그 이유는 먼저 num1을 0으로 초기화 했지만 그 후 num2에 1.1을 대입하면서 중첩되었기 때문이다.

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

데이터형 정의하기 (typedef)  (0) 2014.02.20
열거형 기본 형태  (0) 2014.02.19
구조체 사용  (0) 2014.02.05
NULL 문자  (0) 2014.02.05
포인터 이해하기  (0) 2014.02.04
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