union은 여러 값을 동시에 담는 구조가 아니라, 같은 메모리를 다른 타입 해석으로 공유하는 구조입니다.
struct와union차이를 다시 확인하고 싶다- 메모리를 아끼기 위해
union을 써도 되는지 판단하고 싶다 - tagged union 패턴을 어떻게 읽는지 정리하고 싶다
숏컷 코드
c
union Value {
int i;
float f;
};문법
union은 모든 멤버가 같은 시작 주소를 공유합니다. 그래서 struct처럼 여러 필드가 동시에 존재하는 구조가 아닙니다.
c
union Value {
int i;
float f;
char bytes[4];
};실전에서는 보통 현재 활성 멤버를 알려 주는 태그를 같이 둡니다.
c
typedef enum {
VAL_INT,
VAL_FLOAT,
VAL_STRING
} ValueType;
typedef struct {
ValueType type;
union {
int i;
float f;
const char *s;
} data;
} Value;이 패턴의 핵심은 type이 "현재 무엇이 들어 있는가"를 알려준다는 점입니다.
갈리는 기준
- 동시에 여러 필드가 모두 필요하면
struct - 여러 타입 중 하나만 필요하면
union
즉 union의 핵심 이유는 메모리 공유입니다. 단순히 타입을 묶고 싶다는 이유만으로는 보통 struct가 더 자연스럽습니다.
체크포인트
union은 여러 멤버가 같은 메모리 시작 위치를 공유합니다.- 한 시점에 의미 있는 멤버는 보통 하나입니다.
- 현재 유효한 멤버를 코드가 어떻게 보장하는지 같이 봐야 합니다.
- 실전에서는
enum + union형태의 tagged union이 가장 안전한 패턴입니다. - 동시에 여러 필드가 다 필요하면
struct가 맞습니다.
주의할 점
union은 메모리를 아끼는 대신 상태 추적 책임을 개발자에게 넘깁니다. 어떤 멤버가 현재 유효한지 코드로 보장되지 않으면, 읽는 쪽이 조용히 잘못된 해석을 하게 됩니다.
참고 링크
1 sources