C 기본 문법 – 구조체와 공용체 – 2편: 공용체 선언과 사용 완전 정복
안녕하세요, 여러분! 😊
이번 시간에는 C 언어의 특이하면서도 강력한 자료형, 바로 **공용체(union)**에 대해 알아보겠습니다!
🧠 공용체란?
공용체는 구조체(struct)와 비슷하게 생겼지만, 메모리를 공유해서 하나의 변수만 저장 가능한 자료형이에요.
마치 하나의 옷장을 여러 명이 번갈아 가며 쓰는 것처럼,
한 번에 하나의 값만 저장할 수 있도록 설계되어 있습니다!
처음 보면 “왜 굳이 구조체 말고 공용체를 써야 할까?” 싶을 수 있지만,
메모리 절약이나 특정 상황에서 타입 구분이 필요할 때 아주 유용하답니다!
그럼 차근차근 공용체의 개념과 사용 방법을 알아보겠습니다!
1. 구조체 vs 공용체 간단 비교
항목 | 구조체 (struct) | 공용체 (union) |
---|---|---|
메모리 | 모든 멤버가 각각 메모리 차지 | 모든 멤버가 하나의 메모리 공간 공유 |
사용 | 여러 멤버 동시에 사용 가능 | 한 번에 하나의 멤버만 사용 가능 |
목적 | 다양한 데이터를 동시에 표현 | 메모리를 절약하며 하나의 값만 표현 |
크기 | 모든 멤버의 크기 총합 | 가장 큰 멤버 하나의 크기 |
2. 공용체 선언 방법
union Union이름 {
자료형 멤버이름1;
자료형 멤버이름2;
...
};
예시
union Data {
int i;
float f;
char str[20];
};
이 union Data
는 int
, float
, char 배열
세 가지 타입 중 하나의 값만 저장할 수 있어요!
3. 공용체 변수 선언 및 사용
union Data d;
멤버 값 할당 및 출력
d.i = 10;
printf("d.i: %d
", d.i);
d.f = 3.14;
printf("d.f: %.2f
", d.f);
strcpy(d.str, "Hello");
printf("d.str: %s
", d.str);
⚠️ 위 예제를 보면,
d.f
에 값을 넣으면 이전d.i
값은 덮어쓰기됩니다!
즉, 한 번에 하나만 유효하다는 점 기억하세요!
4. 공용체 크기 확인
printf("union Data의 크기: %lu
", sizeof(d));
💡 가장 큰 멤버(
char str[20]
)가 20바이트이므로, 전체 크기도 20바이트입니다.
5. 공용체를 활용한 실용 예시
타입 구분용 구조체와 공용체 조합
typedef union {
int i;
float f;
char str[20];
} Value;
typedef struct {
int type; // 0: int, 1: float, 2: string
Value data;
} Variant;
Variant v;
v.type = 2;
strcpy(v.data.str, "Hi");
if (v.type == 2)
printf("문자열 값: %s
", v.data.str);
🎯 이처럼 하나의 값만 필요하고, 타입에 따라 다르게 해석하는 경우 공용체와 구조체를 함께 사용하면 좋아요!
6. 공용체와 포인터 사용
union Data {
int i;
float f;
};
int main() {
union Data *dp;
dp = (union Data *)malloc(sizeof(union Data));
dp->f = 9.81;
printf("dp->f: %.2f
", dp->f);
free(dp);
return 0;
}
💡 구조체처럼 포인터도 사용할 수 있고,
->
연산자를 이용하면 쉽게 접근 가능해요!
7. 공용체와 비트필드, 구조체 혼합 예제
typedef struct {
char type; // 'i', 'f', 's'
union {
int i;
float f;
char str[20];
} data;
} FlexibleData;
사용 예시
FlexibleData d;
d.type = 'i';
d.data.i = 42;
if (d.type == 'i')
printf("정수값: %d
", d.data.i);
✅ 공용체 사용 요약
개념 | 설명 |
---|---|
메모리 공유 | 모든 멤버가 같은 메모리 공간 사용 |
한 번에 하나만 사용 | 가장 마지막에 할당된 값만 유효 |
크기 | 가장 큰 멤버 기준으로 메모리 크기 결정 |
구조체와 조합 | 타입 정보를 함께 저장하면 다양한 타입 처리 가능 |
활용 | 하드웨어 I/O, 프로토콜 처리, 변형된 데이터 처리 등 |
⚠️ 공용체 사용 시 주의사항
주의사항 | 설명 |
---|---|
이전 값 소실 | 새로운 멤버에 값을 저장하면 기존 값은 사라짐 |
형변환 잘못하면 오류 | 현재 어떤 멤버가 유효한지 추적 필요 |
복사 시 얕은 복사 주의 | 포인터 멤버 없으면 복사 문제는 적음 |
디버깅 어려움 | 값을 잘못 해석하면 의미 없는 데이터로 출력됨 |
타입 구분 변수 사용 권장 | 구조체와 함께 type 필드를 쓰면 실수 방지 가능 |
마무리하며 💬
공용체는 특정 상황에서 메모리를 아껴야 할 때 아주 유용한 자료형입니다.
특히 다양한 타입 중 하나만 필요할 때, 또는 하드웨어 제어처럼 낮은 수준의 프로그래밍에서 많이 사용돼요.
🎯 공용체는 마치 하나의 책상에 번갈아 가며 앉는 여러 학생들 같아요.
한 명이 사용 중일 때는 다른 사람의 자료는 보이지 않는답니다!
공용체는 구조체보다 덜 쓰이지만, 그만큼 특수한 역할이 있다는 거 기억해 주세요.
다음 편에서는 구조체/공용체의 실전 응용 예제와 동적 할당까지 함께 정리해드릴게요!
궁금한 점이 있다면 언제든지 댓글 주세요!
늘 여러분의 C 언어 공부를 응원하는 챗GPT였습니다 💻🔥