C 구조체 vs 공용체: 실전 가이드
구조체(Structure)란?
구조체는 논리적으로 관련된 서로 다른 타입의 데이터 항목들을 단일 단위로 그룹화하는 C의 사용자 정의 데이터 타입입니다. 각 멤버는 고유한 연속 메모리 위치를 차지하므로 구조체는 여러 값을 동시에 보유할 수 있습니다.
예: 이름, 학번, 성적을 한 변수 이름으로 저장하는 학생 레코드.
공용체(Union)란?
공용체도 사용자 정의 타입이지만 모든 멤버가 같은 메모리 공간을 공유합니다. 공용체 크기는 가장 큰 멤버 크기와 같습니다. 이 특징은 한 번에 한 멤버만 필요할 때 메모리 제약 상황에서 이상적입니다.
구조체 선언
struct Student {
char name[60];
int roll_no;
float marks;
};
struct 키워드와 닫는 중괄호 뒤 세미콜론에 주의.
예제: 구조체 사용
#include <stdio.h>
struct Student {
char name[60];
int roll_no;
float marks;
} sdt;
int main(void) {
printf("Enter the following information:\n");
printf("Student name: ");
fgets(sdt.name, sizeof(sdt.name), stdin);
printf("Roll number: ");
scanf("%d", &sdt.roll_no);
printf("Marks: ");
scanf("%f", &sdt.marks);
printf("\nEntered data:\n");
printf("Name: %s", sdt.name);
printf("Roll number: %d\n", sdt.roll_no);
printf("Marks: %.1f\n", sdt.marks);
return 0;
}
출력 (예시):
Enter the following information:
Student name: James
Roll number: 21
Marks: 67
Entered data:
Name: James
Roll number: 21
Marks: 67.0
공용체 선언
union Item {
int x;
float y;
char ch;
};
예제: 공용체 사용
#include <stdio.h>
union Item {
int x;
float y;
char ch;
};
int main(void) {
union Item it;
it.x = 12;
it.y = 20.2f;
it.ch = 'a';
printf("x = %d\n", it.x);
printf("y = %f\n", it.y);
printf("ch = %c\n", it.ch);
return 0;
}
모든 멤버가 메모리 공유하므로 ch 설정 시 이전 x, y 값 덮어씀. 마지막으로 저장된 값만 유효.
구조체 vs 공용체
| 특징 | 구조체 | 공용체 |
| 선언 키워드 | struct | union |
| 메모리 레이아웃 | 각 멤버 별도 공간 | 모든 멤버 한 공간 공유 |
| 한 멤버 변경 시 | 다른 멤버 영향 없음 | 다른 멤버 덮어씀 |
| 초기화 | 모든 멤버 동시 초기화 가능 | 첫 번째 멤버만 한 번에 초기화 가능 |
| 전체 크기 | 모든 멤버 크기 합 | 가장 큰 멤버 크기 |
| 일반적 용도 | 다양한 타입 관련 데이터 저장 | 여러 가능 타입 중 하나 저장 |
| 접근 패턴 | 언제든 모든 멤버 접근 | 한 번에 한 멤버만 유효 |
| 가변 배열 지원 | 지원 | 미지원 |
각각 언제 사용하는가
- 구조체: 학생 레코드나 직원 레코드처럼 여러 관련 필드를 동시에 유지해야 할 때
- 공용체: 한 번에 한 타입만 가질 수 있는 값이 여러 타입 가능할 때, 예: 변형 타입 또는 메모리 제약 센서 값
장단점
구조체 장점
- 관련 데이터를 단일 이름으로 그룹화해 가독성 향상
- 전체 레코드를 함수에 쉽게 전달
- 구조체 배열로 여러 레코드 저장 가능
- 가변 길이 데이터 위한 유연 배열 지원
구조체 단점
- 모든 멤버 저장으로 더 많은 메모리 필요
- 구조체 정의 변경 시 코드 전체에 전파
- 깊이 중첩된 구조체로 대형 프로젝트에서 다루기 까다로워질 수 있음
공용체 장점
- 최소 메모리 풋프린트: 가장 큰 멤버 크기만 차지
- 타입 태그나 변형 데이터 구현에 유용
- 타입이 가변적인 단일 값 사용하는 코드 단순화 가능
공용체 단점
- 한 번에 한 멤버만 유효 값 가질 수 있음
- 공유 메모리로 디버깅 어려움
- 가변 배열 사용 불가