C 언어(26) - 공용체

C 언어 강의, 공용체 이해

Featured image

🔚 짧게 하는 복습

✅ 1. 구조체 포인터와 ->연산자를 안다.

✅ 2. 구조체 배열과 구조체 포인터 배열을 안다.

✅ 3. 문자열 배열을 안다.

혹시 기억이 안 난다면, 다시 돌아가자


지금까지 복잡한 자료구조들을 배우고 따라오느라 어려웠을 것이다.

오늘은 C언어의 기본 자료구조 중 마지막, 공용체에 대해 다루어 보겠다.


공용체란?

공용체(union)는 생긴 모양은 구조체와 다름없다.

선언 방법은 구조체처럼 아래와 같이 하면 된다.

union
  {
    int a;
    double b;
    // 여러 원소를 역시 추가할 수 있다.
  };

이 역시, 공용체 안에 공용체, 공용체 안의 구조체가 선언할 수 있고, 그 반대로 구조체 안의 공용체 선언도 가능하다.

공용체는 구조체와 다르게 저 원소들 중, 한 번에 하나만 참조, 수정, 사용할 수 있다.

그게 무슨 말인지 이해가 안 가겠지만, 실례를 보도록 하자.

생각보다 간단하다. 이쯤 왔으면, 이 역시 자료구조이니까 어떤 메모리 구조를 가지는지 궁금해해야 한다.


공용체의 메모리 구조

공용체의 메모리 구조는 어떻게 될까?

한 번에 하나의 값만 참조가 된다는 특징을 생각해보면, 사실 어렵지 않게 유추할 수 있다.

가장 큰 저장 공간을 차지하는 원소의 공간만큼 메모리에 할당하고, 변수 호출에 맞추어 원하는 저장 공간만큼 쓰면 된다.

즉, 어떤 원소를 사용할 때 그 자료형처럼 사용하되, 시작 주소만 공용체의 주소로 같이 사용하는 것이다.


근데 도대체 이걸 왜 쓸까?

사실 첫 번째, 가장 중요한 이유는 한정된 메모리에서 메모리를 절약하고 싶었기 때문이다.

예전에는 메모리의 한계가 명확했기에, 이런 자료구조가 필요했다.

그런데 사실 요즘은 그런 용도로 쓰이는 경우는 적다. (없지는 않다. 실무에서도 유용하게 쓰이는 부분이 있다. 읽어볼 거리 참고)

두 번째 역할은 하나의 struct에서 union을 잘 정의하면, case에 맞게 유용하게 쓰일 수 있다.

설명이 좀 비직관적인데, 아래의 코드를 보자.

#include <stdio.h>

// 다양한 타입을 저장할 수 있는 공용체
typedef union {
    int i_value;
    float f_value;
    char* str_value;
} MyData;

// 데이터 타입을 나타내는 열거형
typedef enum {
    INT_TYPE,
    FLOAT_TYPE,
    STRING_TYPE
} DataType;

// 다형성을 사용하는 구조체
typedef struct {
    DataType type;  // 현재 저장된 데이터 타입
    MyData data;    // 실제 데이터
} PolymorphicData;

// 다형성을 출력하는 함수
void printPolymorphicData(PolymorphicData pdata) {
    switch (pdata.type) {
        case INT_TYPE:
            printf("Integer value: %d\n", pdata.data.i_value);
            break;
        case FLOAT_TYPE:
            printf("Float value: %f\n", pdata.data.f_value);
            break;
        case STRING_TYPE:
            printf("String value: %s\n", pdata.data.str_value);
            break;
        default:
            printf("Unknown type\n");
            break;
    }
}

int main() {
    PolymorphicData data1 = {INT_TYPE, .data.i_value = 123};
    PolymorphicData data2 = {FLOAT_TYPE, .data.f_value = 3.14f};
    PolymorphicData data3 = {STRING_TYPE, .data.str_value = "Hello, World!"};

    printPolymorphicData(data1);
    printPolymorphicData(data2);
    printPolymorphicData(data3);

    return 0;
}

이는 다형성이라는 개념으로 확장될 수 있는데, 지금 입장에서는 이런 식으로 쓸 수 있다고 생각만 하자.

보면 변수 선언은 하나의 형태로 했지만, 정의된 data type에 따라 다르게 사용하는 것을 볼 수 있다.

이는 코드를 작성하는데 있어서 일관성을 주고 직관적인 이해를 도울 수 있다.


📖 오늘의 핵심(다 알기 전까지는 넘어가지 말자❗)

✅ 1. 공용체의 정의, 선언을 안다.

✅ 2. 공용체의 메모리 구조를 안다.

✅ 3. 공용체의 역할을 안다.

⚠️ 공용체는 자주 쓰이지는 않지만, C언어의 주요 자료구조 중 하나로 잘 알아두자.

💣 과제, 없음.

🔜 더 공부해보기,

  1. 읽어볼 거리(1) - 공용체의 실무 쓰임

  2. 읽어볼 거리(2) - 다형성이란?(코드는 이해하지 않아도 되지만, 읽어보면 좋은 개념)