공용체는 여러 멤버들이 메모리를 공유하게 하는 것이다. 즉, 모든 멤버들의 주소가 같다. 구조체는 메모리에
순차적으로 멤버를 할당하지만 공용체는 같은 메모리를 함께 사용하는 것이다.
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] |
공용체의 초기화나 접근 방법은 구조체와 동일하게 {}와 .을 사용한다. 다만 초기화할 때 여러 멤버 중 한 번에
하나만 사용할 수 있으므로 첫 번째 멤버의 초기값만 지정한다.
<예제> 공용체의 사용 예
#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 |
빅 엔디안 방식 리틀 엔디안 방식
PC는 주로 인텔 계열의 CPU를 사용하므로 예제의 결과도 리틀 엔디안 방식으로 메모리에 값이 저장된 것을 확인할 수 있다.
공용체가 유용하게 사용되는 경우를 살펴보자.
struct info{ char name[10]; int job_code; char company_name[20]; char school_name [20]; }; |
일단 메모리에 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 |