2025. 2. 24. 12:11ㆍ프로그래밍 언어/C
13.2 공용체 (union)
C 언어에서 공용체(Union) 는 구조체(Structure)와 유사하지만, 하나의 메모리 공간을 공유하는 데이터 타입입니다.
공용체를 사용하면 서로 다른 데이터를 같은 메모리 공간에서 저장할 수 있어 메모리 사용을 최적화할 수 있습니다.
1. 공용체(union)란?
📌 공용체(union)는 구조체와 문법이 유사하지만, 모든 멤버가 동일한 메모리 공간을 공유한다는 점이 다릅니다.
즉, 하나의 변수만 유효하며, 마지막으로 저장된 값만 유지됩니다.
1.1 공용체 선언
📌 기본 문법
union 공용체이름 {
자료형 변수1;
자료형 변수2;
...
};
📌 공용체 선언 예제
#include <stdio.h>
// 공용체 선언
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10; // 정수 값 저장
printf("data.i: %d\n", data.i);
data.f = 3.14; // 실수 값 저장 (이전 값이 덮어쓰기됨)
printf("data.f: %.2f\n", data.f);
sprintf(data.str, "Hello"); // 문자열 저장 (이전 값이 덮어쓰기됨)
printf("data.str: %s\n", data.str);
// 이전에 저장된 값들은 손실됨
printf("data.i: %d (손실됨)\n", data.i);
printf("data.f: %.2f (손실됨)\n", data.f);
return 0;
}
출력 결과
data.i: 10
data.f: 3.14
data.str: Hello
data.i: 1333788675 (손실됨)
data.f: 0.00 (손실됨)
📌 설명
- data.i = 10; → 정수를 저장.
- data.f = 3.14; → 이전 정수 값이 손실됨.
- data.str = "Hello"; → 이전 실수 값이 손실됨.
- 공용체의 멤버는 동시에 하나의 값만 저장 가능하며, 마지막으로 저장된 값만 유지됨.
✅ 공용체는 메모리를 절약할 수 있지만, 하나의 멤버만 유지되므로 주의가 필요함!
2. 구조체와 공용체의 차이
비교 항목 | 구조체(struct) | 공용체(union) |
메모리 사용 방식 | 각 멤버가 개별적인 메모리 공간을 가짐 | 모든 멤버가 하나의 메모리 공간을 공유 |
메모리 크기 | 모든 멤버 크기의 합 | 가장 큰 멤버의 크기 |
동시에 저장 가능? | 모든 멤버를 동시에 저장 가능 | 한 번에 하나의 값만 저장 가능 (이전 값은 손실됨) |
데이터 보존 | 모든 멤버의 값이 유지됨 | 마지막으로 저장된 값만 유지됨 |
사용 목적 | 여러 개의 데이터 필드를 함께 사용해야 하는 경우 | 서로 다른 데이터 타입을 하나의 메모리에서 저장해야 하는 경우 (메모리 절약) |
예제 사용 | 학생 정보 저장 (이름, 나이, 성적) | 여러 타입의 값을 하나의 변수에서 다뤄야 할 때 (예: 네트워크 패킷) |
2.1 구조체 vs 공용체 예제
📌 구조체(struct)는 모든 멤버를 동시에 저장 가능
#include <stdio.h>
// 구조체 선언
struct DataStruct {
int i;
float f;
char str[20];
};
int main() {
struct DataStruct data = {10, 3.14, "Hello"};
printf("data.i: %d\n", data.i);
printf("data.f: %.2f\n", data.f);
printf("data.str: %s\n", data.str);
return 0;
}
출력 결과
data.i: 10
data.f: 3.14
data.str: Hello
📌 설명
- 구조체는 모든 멤버를 동시에 저장할 수 있어 각 값이 유지됨.
✅ 구조체는 모든 데이터를 독립적으로 저장 가능하므로 데이터를 보존해야 할 경우 유리함.
📌 공용체(union)는 하나의 값만 유지됨
#include <stdio.h>
// 공용체 선언
union DataUnion {
int i;
float f;
char str[20];
};
int main() {
union DataUnion data;
data.i = 10;
printf("data.i: %d\n", data.i);
data.f = 3.14;
printf("data.f: %.2f\n", data.f);
sprintf(data.str, "Hello");
printf("data.str: %s\n", data.str);
printf("data.i: %d (손실됨)\n", data.i);
printf("data.f: %.2f (손실됨)\n", data.f);
return 0;
}
출력 결과
data.i: 10
data.f: 3.14
data.str: Hello
data.i: 1333788675 (손실됨)
data.f: 0.00 (손실됨)
📌 설명
- 공용체는 하나의 멤버만 저장 가능하며, 이전 값은 손실됨.
✅ 공용체는 메모리를 절약할 수 있지만, 하나의 데이터만 유지되므로 주의가 필요함.
3. 공용체 사용 사례
공용체는 메모리 사용을 최소화해야 하는 경우에 유용합니다.
예를 들어, 네트워크 프로토콜, 데이터 패킷 처리, 변수를 다르게 해석해야 하는 경우에 사용됩니다.
3.1 네트워크 패킷 처리
#include <stdio.h>
union Packet {
int intData;
float floatData;
char str[20];
};
int main() {
union Packet packet;
packet.intData = 100; // 정수 데이터 저장
printf("정수 데이터: %d\n", packet.intData);
packet.floatData = 10.5; // 실수 데이터 저장 (이전 데이터 손실됨)
printf("실수 데이터: %.2f\n", packet.floatData);
return 0;
}
📌 설명
- 같은 메모리 공간을 정수(intData) 또는 실수(floatData)로 해석.
- 네트워크 데이터나 센서 데이터처럼 다양한 타입을 다룰 때 유용.
✅ 공용체를 사용하면 데이터 변환 없이 직접 타입을 변경 가능!
4. 정리
개념 | 구조체(struct) | 공용체(union) |
메모리 사용 | 모든 멤버가 각각 메모리를 가짐 | 모든 멤버가 하나의 메모리를 공유 |
저장 가능한 값 | 모든 멤버 값을 동시에 유지 | 하나의 값만 유지 (이전 값 손실) |
메모리 크기 | 모든 멤버 크기의 합 | 가장 큰 멤버의 크기 |
사용 목적 | 여러 데이터를 함께 저장해야 할 때 | 하나의 공간에서 여러 데이터를 저장해야 할 때 (메모리 절약) |
📌 구조체는 모든 멤버를 동시에 저장 가능하며 데이터 보존이 필요할 때 사용
📌 공용체는 메모리를 공유하여 하나의 값만 유지하며, 메모리를 절약할 때 유용
📌 공용체는 네트워크 패킷, 하드웨어 레지스터, 데이터 변환 등에 활용됨
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 초급 - 14장: 예제 프로젝트 및 실습 (14.2 학생 성적 관리 프로그램) (0) | 2025.02.25 |
---|---|
C언어 초급 - 14장: 예제 프로젝트 및 실습 (14.1 계산기 프로그램 만들기) (0) | 2025.02.24 |
C언어 초급 - 13장: 구조체와 공용체 (13.1 구조체 (struct)) (0) | 2025.02.24 |
C언어 초급 - 12장: 파일 입출력 (12.3 바이너리 파일 읽기/쓰기) (0) | 2025.02.24 |
C언어 초급 - 12장: 파일 입출력 (12.2 텍스트 파일 읽기/쓰기) (0) | 2025.02.24 |