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

C언어 공용체(Union) 완벽 가이드 – 문법부터 구조체 활용 예제까지

C언어에서 공용체(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;
  • 공용체가 선언되면 컴파일러는 공용체의 모든 멤버를 담을 수 있도록 가장 크기가 큰 멤버 타입만큼의 메모리를 자동으로 할당합니다.

  • 어느 시점이든 공용체의 멤버 중 단 하나의 변수만 참조할 수 있습니다.

초기화 및 멤버 접근

  • 공용체 멤버에 접근할 때는 구조체와 동일한 문법을 사용합니다.

  • 일반 변수의 경우 점(.) 연산자로 멤버에 접근합니다.

  • 포인터를 통해 접근할 때는 화살표(->) 연산자를 사용합니다.

예제 프로그램 1

다음 프로그램은 공용체의 기본적인 사용법을 보여줍니다.

union sample{
    int a;
    float b;
    char c;
}
main ( ){
    union sample s = {10, 20.5, "A"};
    printf("a=%d",s.a);
    printf("b=%f",s.b);
    printf("c=%c",s.c);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

a = garbage value
b = garbage value
c = A

공용체는 모든 멤버가 하나의 메모리를 공유하기 때문에 한 번에 하나의 멤버만 유효한 값을 가집니다. 따라서 마지막에 초기화된 멤버(c)만 정상적으로 출력되고, 나머지 멤버(a, b)는 쓰레기 값(garbage value)이 됩니다.

구조체를 포함하는 공용체

  • 공용체 내부에 구조체를 중첩하여 선언할 수 있으며, 이를 구조체의 공용체(union of structures)라고 부릅니다.

  • 반대로 구조체 내부에 공용체를 정의하는 것도 가능합니다.

예제 프로그램 2

다음은 구조체를 멤버로 가지는 공용체의 사용 예를 보여주는 C 프로그램입니다.

struct x{
    int a;
    float b;
};
union z{
    struct x s;
};
main ( ){
    union z u;
    u.s.a = 10;
    u.s.b = 30.5;
    printf("a=%d", u.s.a);
    printf("b=%f", u.s.b);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

a= 10
b = 30.5

이처럼 공용체 안에 구조체를 중첩하면, 점(.) 연산자를 연달아 사용해 u.s.a, u.s.b 형태로 내부 구조체의 멤버에 접근할 수 있습니다.