C 언어는 동일한 자료형의 데이터뿐만 아니라 서로 다른 자료형의 데이터도 함께 저장할 수 있는 다양한 컨테이너를 제공합니다. 같은 자료형의 데이터를 저장할 때는 배열(Array)을 사용하고, 서로 다른 자료형의 데이터를 하나로 묶어 저장할 때는 구조체(Structure)와 공용체(Union)를 활용합니다.
구조체와 공용체는 모두 서로 다른 자료형의 데이터를 담을 수 있다는 점에서 유사하지만, 메모리 할당 방식과 사용 목적에서 중요한 차이가 있습니다. 이 글에서는 두 개념의 핵심 차이점을 항목별로 자세히 살펴보겠습니다.
1. 정의
구조체(Structure): 서로 다른 자료형의 변수들을 하나의 논리적 단위로 묶기 위해 C 언어에서 제공하는 사용자 정의 자료형입니다. 각 멤버는 독립된 의미를 가지며, 관련된 데이터를 그룹화하는 데 적합합니다.
공용체(Union): 구조체와 마찬가지로 서로 다른 자료형의 변수와 사용자 정의 변수를 함께 담을 수 있는 컨테이너입니다. 다만 모든 멤버가 동일한 메모리 공간을 공유한다는 점이 구조체와 다릅니다.
2. 내부 구현 방식
구조체: 각 멤버에게 별도의 메모리 공간이 할당됩니다. 따라서 모든 멤버가 동시에 자신의 값을 유지할 수 있습니다.
공용체: 멤버 중 가장 큰 크기를 가진 멤버에 맞춰 단 하나의 메모리 공간만 할당되며, 모든 멤버가 이 공간을 공유합니다. 따라서 한 번에 하나의 멤버만 유효한 값을 가질 수 있습니다.
3. 선언 문법
구조체 선언
struct struct_name {
type element1;
type element2;
...
} variable1, variable2, ...;공용체 선언
union u_name {
type element1;
type element2;
...
} variable1, variable2, ...;4. 크기(Size)
구조체: 각 멤버가 독립된 메모리를 가지므로, 구조체의 전체 크기는 모든 멤버 크기의 합과 같거나(메모리 정렬을 위한 패딩 때문에) 그보다 큽니다.
공용체: 모든 멤버가 메모리를 공유하므로, 공용체의 크기는 가장 큰 멤버의 크기와 같습니다.
5. 값 저장 방식
구조체: 각 멤버마다 고유한 메모리 위치가 있으므로, 여러 멤버의 값을 동시에 저장하고 유지할 수 있습니다.
공용체: 하나의 공유 메모리만 사용하므로, 특정 시점에는 하나의 멤버 값만 유효합니다. 새로운 멤버에 값을 할당하면 기존에 저장된 값은 덮어써집니다.
6. 초기화
구조체: 여러 멤버를 동시에 초기화할 수 있습니다.
공용체: 한 번에 첫 번째 멤버만 초기화할 수 있습니다.
핵심 차이점 요약 비교표
| 번호 | 구분 | 구조체(Structure) | 공용체(Union) |
|---|---|---|---|
| 1 | 정의 | 서로 다른 자료형의 변수와 사용자 정의 변수를 하나의 단위로 묶는 컨테이너 | 서로 다른 자료형의 변수를 담되, 멤버 간 메모리를 공유하는 컨테이너 |
| 2 | 내부 구현 | 각 멤버에게 별도의 메모리 공간이 할당됨 | 가장 큰 멤버 크기만큼의 단일 메모리를 모든 멤버가 공유함 |
| 3 | 선언 키워드 | struct | union |
| 4 | 크기 | 모든 멤버 크기의 합과 같거나 그보다 큼 | 가장 큰 멤버의 크기와 같음 |
| 5 | 값 저장 | 여러 멤버의 값을 동시에 저장 가능 | 한 번에 하나의 멤버 값만 유효 |
| 6 | 초기화 | 여러 멤버를 동시에 초기화 가능 | 한 번에 첫 번째 멤버만 초기화 가능 |
실습 예제 코드
#include <stdio.h>
struct Student {
int id;
float score;
};
union Data {
int i;
float f;
};
int main() {
struct Student s = {101, 95.5f};
union Data d;
d.i = 10;
printf("구조체 크기: %zu 바이트\n", sizeof(s));
printf("공용체 크기: %zu 바이트\n", sizeof(d));
return 0;
}
위 예제를 실행하면 구조체는 int와 float 크기의 합(8바이트)이 출력되고, 공용체는 더 큰 멤버인 float 크기(4바이트)가 출력되는 것을 확인할 수 있습니다.
어떤 상황에서 무엇을 사용해야 할까?
구조체는 학생 정보(이름, 학번, 성적)처럼 여러 데이터를 동시에 유지해야 하는 경우에 적합합니다. 반면 공용체는 메모리 절약이 중요한 임베디드 환경이나, 동일한 메모리를 서로 다른 자료형으로 해석해야 하는 경우(예: 하드웨어 레지스터 접근, 타입 재해석)에 유용하게 활용됩니다.