c 언어

C 언어의 구조체와 공용체

임베디드 친구 2024. 12. 13. 13:41
반응형

C 언어에서 구조체(structure)와 공용체(union)는 데이터를 효율적으로 관리하고 처리하기 위한 중요한 도구입니다. 이번 포스팅에서는 구조체와 공용체의 개념, 사용법, 그리고 각각의 장단점에 대해 살펴보고, 실용적인 예제를 통해 이해를 돕겠습니다.


구조체 (Structure)

구조체는 여러 데이터를 하나의 논리적인 단위로 묶어주는 사용자 정의 데이터 타입입니다. 다양한 타입의 변수들을 하나로 묶어서 처리할 수 있도록 설계되었습니다.

구조체 정의

구조체는 struct 키워드를 사용하여 정의합니다. 구조체 정의의 기본 형식은 다음과 같습니다:

struct 구조체이름 {
    데이터타입 멤버이름;
    ...
};

구조체 예제

#include <stdio.h>

struct Person {
    char name[50];
    int age;
    float height;
};

int main() {
    struct Person person1 = {"John Doe", 30, 175.5};

    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);
    printf("Height: %.1f cm\n", person1.height);

    return 0;
}

위 코드에서 struct Person은 사람의 정보를 저장하는 구조체입니다. 이 구조체는 이름, 나이, 키를 포함합니다.

구조체의 활용

  • 배열과 함께 사용: 구조체 배열을 만들어 여러 개의 데이터를 관리할 수 있습니다.
  • 포인터와 함께 사용: 구조체 포인터를 사용하면 동적으로 메모리를 할당하거나 데이터를 효율적으로 전달할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>

struct Person {
    char name[50];
    int age;
    float height;
};

int main() {
    struct Person *personPtr = (struct Person *)malloc(sizeof(struct Person));

    if (personPtr == NULL) {
        printf("Memory allocation failed\n");
        return 1;
    }

    // 데이터 입력
    printf("Enter name: ");
    scanf("%s", personPtr->name);
    printf("Enter age: ");
    scanf("%d", &personPtr->age);
    printf("Enter height: ");
    scanf("%f", &personPtr->height);

    // 데이터 출력
    printf("\nName: %s\nAge: %d\nHeight: %.1f cm\n", personPtr->name, personPtr->age, personPtr->height);

    free(personPtr);
    return 0;
}

구조체의 장점

  1. 데이터의 논리적 그룹화: 관련 데이터를 하나의 단위로 묶어 관리할 수 있습니다.
  2. 확장성: 프로그램의 요구사항에 따라 구조체를 쉽게 확장할 수 있습니다.

공용체 (Union)

공용체는 구조체와 유사하지만, 멤버들이 같은 메모리 공간을 공유합니다. 따라서 메모리를 효율적으로 사용할 수 있습니다.

공용체 정의

공용체는 union 키워드를 사용하여 정의합니다. 기본 형식은 다음과 같습니다:

union 공용체이름 {
    데이터타입 멤버이름;
    ...
};

공용체 예제

#include <stdio.h>

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

int main() {
    union Data data;

    data.i = 10;
    printf("Data as int: %d\n", data.i);

    data.f = 220.5;
    printf("Data as float: %.1f\n", data.f);

    snprintf(data.str, sizeof(data.str), "Hello");
    printf("Data as string: %s\n", data.str);

    return 0;
}

위 코드에서 union Data는 정수, 실수, 문자열을 저장할 수 있습니다. 하지만 공용체는 멤버가 같은 메모리 공간을 공유하므로 마지막에 저장된 값만 유지됩니다.

공용체의 활용

  • 메모리 효율성: 여러 데이터 중 하나만 사용되는 경우 메모리를 절약할 수 있습니다.
  • 다양한 데이터 형태 처리: 동일한 데이터에 대해 여러 형태로 접근해야 하는 상황에서 유용합니다.
#include <stdio.h>

union SensorData {
    int intValue;
    float floatValue;
    char strValue[20];
};

void printSensorData(union SensorData data, int type) {
    switch (type) {
        case 1:
            printf("Integer value: %d\n", data.intValue);
            break;
        case 2:
            printf("Float value: %.2f\n", data.floatValue);
            break;
        case 3:
            printf("String value: %s\n", data.strValue);
            break;
        default:
            printf("Unknown type\n");
    }
}

int main() {
    union SensorData data;

    data.intValue = 42;
    printSensorData(data, 1);

    data.floatValue = 3.14;
    printSensorData(data, 2);

    snprintf(data.strValue, sizeof(data.strValue), "Sensor");
    printSensorData(data, 3);

    return 0;
}

공용체의 장점

  1. 메모리 절약: 여러 데이터 중 하나만 필요할 때 메모리를 효율적으로 사용할 수 있습니다.
  2. 다양한 데이터 타입 지원: 동일한 메모리 공간에 대해 여러 타입으로 접근할 수 있습니다.

구조체와 공용체의 차이점

특징 구조체 공용체
메모리 사용 각 멤버가 별도의 메모리 공간을 가짐 모든 멤버가 같은 메모리 공간을 공유
사용 목적 멤버의 데이터를 독립적으로 관리 멤버 데이터 중 하나만 사용
메모리 크기 모든 멤버 크기의 합 가장 큰 멤버의 크기

결론

구조체와 공용체는 C 프로그래밍에서 데이터를 관리하고 처리하는 데 필수적인 도구입니다. 구조체는 데이터를 논리적으로 그룹화하는 데 적합하며, 공용체는 메모리를 효율적으로 사용해야 할 때 유용합니다. 상황에 따라 적절한 도구를 선택하여 프로그램의 효율성을 높이세요.

반응형