enum과 typedef는 둘 다 이름을 붙이지만 하는 일은 다릅니다. enum은 값 집합을 만들고, typedef는 타입 표기를 줄입니다.
- 상태 코드에 숫자를 그대로 두는 것이 불편하다
typedef struct ...와typedef enum ...이 왜 자주 같이 나오는지 정리하고 싶다- 두 키워드를 같이 써도 각각 역할이 섞이지 않게 보고 싶다
숏컷 코드
c
typedef enum {
STATUS_OK,
STATUS_WARN,
STATUS_ERROR
} Status;문법
enum은 이름 있는 정수 상수 묶음이고, typedef는 기존 타입에 별칭을 붙이는 문법입니다.
c
enum Color {
COLOR_RED,
COLOR_GREEN,
COLOR_BLUE
};
typedef unsigned char byte;둘을 같이 쓰면 enum으로 값 집합을 만들고, typedef로 타입 이름을 짧게 만들 수 있습니다.
c
typedef enum {
MODE_READ,
MODE_WRITE
} Mode;역할 구분
enum이 유용한 순간은 매직 넘버를 상태 이름으로 치울 때입니다.
c
if (state == STATUS_ERROR) {
fprintf(stderr, "error\n");
}반면 typedef는 타입 문장을 짧게 만들어 읽기 비용을 줄일 때 유용합니다.
c
typedef struct {
int x;
int y;
} Point;즉 이 카드에서 같이 봐야 하는 것은:
- 값 자체에 이름을 붙일 것인가:
enum - 타입 표기를 줄일 것인가:
typedef
체크포인트
c
switch (state) {
case STATUS_OK:
break;
case STATUS_WARN:
break;
case STATUS_ERROR:
break;
}enum은 이름 있는 정수 상수 집합입니다.typedef는 새 타입 체계를 만드는 것이 아니라 기존 타입의 별칭입니다.- 상태, 모드, 방향처럼 값 후보가 정해진 경우
enum이 잘 맞습니다. - 자주 읽는 구조체나 함수 포인터 이름을 줄일 때
typedef가 유용합니다. typedef enum은 값 집합과 짧은 타입 이름이 둘 다 필요할 때 자주 씁니다.
주의할 점
enum을 쓴다고 값 검증이 자동으로 생기지는 않습니다. 내부 표현은 결국 정수라서 외부 입력이나 파일 데이터에서 온 값은 여전히 범위 검사를 직접 해야 합니다.
참고 링크
1 sources