C언어에서 구조체(structure)와 공용체(union)는 서로 다른 자료형의 데이터를 하나의 이름으로 묶어 관리할 수 있게 해주는 사용자 정의 자료형입니다. 두 개념은 선언 문법이 매우 비슷해 혼동하기 쉽지만, 메모리 할당 방식과 사용 목적에서 본질적인 차이가 있습니다. 아래 표에서 항목별로 자세히 비교해 보겠습니다.
구조체와 공용체의 차이점 비교표
| 번호 | 구조체 (Structure) | 공용체 (Union) |
|---|---|---|
| 1 | 정의 서로 다른 자료형의 데이터들을 하나의 이름으로 그룹화한 이질적(heterogeneous) 데이터 집합입니다. | 정의 서로 다른 자료형의 여러 변수가 하나의 메모리 공간을 공유하는 자료형입니다. |
| 2 | 문법struct 태그이름 { | 문법union 태그이름 { |
| 3 | 선언 예시struct sample { | 선언 예시union sample { |
| 4 | 키워드 – struct | 키워드 – union |
| 5 | 메모리 할당 모든 멤버에게 각각 독립적인 메모리가 할당되며, 전체 크기는 각 멤버 크기의 합입니다. (위 예시 기준 7바이트) | 메모리 할당 모든 멤버가 하나의 메모리를 공유하며, 전체 크기는 가장 큰 멤버의 크기와 같습니다. (위 예시 기준 4바이트) |
| 6 | 특정 시점에도 모든 멤버가 동시에 메모리에 존재하므로, 여러 값을 함께 저장·유지해야 할 때 적합합니다. | 특정 시점에는 단 하나의 멤버만 유효하게 존재하며, 마지막에 대입한 값으로 덮어써집니다. |
구조체 예제 프로그램
다음은 구조체의 메모리 크기를 확인하는 C 프로그램입니다.
#include <stdio.h>
struct size {
double a; // 8바이트
int b; // 4바이트
char c; // 1바이트
float d; // 4바이트
};
int main() {
printf("%ld", sizeof(struct size));
return 0;
}
실행 결과
24
멤버 크기를 단순히 더하면 17바이트지만, 컴파일러가 자료형 정렬(alignment)을 위해 패딩(padding)을 삽입하기 때문에 실제 크기는 24바이트가 됩니다.
공용체 예제 프로그램
다음은 공용체의 메모리 크기를 확인하는 C 프로그램입니다.
#include <stdio.h>
union size {
double a; // 8바이트
int b; // 4바이트
char c; // 1바이트
float d; // 4바이트
};
int main() {
printf("%ld", sizeof(union size));
return 0;
}
실행 결과
8
공용체는 모든 멤버가 같은 메모리를 공유하므로, 가장 큰 멤버인 double(8바이트)의 크기가 곧 공용체 전체 크기가 됩니다.
핵심 정리
- 구조체: 각 멤버가 독립된 메모리를 가지며, 전체 크기는 멤버 크기의 합(패딩 포함)입니다.
- 공용체: 모든 멤버가 하나의 메모리를 공유하며, 전체 크기는 가장 큰 멤버의 크기입니다.
- 활용: 구조체는 학생 정보처럼 여러 속성을 동시에 저장할 때, 공용체는 같은 메모리를 상황에 따라 다른 자료형으로 해석해야 할 때 유용합니다.