Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 유니온(Union) 완벽 가이드: 포인터 활용법까지

유니온(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을 대입합니다. 그런 다음 포인터 pvar의 주소를 가리키도록 하고, p->a로 정수 값 90을 출력합니다. 이어서 p->b는 같은 메모리 공간을 char 타입으로 읽어들이므로, ASCII 코드 90에 해당하는 문자 'Z'가 출력됩니다. 이처럼 유니온의 모든 멤버가 하나의 메모리를 공유한다는 핵심 개념을 명확히 확인할 수 있는 예제입니다.