열거형
정의
- enumeration type, enum
- 정수 상수의 집합에 이름을 부여하여, 코드를 읽기 쉽게 만들고 오류를 줄이는 데 사용하는 자료형
- 나열된 순서대로 0부터 시작하는 정수를 뜻한다.
- 나만의 char 자료형으로 비유할 수 있다. char 형도 정수값마다 문자가 매칭되는 것과 같이, enum 또한 정수와 그 정수를 뜻하는 이름이 매칭된다. (비유다.)
- 열거형 변수는 컴파일이 될 때 할당된 정수값으로 치환된다.
열거형 알아보기
기본 사용법
enum이라고 표현한다.(enumeration type)enum 변수명 {값1, 값2 ..};와 같이 표현한다.- enum 의 각 이름에는 0부터 +1씩 증가되는 정수값이 할당된다.
1
2
3
4
5
6
7
8
9
// 사용법
enum sample {ON, OFF, RUNNING};
printf(ON);
>> 0
printf(OFF);
>> 1
printf(RUNNING);
>> 2
특정 값 지정
- 특정 이름에 특정 값을 지정할 수 있다.
- 특정 이름 이후의 이름에는, 특정 값으로부터 +1씩 증가되는 정수값이 할당된다.
1
2
3
4
5
6
7
8
9
10
enum fruit {APPLE, BANANA, CHOCOLATE=10, DOTORI};
printf("%s의 값 = %d\n", "APPLE", APPLE);
>> 0
printf("%s의 값 = %d\n", "BANANA", BANANA);
>> 1
printf("%s의 값 = %d\n", "CHOCOLATE", CHOCOLATE);
>> 10
printf("%s의 값 = %d\n", "DOTORI", DOTORI);
>> 11
할당된 정수값이 충돌하는 경우
- 두 개 이상의 enum 변수에 동일한 정수값을 할당하는 경우, 나중에 선언된 변수만이 유지된다.
1
2
3
4
5
6
7
8
// enum에 할당된 값이 충돌되는 경우
enum ABC {A=1, B=0, C};
printf("%s의 값 = %d\n", "A", A);
>> 출력 없음
printf("%s의 값 = %d\n", "B", B);
>> B의 값 = 0
printf("%s의 값 = %d\n", "C", C);
>> C의 값 = 1
열거형의 크기
- 해당 열거형 그룹 변수에 할당된 정수값 중 가장 큰 정수값을 표현할 수 있는 자료형의 크기로 정해진다. (개수와는 관련 없음)
1
2
3
4
5
6
7
8
9
// size of
enum SMALL_ENUM {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p};
enum BIG_ENUM {q, r, s=50000000000LL};
printf("%s의 size : %d\n", "SMALL_ENUM", sizeof(enum SMALL_ENUM));
>> SMALL_ENUM의 size : 4
printf("%s의 size : %d\n", "BIG_ENUM", sizeof(enum BIG_ENUM));
>> BIG_ENUM의 size : 8
사용하는 이유
- 코드성으로 관리하는 데이터에 대해 쉽게 표현할 수 있다.
- 이에 따라 코드를 읽기 쉬워지며, 코드를 잘못 작성할 확률도 줄어든다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 예시 : 로그레벨
enum LOG_LEVEL {
DEBUG, // -- 0
INFO=10, // -- 10
WARNING=20, // -- 20
ERROR=30 // -- 30
};
void logging_warn(int log_level_in, char* message){
if (log_level_in >= WARNING){
printf("[WARNING] %s", message);
}
}
void logging_test(){
int log_level_custom = INFO;
logging_warn(log_level_custom, "INFO 테스트 메시지입니다.");
log_level_custom = WARNING;
logging_warn(log_level_custom, "WARNING 테스트 메시지입니다.");
}
1
2
# 출력
[WARNING] WARNING 테스트 메시지입니다.
열거형 매핑테이블 만들기
- 특정 enum에 대한 이름값이 궁금할 경우, 별도 매핑테이블을 만들어줘야 한다.
1
2
3
4
5
6
7
8
9
10
enum TAKE_OUT_YN {TAKEOUT=1, FOR_HERE=0};
const char* take_out_array[] = {
"TAKEOUT",
"FOR_HERE"
};
int idx = 0;
printf("%d번 인덱스의 이름값 : %s", idx, take_out_array[idx]);
>> 0번 인덱스의 이름값 : TAKEOUTA의 값 = 1
Reference
C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)
Comments