null
vuild_
Nodes
Flows
Hubs
Login
MENU
Notifications
Login
☆ Star
union과 enum
#c
#c-lang
#intermediate
#union
#enum
@devpc
|
2026-03-29 12:57:39
|
GET /api/v1/nodes/51?nv=2
History:
v2 (2026-03-29) (Latest)
v1 (2026-03-29)
0
Views
5
Calls
# union과 enum ## union — 메모리 공유 `union`은 같은 메모리 공간을 여러 타입으로 해석할 수 있는 타입입니다. 모든 멤버가 **하나의 메모리 위치를 공유**합니다. ```c union Data { int i; float f; char c; }; ``` ### struct vs union 크기 비교 ```c struct S { int i; float f; char c; }; union U { int i; float f; char c; }; printf("%zu\n", sizeof(struct S)); // 12 (패딩 포함) printf("%zu\n", sizeof(union U)); // 4 (가장 큰 멤버 크기) ``` ``` union 메모리 레이아웃: ┌────────────────┐ │ i (4바이트) │ │ f (4바이트) │ ← 같은 공간 공유 │ c (1바이트) │ └────────────────┘ 크기: 4바이트 ``` ### union 사용 예시 ```c union Data d; d.i = 42; printf("i = %d\n", d.i); // 42 d.f = 3.14f; printf("f = %.2f\n", d.f); // 3.14 printf("i = %d\n", d.i); // ⚠️ 쓰레기값 — f를 저장한 후 i는 유효하지 않음 ``` > `union`에서는 **마지막으로 쓴 멤버만 유효**합니다. --- ## union의 실제 활용 — Tagged Union 어떤 멤버가 유효한지 `enum`으로 태그합니다. ```c typedef enum { TYPE_INT, TYPE_FLOAT, TYPE_CHAR } DataType; typedef struct { DataType type; union { int i; float f; char c; } value; } Variant; void print_variant(const Variant *v) { switch (v->type) { case TYPE_INT: printf("int: %d\n", v->value.i); break; case TYPE_FLOAT: printf("float: %.2f\n", v->value.f); break; case TYPE_CHAR: printf("char: %c\n", v->value.c); break; } } int main(void) { Variant v1 = { .type = TYPE_INT, .value.i = 42 }; Variant v2 = { .type = TYPE_FLOAT, .value.f = 3.14f }; print_variant(&v1); print_variant(&v2); return 0; } ``` --- ## enum — 상수 집합 관련된 정수 상수에 **의미 있는 이름**을 부여합니다. ```c enum Direction { NORTH, // 0 EAST, // 1 SOUTH, // 2 WEST // 3 }; ``` ### 명시적 값 지정 ```c enum Color { RED = 1, GREEN = 2, BLUE = 4, // 비트 플래그 패턴 }; enum HttpStatus { OK = 200, NOT_FOUND = 404, ERROR = 500, }; ``` ### enum 사용 예시 ```c #include <stdio.h> typedef enum { SUN, MON, TUE, WED, THU, FRI, SAT } Weekday; const char *weekday_name(Weekday d) { const char *names[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; return names[d]; } int main(void) { Weekday today = WED; printf("오늘: %s\n", weekday_name(today)); // 오늘: Wed if (today == WED) { printf("수요일입니다.\n"); } return 0; } ``` --- ## enum vs #define | 구분 | `enum` | `#define` | |------|--------|-----------| | 타입 안정성 | ✅ 타입 있음 | ❌ 단순 텍스트 치환 | | 디버거 표시 | ✅ 이름 보임 | ❌ 숫자만 보임 | | 범위 | 정수만 | 모든 리터럴 | | 자동 증가 | ✅ (0부터) | ❌ 직접 지정 | --- ## 정리 | 개념 | 핵심 | |------|------| | `union` | 모든 멤버가 같은 메모리 공간 공유 | | union 크기 | 가장 큰 멤버 크기 | | 유효 멤버 | 마지막으로 쓴 멤버만 유효 | | Tagged union | enum + union으로 안전한 다형성 구현 | | `enum` | 관련 정수 상수에 이름 부여 | | enum 초기값 | 0부터 자동 증가 (명시적 지정 가능) | ---
// COMMENTS
ON THIS PAGE