본문 바로가기
develop

enum과 typedef enum

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

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
memcpy()  (0) 2010.08.23
삼성 오픈소스 사이트 소개  (0) 2010.08.19
C의 비트연산 겉핥기  (4) 2010.08.18

댓글