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

C 언어 공용체(Union) 포인터 완벽 정리 – 선언 방법부터 멤버 접근까지

공용체(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'가 표시됩니다. 이처럼 공용체 포인터는 구조체 포인터와 동일한 방식으로 활용할 수 있으며, 화살표 연산자(->)만 기억하면 됩니다.