C 공용체(Union) 완벽 이해: 정의, 사용법, 구조체와의 비교
C 공용체(Union) 완벽 이해
C 공용체의 정의, 생성, 접근 방법을 배우고, 메모리 레이아웃과 용도에서 구조체와 어떻게 다른지 알아봅니다.
공용체는 C에서 사용자 정의 타입으로, 구조체와 달리 한 번에 멤버 중 하나만 값을 가질 수 있습니다. 이는 메모리 효율적인 데이터 표현과 저수준 프로그래밍에서의 타입 펀칭(type-punning)에 이상적입니다.
공용체 정의하기
union 키워드로 새 타입을 선언합니다. 예:
union Car {
char name[50];
int price;
};
위 코드는 50자 문자열 또는 정수 가격을 저장할 수 있는 파생 타입 union Car를 생성합니다.
공용체 변수 생성하기
공용체 정의만으로는 메모리가 할당되지 않습니다. 해당 타입의 변수를 선언하여 사용합니다:
union Car car1, car2, *car3;
정의와 변수 선언을 결합할 수도 있습니다:
union Car {
char name[50];
int price;
} car1, car2, *car3;
두 예제 모두 car1, car2는 공용체 인스턴스이고, car3은 공용체 포인터입니다.
공용체 멤버 접근하기
직접 접근은 점(.) 연산자, 포인터 접근은 화살표(->) 연산자를 사용합니다:
car1.price – car1의 price 필드 접근.
car3->price 또는 (*car3).price – 포인터를 통한 price 접근.
공용체 vs 구조체
구조체는 모든 멤버를 위한 공간을 할당하지만, 공용체의 크기는 가장 큰 멤버의 크기와 같습니다. 비교 예제:
#include <stdio.h>
union UnionJob {
char name[32];
float salary;
int workerNo;
} uJob;
struct StructJob {
char name[32];
float salary;
int workerNo;
} sJob;
int main() {
printf("size of union = %zu bytes\n", sizeof(uJob));
printf("size of structure = %zu bytes", sizeof(sJob));
return 0;
}
출력:
size of union = 32
size of structure = 40
구조체는 40바이트(32+4+4)를 차지하지만, 공용체는 가장 큰 멤버인 name[32]의 크기인 32바이트만 차지합니다. 모든 공용체 멤버는 같은 메모리 영역을 공유합니다.
실전 예제: 멤버 덮어쓰기
#include <stdio.h>
union Job {
float salary;
int workerNo;
} j;
int main() {
j.salary = 12.3;
j.workerNo = 100; // 이전 값 덮어씀
printf("Salary = %.1f\n", j.salary);
printf("Number of workers = %d", j.workerNo);
return 0;
}
출력:
Salary = 0.0
Number of workers = 100
salary와 workerNo가 같은 메모리를 공유하므로, 하나에 쓰면 다른 하나는 지워집니다.
실제 활용 사례는 Why do we need C Unions?를 참조하세요.