공용체(Union)란?
공용체(union)는 서로 다른 데이터 타입을 가진 여러 변수가 하나의 메모리 공간을 공유하는 자료구조입니다. 구조체(structure)와 비슷하게 선언하지만, 모든 멤버가 같은 메모리 위치를 사용한다는 점이 가장 큰 차이입니다.
공용체의 기본 문법
C 언어에서 공용체를 선언하는 기본 문법은 다음과 같습니다.
union uniontag{
datatype member 1;
datatype member 2;
----
----
datatype member n;
};공용체 선언 예시
다음은 int, float, char 세 가지 타입의 멤버를 가지는 공용체의 예입니다.
union sample{
int a;
float b;
char c;
};공용체 변수 선언 방법 3가지
공용체 변수는 아래와 같이 세 가지 방식으로 선언할 수 있습니다.
방법 1 – 정의와 동시에 변수 선언
union sample{
int a;
float b;
char c;
}s;방법 2 – 태그 없이 무명 공용체로 선언
union{
int a;
float b;
char c;
}s;방법 3 – 정의 후 별도로 변수 선언
union sample{
int a;
float b;
char c;
};
union sample s;공용체의 주요 특징
공용체가 선언되면 컴파일러는 멤버 중 가장 큰 크기의 데이터 타입에 맞춰 메모리를 자동으로 할당합니다.
메모리를 공유하기 때문에 어느 한 시점에는 하나의 멤버만 유효하게 참조할 수 있습니다.
멤버 접근 문법은 구조체와 동일합니다.
일반 변수의 멤버에 접근할 때는 점 연산자(.)를 사용합니다.
포인터로 멤버에 접근할 때는 화살표 연산자(->)를 사용합니다.
공용체 포인터 사용하기
공용체 역시 구조체처럼 포인터를 가질 수 있으며, 화살표 연산자(->)를 이용해 멤버에 접근할 수 있습니다.
예제 1
다음 프로그램은 C 언어에서 공용체 포인터를 사용하는 방법을 보여줍니다.
#include <stdio.h>
union pointer {
int num;
char a;
};
int main(){
union pointer p1;
p1.num = 75;
// p2는 공용체 p1을 가리키는 포인터
union pointer* p2 = &p1;
// 포인터를 통해 공용체 멤버 접근
printf("%d %c", p2->num, p2->a);
return 0;
}
실행 결과
75 K
정수 75를 저장하면 같은 메모리를 공유하는 문자 멤버 a는 아스키(ASCII) 코드 75에 해당하는 'K'로 해석됩니다. 이것이 공용체가 메모리를 공유한다는 것을 보여주는 좋은 예입니다.
예제 2
같은 예제를 다른 입력값으로 실행해 보겠습니다.
#include <stdio.h>
union pointer {
int num;
char a;
};
int main(){
union pointer p1;
p1.num = 90;
// p2는 공용체 p1을 가리키는 포인터
union pointer* p2 = &p1;
// 포인터를 통해 공용체 멤버 접근
printf("%d %c", p2->num, p2->a);
return 0;
}
실행 결과
90 Z
정수 90은 아스키 코드로 'Z'에 해당하므로, 포인터 p2를 통해 문자 멤버를 출력하면 'Z'가 표시됩니다. 이처럼 공용체 포인터는 구조체 포인터와 동일한 방식으로 활용할 수 있으며, 화살표 연산자(->)만 기억하면 됩니다.