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

C언어 구조체와 공용체(Union)의 개념 및 활용 예제 총정리

C언어에서 공용체(union)는 여러 멤버가 같은 메모리 공간을 공유하는 자료형입니다. 구조체(structure)가 공용체 내부에 중첩되어 있는 형태를 '구조체의 공용체(union of structures)'라고 부르며, 반대로 구조체 안에 공용체를 선언하는 것도 가능합니다.

구조체와 공용체의 관계

구조체는 각 멤버가 서로 다른 독립적인 메모리를 사용하지만, 공용체는 모든 멤버가 하나의 메모리 공간을 함께 사용합니다. 따라서 구조체를 공용체의 멤버로 포함시키면, 해당 구조체 전체가 공용체의 메모리 영역을 차지하게 됩니다.

예제 1: 구조체를 포함한 공용체

다음은 구조체가 공용체 내부에 선언된 C 프로그램 예제입니다.

#include<stdio.h>
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);
    getch();
}

실행 결과

a=10
b=30.5

위 프로그램에서 공용체 z는 구조체 x를 멤버로 가지고 있습니다. 점 연산자(.)를 이용해 u.s.au.s.b에 접근하여 값을 저장하고 출력할 수 있습니다.

예제 2: 공용체와 포인터 활용

다음은 공용체의 멤버에 정수형과 문자형을 함께 선언하고, 포인터로 접근하는 예제입니다.

#include<stdio.h>
union abc {
    int a;
    char b;
} v;
int main() {
    v.a = 90;
    union abc *p = &v;
    printf("a=%d\n", v.a);        // 90
    printf("b=%c\n", v.b);        // Z
    printf("a=%d b=%c\n", p->a, p->b); // 90 Z
    printf("%d", sizeof(union abc));   // 4
    return 0;
}

실행 결과

a=90
b=Z
a=90 b=Z
4

결과 분석

이 예제의 핵심 포인트는 다음과 같습니다.

1. 메모리 공유: 정수형 변수 a에 90을 대입하면, 같은 메모리를 공유하는 문자형 변수 b는 아스키 코드 값 90에 해당하는 문자 'Z'로 해석됩니다. 이것이 공용체의 핵심 특징입니다.

2. 포인터 접근: 화살표 연산자(->)를 사용하면 포인터를 통해서도 공용체의 멤버에 동일하게 접근할 수 있어 결과가 같습니다.

3. 크기 계산: sizeof(union abc)의 결과가 4바이트인 이유는, 공용체의 크기가 가장 큰 멤버(int형, 4바이트)의 크기로 결정되기 때문입니다.

정리

구조체와 공용체를 조합하면 메모리를 효율적으로 활용하면서 복잡한 데이터 구조를 표현할 수 있습니다. 특히 임베디드 시스템이나 하드웨어 레지스터 제어처럼 메모리 사용량이 중요한 환경에서 공용체의 메모리 공유 특성이 매우 유용하게 활용됩니다.