typedef enum을 써야하는 강력한 이유

수학시험에서 대부분 답이 0 혹은 1인 경우가 많습니다. C언어에서도 이러한 법칙은 어느정도 통용되는 것 같습니다. 코드내에 0과 1이 외의 숫자가 나타나는 경우를 최소화 해야 합니다. 더욱 엄격하게 하자면 코드에서 0 이외의 모든 숫자는 빼는 것이 좋습니다.

 

그러면 어떻게 숫자를 빼야 할까요? enum에 해답이 있습니다.  아래와 같이 선언하면, 0과 1의 타입의 형태에서는 false와 true만 사용하게 됩니다. 

typedef enum
{
  false = 0,
  true = 1
}bool;

 

위의 typedef enum 사용할 때 주의할 점이 있습니다. 바로 아래와 같이 사용하면 안됩니다. 왜 그럴까요?

if(is_exist) //true
{
  //when true, implements
}
else
{
  //when false, implements
}

 

추후 바로 false가 실수로 혹은 고의로 1로 바뀌게 될 수도 있기 때문입니다. 자동으로 바뀌지는 않지만 타인에 의해 소스 코드가 변경되든가, 혹은 같은 소스를 여기저기 프로젝트에서 복사해서 쓸 경우 즉, 극단적 예로 다음과 같이 선언되어 변경되었다면,

typedef enum
{
  true = 0,
  false = 1
}bool;

 

시스템은 엉망으로 동작 할 것입니다. 항상 아래 코드 처럼 명확하게 값을 지정해 주는 습관을 가지는 것이 좋습니다.

if(is_exist == true) //true
{
  //when true, implements
}
else
{
  //when false, implements
}

 

지금까지는 typedef  enum을 활용하는 방법 이었구요, 왜 typedef  enum을 쓰는 것이 좋은지 두가지만 알아보도록 하겠습니다. 

 

첫번째는 편리성입니다. 아래와 같이 선언하며 APP_SCENCE_1의 값은 1이 됩니다. 즉 값을 가진채로 명시적인 네이밍을 가지게 됩니다. #define과는 다르게 같은 군에 값이 중복될 일도 없어 편리합니다. 그리고 마지막의 APP_COUNT를 써 넣으면 갯수를 일일히 세지 않아도 그 갯수를 자동으로 알수 있게 됩니다. 

typedef enum
{
  APP_NONE,
  APP_SCENE_1,
  APP_SCENE_2,
  APP_SCENE_3,
  APP_SCENE_4,
  APP_COUNT, //5
}app_id_t;

 

두번째는 명시적 타입으로서 버그나 에러를 사전에 막아줍니다. 이게 무슨 소리 일까요? 다음과 같은 코드가 있다고 생각해보겠습니다.

unsigned short app;
app = APP_SCENE_4;
app = 30;

 

위 코드가 중간에 삽입되었다고 가정해 봅시다. 아무런 문제없이 compile이 되고 돌아갈 것입니다.  물론 compile시 에도 아무런 warning이 뜨지 않았을 것입니다. 그러나 시스템이 중간에 멈출지도 모릅니다. 디버깅하기가 상당히 어렵겠지요.

 

다음과 같이 app의 타입을 app_id_t로 고쳐봅시다. 왠만한 compiler에서는 두번째 줄에서 타입을 혼용해서 사용하기 때문에 compile warning을 낼 것입니다. 문제의 시작을 사전에 막아주는 역할을 하게 됩니다.

app_id_t app;
app = APP_SCENE_4;
app = 30;

 

이외의 여러 장점들이 있습니다. 코드에서 명시적인 숫자가 사라지고 좀 더 구조화된 코드가 가능해진다든가 코드의 이식성이 높아진다던가 하는 부분에서 이익을 볼 수 있습니다.

 

감사합니다.

'▶ 이전글 > C Coding' 카테고리의 다른 글

2차원배열, 함수 매개변수로 넘기는 방법과 파일명 정렬 소스  (0) 2015.09.15
불완전 선언(구조체전방선언)  (0) 2014.10.02
static  (0) 2014.10.02
typedef, define  (0) 2014.10.02
enum  (0) 2014.10.02