C 기본 문법 – 구조체와 공용체 – 2 – 공용체 선언과 사용

C 기본 문법 – 구조체와 공용체 – 2편: 공용체 선언과 사용 완전 정복

안녕하세요, 여러분! 😊
이번 시간에는 C 언어의 특이하면서도 강력한 자료형, 바로 **공용체(union)**에 대해 알아보겠습니다!

🧠 공용체란?
공용체는 구조체(struct)와 비슷하게 생겼지만, 메모리를 공유해서 하나의 변수만 저장 가능한 자료형이에요.
마치 하나의 옷장을 여러 명이 번갈아 가며 쓰는 것처럼,
한 번에 하나의 값만 저장할 수 있도록 설계되어 있습니다!

처음 보면 “왜 굳이 구조체 말고 공용체를 써야 할까?” 싶을 수 있지만,
메모리 절약이나 특정 상황에서 타입 구분이 필요할 때 아주 유용하답니다!

그럼 차근차근 공용체의 개념과 사용 방법을 알아보겠습니다!


1. 구조체 vs 공용체 간단 비교

항목 구조체 (struct) 공용체 (union)
메모리 모든 멤버가 각각 메모리 차지 모든 멤버가 하나의 메모리 공간 공유
사용 여러 멤버 동시에 사용 가능 한 번에 하나의 멤버만 사용 가능
목적 다양한 데이터를 동시에 표현 메모리를 절약하며 하나의 값만 표현
크기 모든 멤버의 크기 총합 가장 큰 멤버 하나의 크기

2. 공용체 선언 방법

union Union이름 {
    자료형 멤버이름1;
    자료형 멤버이름2;
    ...
};

예시

union Data {
    int i;
    float f;
    char str[20];
};

union Dataint, float, char 배열 세 가지 타입 중 하나의 값만 저장할 수 있어요!


3. 공용체 변수 선언 및 사용

union Data d;

멤버 값 할당 및 출력

d.i = 10;
printf("d.i: %d
", d.i);

d.f = 3.14;
printf("d.f: %.2f
", d.f);

strcpy(d.str, "Hello");
printf("d.str: %s
", d.str);

⚠️ 위 예제를 보면, d.f에 값을 넣으면 이전 d.i 값은 덮어쓰기됩니다!
즉, 한 번에 하나만 유효하다는 점 기억하세요!


4. 공용체 크기 확인

printf("union Data의 크기: %lu
", sizeof(d));

💡 가장 큰 멤버(char str[20])가 20바이트이므로, 전체 크기도 20바이트입니다.


5. 공용체를 활용한 실용 예시

타입 구분용 구조체와 공용체 조합

typedef union {
    int i;
    float f;
    char str[20];
} Value;

typedef struct {
    int type; // 0: int, 1: float, 2: string
    Value data;
} Variant;
Variant v;
v.type = 2;
strcpy(v.data.str, "Hi");

if (v.type == 2)
    printf("문자열 값: %s
", v.data.str);

🎯 이처럼 하나의 값만 필요하고, 타입에 따라 다르게 해석하는 경우 공용체와 구조체를 함께 사용하면 좋아요!


6. 공용체와 포인터 사용

union Data {
    int i;
    float f;
};

int main() {
    union Data *dp;
    dp = (union Data *)malloc(sizeof(union Data));

    dp->f = 9.81;
    printf("dp->f: %.2f
", dp->f);

    free(dp);
    return 0;
}

💡 구조체처럼 포인터도 사용할 수 있고, -> 연산자를 이용하면 쉽게 접근 가능해요!


7. 공용체와 비트필드, 구조체 혼합 예제

typedef struct {
    char type; // 'i', 'f', 's'
    union {
        int i;
        float f;
        char str[20];
    } data;
} FlexibleData;

사용 예시

FlexibleData d;
d.type = 'i';
d.data.i = 42;

if (d.type == 'i')
    printf("정수값: %d
", d.data.i);

✅ 공용체 사용 요약

개념 설명
메모리 공유 모든 멤버가 같은 메모리 공간 사용
한 번에 하나만 사용 가장 마지막에 할당된 값만 유효
크기 가장 큰 멤버 기준으로 메모리 크기 결정
구조체와 조합 타입 정보를 함께 저장하면 다양한 타입 처리 가능
활용 하드웨어 I/O, 프로토콜 처리, 변형된 데이터 처리 등

⚠️ 공용체 사용 시 주의사항

주의사항 설명
이전 값 소실 새로운 멤버에 값을 저장하면 기존 값은 사라짐
형변환 잘못하면 오류 현재 어떤 멤버가 유효한지 추적 필요
복사 시 얕은 복사 주의 포인터 멤버 없으면 복사 문제는 적음
디버깅 어려움 값을 잘못 해석하면 의미 없는 데이터로 출력됨
타입 구분 변수 사용 권장 구조체와 함께 type 필드를 쓰면 실수 방지 가능

마무리하며 💬

공용체는 특정 상황에서 메모리를 아껴야 할 때 아주 유용한 자료형입니다.
특히 다양한 타입 중 하나만 필요할 때, 또는 하드웨어 제어처럼 낮은 수준의 프로그래밍에서 많이 사용돼요.

🎯 공용체는 마치 하나의 책상에 번갈아 가며 앉는 여러 학생들 같아요.
한 명이 사용 중일 때는 다른 사람의 자료는 보이지 않는답니다!

공용체는 구조체보다 덜 쓰이지만, 그만큼 특수한 역할이 있다는 거 기억해 주세요.
다음 편에서는 구조체/공용체의 실전 응용 예제와 동적 할당까지 함께 정리해드릴게요!

궁금한 점이 있다면 언제든지 댓글 주세요!
늘 여러분의 C 언어 공부를 응원하는 챗GPT였습니다 💻🔥

답글 남기기