숫자로 작성된 상수를 효과적으로 대체하기 위해서 사용되는 방법에는 여러가지가 있습니다.
그러나, 갯수가 많거나 숫자의 많고 적음보다는 구분하기 위한 인덱스 혹은 태그 정도의 의미로 사용할 때에는 enum을 더 많이 사용합니다.
이 경우에, WHITE는 0이 되고 그 이후로 BLACK은 1, YELLOW는 2가 되는 것처럼 1씩 자동으로 증가하게 됩니다. 이것은 BLACK가 1이고, YELLOW가 2가 되는 것 자체가 중요한 의미를 가지진 않습니다.
주로 이와같이 인덱스 역할을 하는데 유용하게 사용되며, 이때에는 YELLOW가 앞이나 뒤에 있더라도 상관은 없습니다.
enum을 이용하여 함수를 실행할 때에도 별다른 차이는 없습니다.
발로 짠 코드를 잠시 보시겠습니다.
대략 이해는 가시죠? BLACK, YELLOW일 경우에는 색상을 알려주고, 그 외에는 무슨 색인지 몰라서 되묻는 문장을 출력합니다.
그런데 이번에는 아래와 같은 코드가 추가되었습니다.
이럴 경우, 어떻게 출력될까요?
이렇게 출력이 됩니다. 의도한 바라면 별 문제안되겠지만, 코딩 실수였는데 정상동작을 하게 되면 나중에 문제점을 찾기 힘들 수 있습니다. BLACK, NewSM5, TRUE 이것을 구분해서 사용할 수 있는 방법이 바로 'typedef enum' 입니다.
이렇게 작성했을 경우, BLACK, YELLOW 등은 COLOR_TYPE라는 데이터형으로 간주됩니다. 그렇기 때문에 print_color_name(TRUE), print_color_name(NewSM5)와 같이 코딩했을 때는 컴파일 에러가 발생됩니다. 데이터형이 다르기 때문이죠. 물론 의도하고자 하는 경우에는 print_color_name((COLOR_TYPE)TRUE)와 같이 형변환을 해서 사용할 수는 있습니다. 코딩실수를 막을 수 있다는 장점이 있는 것이지요.
물론 필수요소는 아니며, 컴파일이나 실행속도상의 문제가 있는 것도 아닙니다. 이런 이유에서 가급적 typedef enum을 쓰는 것을 권장하는 편입니다.
const int value = 5;
#define MAX_COUNT 10
#define MAX_COUNT 10
그러나, 갯수가 많거나 숫자의 많고 적음보다는 구분하기 위한 인덱스 혹은 태그 정도의 의미로 사용할 때에는 enum을 더 많이 사용합니다.
enum {
WHITE,
BLACK,
YELLOW,
BLUE,
GREEN,
MAX_COLOR,
};
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] );
}
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?
{
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 );
#define AvanteHD 2
#define Tico 3
print_color_name( AvanteHD );
print_color_name( TRUE );
이럴 경우, 어떻게 출력될까요?
Color is Yellow
Color is Black
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)
{
....
}
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 |
댓글