C언어는 복합 데이터 타입을 지원하며, 주요한 두 가지가 바로 구조체(struct)와 공용체(union)입니다. 구조체와 공용체의 활용법, 메모리 사용 방식, 예제 코드를 통해 그 차이점을 명확히 이해해 봅시다.
구조체
구조체의 정의 및 사용
구조체(struct)는 다양한 데이터 타입을 하나의 데이터 타입으로 만들 수 있게 해줍니다. 예를 들어, 사람의 정보를 저장할 때, 이름(문자열), 나이(정수), 키(실수) 등을 하나의 구조로 표현할 수 있습니다.
#include <stdio.h>
struct Person {
char name[50];
int age;
float height;
};
int main() {
struct Person person1;
strcpy(person1.name, "Alice");
person1.age = 25;
person1.height = 5.5;
printf("Name: %s\n", person1.name);
printf("Age: %d\n", person1.age);
printf("Height: %.2f\n", person1.height);
return 0;
}
구조체의 메모리 사용 방식
구조체는 각 변수의 메모리 크기를 합한 값을 사용합니다. 예를 들어, 위의 Person 구조체는 문자열(50 bytes), 정수(4 bytes), 실수(4 bytes)로 총 58 bytes의 메모리를 차지하게 됩니다. 다음 그림은 이를 나타낸 것입니다.
| name | age | height |
|---50 bytes---|--4 bytes--|-4 bytes-|
구조체의 장단점
구조체의 주요 장점은 다양한 데이터 타입을 하나의 타입으로서 묶어서 재사용할 수 있다는 점입니다. 그러나 메모리를 절약하는 데에는 효율적이지 않을 수 있습니다.
공용체
공용체의 정의 및 사용
공용체(union)는 모든 멤버 변수가 하나의 메모리 공간을 공유합니다. 즉, 한 변수의 값이 변하면 다른 변수의 값도 함께 변할 수 있습니다.
#include <stdio.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10;
printf("data.i : %d\n", data.i);
data.f = 220.5;
printf("data.f : %.2f\n", data.f);
strcpy(data.str, "C Programming");
printf("data.str : %s\n", data.str);
return 0;
}
공용체의 메모리 사용 방식
공용체는 가장 큰 변수의 메모리 크기만큼의 공간만 차지합니다. 예를 들어, 위의 Data 공용체는 정수(4 bytes), 실수(4 bytes), 문자열(20 bytes) 중 가장 큰 값인 20 bytes만을 사용합니다. 다음 그림은 이를 나타낸 것입니다.
| str |
|------20 bytes------|
공용체의 장단점
공용체의 가장 큰 장점은 메모리를 절약할 수 있다는 점입니다. 그러나 각 변수들이 메모리를 공유하기 때문에 사용 시 주의를 요합니다. 변수를 잘못 사용하면 데이터가 손상될 수 있습니다.
구조체와 공용체 비교
아래 표는 구조체와 공용체의 주요 차이점을 요약합니다.
비교 항목 | 구조체 | 공용체 |
---|---|---|
메모리 사용 | 멤버 변수들의 총합 | 가장 큰 멤버 변수 크기 |
데이터 접근 | 독립적인 멤버 접근 | 공유된 메모리 접근 |
장점 | 독립적 데이터 관리 | 메모리 절약 |
단점 | 메모리 낭비 가능성 | 데이터 손상 가능성 |
구조체와 공용체 선택 기준
어떤 상황에서 구조체를 사용하고, 어떤 상황에서 공용체를 사용해야 할까요? 프로젝트의 용도와 메모리 사용 효율을 고려하여 선택할 수 있습니다.
언제 구조체를 사용할 것인가?
구조체는 각 데이터를 독립적으로 관리하고자 할 때 유용합니다. 다양한 데이터 타입을 포함할 때도 구조체를 사용하는 것이 좋습니다.
언제 공용체를 사용할 것인가?
공용체는 메모리가 제한적인 환경에서 효과적입니다. 하나의 변수만 사용할 길 때, 메모리 절약을 위해 공용체를 사용하는 것이 유리합니다.