728x90
C 언어에서 구조체(struct)와 공용체(union)는 데이터를 묶어서 저장하는데 사용하는 중요한 자료형입니다. 이 두 개념은 비슷해 보이지만, 동작 원리와 메모리 사용 방식에서 큰 차이가 있습니다.
1. 구조체(struct)란?
구조체는 여러 개의 데이터를 하나의 묶음으로 관리할 수 있는 사용자 정의 자료형입니다. 구조체의 각 멤버는 서로 독립된 메모리 공간을 가지며, 동시에 접근할 수 있습니다.
특징
- 각 멤버는 서로 다른 데이터 타입을 가질 수 있습니다.
- 각 멤버는 고유한 메모리 공간을 차지합니다.
- 총 메모리 크기는 모든 멤버의 크기의 합입니다.
구조체 예제
#include <stdio.h>
struct Student {
int id;
float grade;
char name[20];
};
int main() {
struct Student s1 = {1, 95.5, "Alice"};
printf("ID: %d, Grade: %.2f, Name: %s\n", s1.id, s1.grade, s1.name);
return 0;
}
출력 결과
ID: 1, Grade: 95.50, Name: Alice
2. 공용체(union)란?
공용체는 구조체와 비슷하게 여러 데이터를 하나로 묶습니다. 하지만 공용체의 모든 멤버는 하나의 메모리 공간을 공유하며, 한 번에 하나의 멤버만 저장할 수 있습니다.
특징
- 모든 멤버가 같은 메모리 공간을 공유합니다.
- 총 메모리 크기는 가장 큰 멤버의 크기입니다.
- 한 멤버에 값을 저장하면 다른 멤버의 값이 덮어씌워질 수 있습니다.
공용체 예제
#include <stdio.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10;
printf("Integer: %d\n", data.i);
data.f = 22.5;
printf("Float: %.2f\n", data.f);
sprintf(data.str, "Hello");
printf("String: %s\n", data.str);
// 이전 값들이 덮어씌워짐
printf("Integer after String: %d\n", data.i);
return 0;
}
출력 결과
Integer: 10
Float: 22.50
String: Hello
Integer after String: 1819043144 // 덮어씌워짐
3. 구조체와 공용체의 차이점
특징 |
구조체(struct) | 공용체(union) |
메모리 사용 | 모든 멤버가 각자의 메모리 공간을 사용 | 모든 멤버가 하나의 메모리 공간을 공유 |
메모리 크기 | 멤버 크기의 총합 | 가장 큰 멤버의 크기 |
값 유지 | 모든 멤버가 독립적으로 값을 유지 | 한 멤버의 값을 저장하면 다른 멤버의 값이 덮어씌워짐 |
사용 목적 | 여러 데이터를 동시에 저장하고 사용할 때 | 데이터를 효율적으로 저장해야 하거나, 한 번에 하나의 값만 필요할 때 |
초기화 및 접근 | 모든 멤버를 개별적으로 초기화 및 접근 가능 | 한 번에 하나의 멤버만 초기화 및 접근 가능 |
4. 구조체와 공용체의 활용 사례
구조체의 활용 사례
- 데이터 모델링: 학생, 직원, 제품 등 여러 속성을 가진 데이터를 표현.
- 네트워크 프로그래밍: 패킷 헤더와 같은 복잡한 데이터를 표현.
구조체 예제: 학생 데이터 모델링
struct Student {
int id;
char name[50];
float grade;
};
공용체의 활용 사례
- 메모리 절약: 메모리 사용을 최적화해야 하는 임베디드 시스템.
- 다른 데이터 타입 처리: 같은 데이터를 여러 형식으로 해석할 때.
공용체 예제: 데이터 변환
union Converter {
int i;
float f;
char bytes[4];
};
5. 요약
- 구조체(struct): 여러 데이터를 동시에 저장하며 독립적으로 관리할 때 사용합니다.
- 공용체(union): 메모리를 절약하거나 한 번에 하나의 값만 필요할 때 유용합니다.
구조체와 공용체는 메모리 사용과 동작 원리에서 차이가 있지만, 각각의 강점이 있는 만큼 적절히 사용하면 효율적인 프로그램을 설계할 수 있습니다.
728x90
'C언어' 카테고리의 다른 글
[C언어] void 포인터 (0) | 2024.11.23 |
---|---|
[C언어] C언어에서 포인터의 장점과 활용 방법 (0) | 2024.11.17 |
[C언어] Call by Value와 Call by Reference (1) | 2024.11.16 |
[C언어] 동적할당/malloc 함수 (4) | 2024.10.16 |
[C언어] 불리언 타입이란?(boolean, bool type) (0) | 2024.10.07 |