변수는 보통 하나의 값만 저장할 수 있다.
하지만 프로그램을 만들다 보면 서로 관련된 여러 데이터를 하나의 덩어리로 묶어 관리하고 싶을 때가 있다.
이럴 때 사용하는 것이 구조체(struct)
와 공용체(union)
다.
구조체는 서로 다른 타입의 데이터를 하나로 묶을 수 있는 사용자 정의 자료형이다.
예를 들어, 학생의 이름, 나이, 평균 점수를 하나의 타입으로 묶고 싶다면 아래와 같이 이렇게 구조체를 정의한 뒤, 변수처럼 사용할 수 있다.
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);
구조체는 배열로도 만들 수 있고, 포인터를 통해 다룰 수도 있다.
struct Student students[3];
students[0].age = 17;
struct Student *p = &students[0];
p->avg = 91.3; // 화살표 연산자 사용
.
은 직접 접근->
는 포인터가 가리키는 구조체 접근구조체를 포인터로 인스턴하면, 함수 간 전달 시 성능이 좋다. 일반 데스크탑에서는 느끼기 어렵지만, MCU와 같이 저비용 시스템에서는 유용하다.
위의 예시는 기본 문법을 설명하기 위해 작성했으나, 아래 설명과 같이 구조체를 선언할 때 typedef를 이용해야 개발할 때, 편하다.
매번 struct Student라고 쓰기 번거로울 수 있다.
이럴 때는 typedef
를 사용해서 별칭을 만들 수 있다.
typedef struct Student {
char name[20];
int age;
float avg;
} Student;
Student s2; // 이제 struct 생략 가능
공용체
는 구조체
와 비슷하지만, 모든 멤버가 같은 메모리 공간을 공유한다.
즉, 한 번에 하나의 멤버만 유효하다.
union Data {
int i;
float f;
char str[20];
};
union Data d;
d.i = 10;
d.f = 3.14; // 이 시점부터 i는 의미 없음
공용체는 메모리를 아끼는 용도로 사용되며, 실제로는 한 가지 값만 쓸 경우가 많다.
항목 | 구조체 (struct) | 공용체 (union) |
---|---|---|
메모리 사용 | 각 멤버별로 따로 할당 | 가장 큰 멤버 크기만큼만 |
동시 사용 | 모든 멤버를 동시에 사용 가능 | 한 번에 하나만 사용 가능 |
용도 | 데이터 묶음, 일반적인 설계용 | 메모리 절약, 특별한 경우 |
예를 들어, 센서 데이터를 받을 때 값이 int일 수도 있고, float일 수도 있는 경우엔 공용체가 유용하다.
구조체 안에 또 다른 구조체를 넣을 수도 있다.
struct Date {
int year, month, day;
};
struct Person {
char name[20];
struct Date birth;
};
이런 식으로 복합적인 데이터 구조를 단계적으로 구성할 수 있다.
구조체와 공용체는 단순 변수로는 표현하기 어려운 현실 세계의 데이터를 다루는 데 꼭 필요한 도구다.
특히 구조체는 C 기반 시스템 설계, 파일 저장 포맷, 네트워크 프로토콜 등 거의 모든 영역에서 사용된다.
초기에는 구조체만 익히면 충분하고, 공용체는 메모리 절약 목적으로 필요한 상황에서 사용하는 걸 추천한다.
@nullvuild