C 공용체(Union) 완전 이해: 메모리 공유, 타입 펀칭, 실전 활용
공용체(union)는 여러 멤버가 동일한 메모리 공간을 공유하는 타입입니다. 한 시점에 한 멤버만 유효하며, 크기는 가장 큰 멤버 크기로 결정됩니다.
공용체 정의와 크기
union Data {
int i; // 4바이트
float f; // 4바이트
char str[20]; // 20바이트 → 전체 크기 20바이트 (정렬 고려 시 24 가능)
} data;
sizeof(union Data) == 20 (또는 정렬에 따라 24)
멤버 접근과 동작 원리
union Data d;
d.i = 0x41424344; // 정수 저장 (16진수: 'D','C','B','A' 리틀엔디안)
printf("i: %d (0x%X)\n", d.i, d.i);
printf("f: %f\n", d.f); // 같은 비트를 float로 해석 (의미 없는 값)
printf("str: %s\n", d.str); // "ABCD" 출력 (리틀엔디안에서)
d.f = 3.14f;
printf("i: %d\n", d.i); // float 비트 패턴을 int로 해석
핵심: 마지막에 쓴 멤버만 유효
d.i = 10;
d.f = 3.14f;
strcpy(d.str, "Hello");
// 이제 d.str만 유효, d.i와 d.f 값은 손상됨
공용체 vs 구조체
| 특성 | 구조체 (struct) | 공용체 (union) |
| 메모리 | 멤버별 독립 공간 (합 + 패딩) | 공유 공간 (최대 멤버 크기) |
| 동시 사용 | 모든 멤버 동시 유효 | 한 멤버만 유효 |
| 용도 | 레코드, 복합 데이터 | 타입 변환, 메모리 절약, 다형성 |
| 초기화 | 여러 멤버 가능 | 첫 멤버만 초기화 가능 (C99: 지정 초기화자로 아무 멤버나 가능) |
실전 활용 패턴
1. 타입 펀칭 (Type Punning) - 비트 패턴 재해석
union FloatBits {
float f;
uint32_t u;
};
void print_float_bits(float x) {
union FloatBits fb = {.f = x};
printf("0x%08X ", fb.u);
// 부호(1) | 지수(8) | 가수(23)
printf("sign=%d exp=%d mantissa=%06X\n",
(fb.u >> 31) & 1,
(fb.u >> 23) & 0xFF,
fb.u & 0x7FFFFF);
}
※ 엄밀히 C 표준상 UB이나, GCC/Clang/MSVC 등 주요 컴파일러에서 지원 (공용체 타입 펀칭은 흔한 관용구)
2. 태그된 공용체 (Tagged Union) - 수학적 합 타입
enum ValueType { INT_VAL, FLOAT_VAL, STR_VAL };
struct Value {
enum ValueType type;
union {
int i;
float f;
char *s;
} data;
};
void print_value(struct Value *v) {
switch (v->type) {
case INT_VAL: printf("int: %d\n", v->data.i); break;
case FLOAT_VAL: printf("float: %f\n", v->data.f); break;
case STR_VAL: printf("str: %s\n", v->data.s); break;
}
}
3. 하드웨어 레지스터/네트워크 패킷 매핑
// 네트워크 패킷 헤더 (빅엔디안 가정)
union PacketHeader {
struct {
uint16_t version: 4;
uint16_t type: 4;
uint16_t flags: 8;
uint32_t payload_len;
} fields;
uint8_t raw[8]; // 바이트 배열로 직접 접근
};
4. 메모리 절약: 상호 배타적 상태 저장
// 이벤트 시스템: 한 번에 한 종류만 발생
struct Event {
enum { KEY, MOUSE, TIMER } type;
union {
struct { int key; int mods; } key;
struct { int x, y; int button; } mouse;
struct { uint64_t deadline; } timer;
};
};
익명 공용체 (Anonymous Union, C11)
struct Widget {
int id;
union { // 태그 없음, 멤버를 구조체 멤버처럼 직접 접근
int int_val;
float float_val;
char *str_val;
};
};
struct Widget w;
w.int_val = 42; // w.data.int_val 없이 직접 접근
w.float_val = 3.14f; // 이전 값 덮어씀
공용체 초기화 (C99 지정 초기화자)
union Data d1 = { .f = 3.14f }; // f 멤버 초기화
union Data d2 = { .str = "Hello" }; // str 멤버 초기화
union Data d3 = { 0 }; // 첫 멤버(i) 0 초기화, 나머지도 0
정렬과 크기
공용체 정렬 요구사항 = 가장 엄격한 멤버의 정렬
크기 = max(멤버 크기들) 올림(정렬 단위)
_Alignof(union Type)로 정렬 확인 (C11)
모범 사례와 주의사항
항상 태그 필드와 함께 사용하여 현재 유효 멤버 추적
타입 펀칭 시 memcpy 또는 union 사용 (컴파일러 확장 의존)
포인터 멤버 포함 시 소유권/수명 관리 명확히
비트필드와 공용체 조합 시 구현 의존성 주의
직렬화/역직렬화 시 엔디언 처리 필수
C 언어
-
마이크로프로세서: 저장 프로그램 컴퓨팅의 진화
-
종합 오피앰프 데이터: National Semiconductor & CA3130 데이터시트
-
C++ 데이터 타입 이해하기: 기초, 수정자, 모범 사례
-
C 데이터 타입 완벽 해설: int, float, char 등 완전 가이드
-
C 공용체(Union) 완벽 이해: 정의, 사용법, 구조체와의 비교
-
파이썬 데이터 타입 마스터하기: 실전 가이드
-
C 데이터 타입 완전 정복: 정수, 실수, void, 파생 타입과 sizeof
-
C++ 데이터 구조: 배열, 구조체, 포인터로 효율적인 프로그램 만들기
-
C++ 데이터 추상화 마스터하기: 인터페이스와 구현 분리로 설계 단순화
-
C++ 데이터 캡슐화: 코드 보호의 핵심 원리
-
강건한 AI 시스템 구축: 산업용 알고리즘 오류 방지
머신 비전 카메라 결함, 보정되지 않은 센서, 예측 불가능한 그림자는 산업용 AI 시스템에서 잠재적으로 비용이 많이 들고 위험한 오류로 이어질 수 있습니다. 그러나 연구자들은 오류 방지 알고리즘과 오류 확률을 줄일 수 있는 간단한 조치들을 개발하고 있습니다.
인공지능은 기본 퍼셉트론 인공신경망을 훨씬 넘어 진화했지만, 오류는 여전히 문제입니다. Pixabay 제공 이미지
산업용 인공지능 응용
로봇 플랫폼, 자재 취급, 포장, 머신 텐딩, 조립, 검사, BAS(빌딩 자동화 시스템) 등 AI(인공지능)의 산업
-
데이터 기반 제조로 미국 산업 성장 견인하기
가지고 있는 것을 활용해 앞으로 일어날 일을 만들어내기
매뉴팩처링 USA(Maufacturing USA) 기관장 이사회의 의장으로서, 저는 미국 첨단 제조의 트렌드에 대해 자주 질문을 받습니다. 이런 질문을 받으면 저는 첨단 제조를 가능한 한 넓게 생각하려 노력합니다. 대다수 제조업체에 혜택을 줄 수 있는 기술뿐만 아니라, 미국 제조 부문 전반에 이득이 될 기술을 고려합니다.
로봇공학이 제공하는 자동화나 무수한 응용 분야를 제공하는 적층 제조 등 일부 기술이 대다수 제조업체에 혜택을 줄 수 있다는 데는 의심의 여지가 없습니다. 하지