nullvuild

Bloger @nullvuild

Created Date '2025/03/24 오후 01:53

Modified Date '2025/03/24 오후 02:01

#C언어 #구조체 #공용체 #struct #union

변수는 보통 하나의 값만 저장할 수 있다.

하지만 프로그램을 만들다 보면 서로 관련된 여러 데이터를 하나의 덩어리로 묶어 관리하고 싶을 때가 있다.

이럴 때 사용하는 것이 구조체(struct)공용체(union)다.


1. 구조체(struct)란?

구조체는 서로 다른 타입의 데이터를 하나로 묶을 수 있는 사용자 정의 자료형이다.

예를 들어, 학생의 이름, 나이, 평균 점수를 하나의 타입으로 묶고 싶다면 아래와 같이 이렇게 구조체를 정의한 뒤, 변수처럼 사용할 수 있다.


struct Student {
    char name[20];
    int age;
    float avg;
};

struct Student s1;
strcpy(s1.name, "철수");
s1.age = 18;
s1.avg = 88.5;

printf("이름: %s\n", s1.name);
printf("나이: %d\n", s1.age);
printf("평균: %.1f\n", s1.avg);

2. 구조체 배열과 포인터

구조체는 배열로도 만들 수 있고, 포인터를 통해 다룰 수도 있다.

struct Student students[3];
students[0].age = 17;

struct Student *p = &students[0];
p->avg = 91.3;  // 화살표 연산자 사용

  • .은 직접 접근
  • ->는 포인터가 가리키는 구조체 접근

구조체를 포인터로 인스턴하면, 함수 간 전달 시 성능이 좋다. 일반 데스크탑에서는 느끼기 어렵지만, MCU와 같이 저비용 시스템에서는 유용하다.

위의 예시는 기본 문법을 설명하기 위해 작성했으나, 아래 설명과 같이 구조체를 선언할 때 typedef를 이용해야 개발할 때, 편하다.

3. typedef로 이름 간단하게 하기

매번 struct Student라고 쓰기 번거로울 수 있다.

이럴 때는 typedef를 사용해서 별칭을 만들 수 있다.


typedef struct Student {
    char name[20];
    int age;
    float avg;
} Student;

Student s2;  // 이제 struct 생략 가능

4. 공용체(union)란?

공용체구조체와 비슷하지만, 모든 멤버가 같은 메모리 공간을 공유한다.

즉, 한 번에 하나의 멤버만 유효하다.


Pasted Image

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

union Data d;
d.i = 10;
d.f = 3.14;  // 이 시점부터 i는 의미 없음

공용체는 메모리를 아끼는 용도로 사용되며, 실제로는 한 가지 값만 쓸 경우가 많다.


항목구조체 (struct)공용체 (union)
메모리 사용각 멤버별로 따로 할당가장 큰 멤버 크기만큼만
동시 사용모든 멤버를 동시에 사용 가능한 번에 하나만 사용 가능
용도데이터 묶음, 일반적인 설계용메모리 절약, 특별한 경우

예를 들어, 센서 데이터를 받을 때 값이 int일 수도 있고, float일 수도 있는 경우엔 공용체가 유용하다.


6. 중첩 구조체

구조체 안에 또 다른 구조체를 넣을 수도 있다.


struct Date {
    int year, month, day;
};

struct Person {
    char name[20];
    struct Date birth;
};

이런 식으로 복합적인 데이터 구조를 단계적으로 구성할 수 있다.


구조체와 공용체는 단순 변수로는 표현하기 어려운 현실 세계의 데이터를 다루는 데 꼭 필요한 도구다.

특히 구조체는 C 기반 시스템 설계, 파일 저장 포맷, 네트워크 프로토콜 등 거의 모든 영역에서 사용된다.

초기에는 구조체만 익히면 충분하고, 공용체는 메모리 절약 목적으로 필요한 상황에서 사용하는 걸 추천한다.

Nullvuild

Nullvuild

@nullvuild

프로필