유니온(Union)은 서로 다른 데이터 타입을 가진 여러 변수가 하나의 메모리 공간을 공유하는 자료구조입니다. 구조체(structure)와 형태가 비슷하지만, 구조체는 각 멤버가 독립적인 메모리를 사용하는 반면 유니온은 모든 멤버가 같은 메모리를 함께 사용한다는 점이 가장 큰 차이입니다.
유니온 선언 문법
유니온을 선언하는 기본 문법은 다음과 같습니다.
union 유니온태그{
자료형 멤버1;
자료형 멤버2;
----
----
자료형 멤버n;
};
예를 들어 다음과 같이 작성할 수 있습니다.
union sample{
int a;
float b;
char c;
};
유니온 변수 선언 방법
유니온 변수는 크게 세 가지 방식으로 선언할 수 있습니다.
방법 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;
유니온이 선언되면 컴파일러는 해당 유니온에서 가장 큰 데이터 타입을 저장할 수 있는 크기의 메모리를 자동으로 할당합니다. 또한 중요한 특징으로, 어느 시점이든 단 하나의 멤버만 유효하게 참조할 수 있습니다. 마지막에 대입된 멤버의 값만 의미 있게 유지되기 때문입니다.
초기화와 멤버 접근
- 유니온 멤버에 접근하는 방법은 구조체와 동일합니다.
- 일반적으로 일반 변수로 접근할 때는 점(.) 연산자를 사용합니다.
- 포인터로 멤버에 접근할 때는 화살표(->) 연산자를 사용합니다.
- 유니온 안에서 사용할 수 있는 데이터 타입에는 특별한 제한이 없습니다.
포인터를 활용한 유니온 예제
다음은 포인터를 이용해 유니온 멤버에 접근하는 C 프로그램입니다.
#include<stdio.h>
union abc{
int a;
char b;
};
int main(){
union abc var;
var.a=90;
union abc *p=&var;
printf("%d%c",p->a,p->b);
}
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
90Z
결과 해석: 먼저 var.a에 정수 90을 대입합니다. 그런 다음 포인터 p가 var의 주소를 가리키도록 하고, p->a로 정수 값 90을 출력합니다. 이어서 p->b는 같은 메모리 공간을 char 타입으로 읽어들이므로, ASCII 코드 90에 해당하는 문자 'Z'가 출력됩니다. 이처럼 유니온의 모든 멤버가 하나의 메모리를 공유한다는 핵심 개념을 명확히 확인할 수 있는 예제입니다.