숫자로 작성된 상수를 효과적으로 대체하기 위해서 사용되는 방법에는 여러가지가 있습니다.

const int value = 5;
#define MAX_COUNT    10

그러나, 갯수가 많거나 숫자의 많고 적음보다는 구분하기 위한 인덱스 혹은 태그 정도의 의미로 사용할 때에는 enum을 더 많이 사용합니다.

enum {
    WHITE,
    BLACK,
    YELLOW,
    BLUE,
    GREEN,
    MAX_COLOR,
};

이 경우에, WHITE는 0이 되고 그 이후로 BLACK은 1, YELLOW는 2가 되는 것처럼 1씩 자동으로 증가하게 됩니다. 이것은 BLACK가 1이고, YELLOW가 2가 되는 것 자체가 중요한 의미를 가지진 않습니다.

int color_array[MAX_COLOR];
color_array[YELLOW]++;
color_array[GREEN]++;

for( i=0; i<MAX_COLOR; i++)
{
    printf( "%d ", color_array[i] );
}

주로 이와같이 인덱스 역할을 하는데 유용하게 사용되며, 이때에는 YELLOW가 앞이나 뒤에 있더라도 상관은 없습니다.

enum을 이용하여 함수를 실행할 때에도 별다른 차이는 없습니다.
발로 짠 코드를 잠시 보시겠습니다.

void print_color_name( int color )
{
    switch( color )
    {
        case BLACK:    printf("Color is Black\n");    break;
        case YELLOW:    printf("Color is Yellow\n");    break;
        default:    printf("What color is it?\n");    break;         
    }
}

int main(void)
{
    print_color_name( BLACK );
    print_color_name( 2 );
    print_color_name( GREEN );
    return 0;
}

실행결과>
Color is Black
Color is Yellow
What color is it?

대략 이해는 가시죠? BLACK, YELLOW일 경우에는 색상을 알려주고, 그 외에는 무슨 색인지 몰라서 되묻는 문장을 출력합니다.

그런데 이번에는 아래와 같은 코드가 추가되었습니다.

#define NewSM5    1
#define AvanteHD    2
#define Tico          3

print_color_name( AvanteHD );
print_color_name( TRUE );

이럴 경우, 어떻게 출력될까요?

Color is Yellow
Color is Black

이렇게 출력이 됩니다. 의도한 바라면 별 문제안되겠지만, 코딩 실수였는데 정상동작을 하게 되면 나중에 문제점을 찾기 힘들 수 있습니다. BLACK, NewSM5, TRUE 이것을 구분해서 사용할 수 있는 방법이 바로 'typedef enum' 입니다.

typedef enum {
    WHITE,
    BLACK,
    YELLOW,
    BLUE,
    GREEN,
    MAX_COLOR,
} COLOR_TYPE;

void print_color_name(COLOR_TYPE color)
{
    ....
}

이렇게 작성했을 경우, BLACK, YELLOW 등은 COLOR_TYPE라는 데이터형으로 간주됩니다. 그렇기 때문에 print_color_name(TRUE), print_color_name(NewSM5)와 같이 코딩했을 때는 컴파일 에러가 발생됩니다. 데이터형이 다르기 때문이죠. 물론 의도하고자 하는 경우에는 print_color_name((COLOR_TYPE)TRUE)와 같이 형변환을 해서 사용할 수는 있습니다. 코딩실수를 막을 수 있다는 장점이 있는 것이지요.

물론 필수요소는 아니며, 컴파일이나 실행속도상의 문제가 있는 것도 아닙니다. 이런 이유에서 가급적 typedef enum을 쓰는 것을 권장하는 편입니다.

'develop' 카테고리의 다른 글

Eclipse에서 Android 개발시 Proxy 설정하기  (0) 2010.10.15
int의 크기  (2) 2010.08.24
enum과 typedef enum  (12) 2010.08.24
memcpy()  (0) 2010.08.23
삼성 오픈소스 사이트 소개  (0) 2010.08.19
C의 비트연산 겉핥기  (4) 2010.08.18
Posted by 찬이
TAG ,

댓글을 달아 주세요

  1. BlogIcon 쪽쪽이 2010.10.10 11:00 신고  댓글주소  수정/삭제  댓글쓰기

    글 잘보고 갑니다:) 복사해서 제 블로그에 좀 담아놓을게요~

  2. john 2010.10.15 10:54 신고  댓글주소  수정/삭제  댓글쓰기

    좋은글 감사합니다

  3. Ezzi 2012.06.08 16:32 신고  댓글주소  수정/삭제  댓글쓰기

    많은 도움이 되었습니다 ^^

  4. 허리케인담벼락 2012.10.26 13:29 신고  댓글주소  수정/삭제  댓글쓰기

    글 잘보고 갑니다. 감사합니다.

  5. ㅇㅂㅊ 2015.01.11 00:55 신고  댓글주소  수정/삭제  댓글쓰기

    블로그 주인장님의 명쾌한 설명에 부랄을 탁! 치고 갑니다^^

  6. 나그네 2015.02.17 09:42 신고  댓글주소  수정/삭제  댓글쓰기

    임베디드C에서는 반대입니다. typedef enum의 크기가 컴파일러마다 다르기 때문에 사용이 비권장됩니다.

    • BlogIcon 찬이 2015.02.23 00:30 신고  댓글주소  수정/삭제

      컴파일러마다 다를 수 있다는 점은 어느 부분에서나 유념해야할 부분이나,
      이 글의 논점을 생각해볼때,
      지적해주신 내용은 전혀 엉뚱한 것 같습니다.