프로그래머라면 누구나 enum값이 4byte 정수 자료형이라는 사실을 알고 있습니다.
switch( xxx ) : xxx 에는 정수 자료형만 올 수 있다는 것도 알고 있습니다.
switch( string )
{
case "A_Case": ... break;
case "B_Case": ... break;
}
이런식으로 switch 문에서도 문자열을 받고 싶을때가 많습니다.
혹은 enum 값을 1:1 매칭되는 문자열 값으로 변환하고 싶을때가 많습니다.
우연히 웹 서핑을 하던 중 http://eslife.tistory.com/entry/CC-enum-보다-나은-enum을 읽게 되었고, 약간의 팁을 보강하여 다음과 같이 정리하였습니다.
test.h 헤더 파일에 다음과 같이 작성한다.
namespace nsETREEITEMTYPE
{
// enum ETREEITEMTYPE의 enum 값을 나열한다.(eTIY_GROUP...)
#undef ENUM_LIST
#define ENUM_LIST(ENUM_VALUES) \
ENUM_VALUES(GROUP) \
ENUM_VALUES(CONNECTION) \
ENUM_VALUES(COUNT)
#undef DO_DESCRIPTION
#undef DO_ENUM
#define DO_DESCRIPTION(enumValue) _T(#enumValue),
#define DO_ENUM(enumValue) eTIY_##enumValue,
// enum Type 이름(ETREEITEMTYPE)을 설정한다.
enum ETREEITEMTYPE
{
ENUM_LIST(DO_ENUM)
};
// enum 배열 이름(ptszETIYDescription)을 설정한다.
static TCHAR* ptszETIYDescription[] =
{
ENUM_LIST(DO_DESCRIPTION)
};
};
{
// enum ETREEITEMTYPE의 enum 값을 나열한다.(eTIY_GROUP...)
#undef ENUM_LIST
#define ENUM_LIST(ENUM_VALUES) \
ENUM_VALUES(GROUP) \
ENUM_VALUES(CONNECTION) \
ENUM_VALUES(COUNT)
#undef DO_DESCRIPTION
#undef DO_ENUM
#define DO_DESCRIPTION(enumValue) _T(#enumValue),
#define DO_ENUM(enumValue) eTIY_##enumValue,
// enum Type 이름(ETREEITEMTYPE)을 설정한다.
enum ETREEITEMTYPE
{
ENUM_LIST(DO_ENUM)
};
// enum 배열 이름(ptszETIYDescription)을 설정한다.
static TCHAR* ptszETIYDescription[] =
{
ENUM_LIST(DO_DESCRIPTION)
};
};
위 문장이 전처리기 지시어로 도배(?)가 되어 있어서 가독성이 매우 떨어집니다.
잘 이해가 안가시는 분들을 위해서 한가지 팁을 알려 드리겠습니다.(전처리기 지시어를 자동 변환하는 방법 입니다.)
"C:\Program Files\Microsoft Visual Studio 8\VC\bin\cl.exe" 를 사용하시면 됩니다.
1. test.h 헤더파일에서 #include 문을 모두 주석처리 합니다.
(#include 문을 만나면 파일을 포함하려고 시도하다가 찾지 못하면 에러가 발생하고, 전처리기 지시문 변환을 실패합니다.)
2. cmd(console 입력창)에서 다음과 같이 입력합니다.
cl /EP /C test.h > c:\result.txt & notepad c:\result.txt
결과는 다음과 같습니다. 두둥!!
//////////////////////////////////////////////////////////////////////////
// 결과 확인 (#include 문이 들어 있으면 결과가 출력되지 않는다.)
// cl /EP /C test.h > c:\result.txt & notepad c:\result.txt
namespace nsETREEITEMTYPE
{
// enum Type 이름(ETREEITEMTYPE)을 설정한다.
enum ETREEITEMTYPE
{
eTIY_GROUP, eTIY_CONNECTION, eTIY_COUNT,
};
// enum 배열 이름(ptszETIYDescription)을 설정한다.
static TCHAR* ptszETIYDescription[] =
{
_T("GROUP"), _T("CONNECTION"), _T("COUNT"),
};
};
// 결과 확인 (#include 문이 들어 있으면 결과가 출력되지 않는다.)
// cl /EP /C test.h > c:\result.txt & notepad c:\result.txt
namespace nsETREEITEMTYPE
{
// enum Type 이름(ETREEITEMTYPE)을 설정한다.
enum ETREEITEMTYPE
{
eTIY_GROUP, eTIY_CONNECTION, eTIY_COUNT,
};
// enum 배열 이름(ptszETIYDescription)을 설정한다.
static TCHAR* ptszETIYDescription[] =
{
_T("GROUP"), _T("CONNECTION"), _T("COUNT"),
};
};
전처리기 지시어가 깔끔하게 해석되어 나오는 것을 볼 수 있습니다.
이렇게 작성하면 enum 값을 문자열로 변환하고 싶을때,
TCHAR* pString = nsETREEITEMTYPE::ptszETIYDescription[nsETREEITEMTYPE::eTIY_GROUP];이렇게 쓰시면,
TCHAR* pString = _T("GROUP");와 같은 결과를 얻으실 수 있습니다.
장점 1. namespace를 사용해서 인텔리센스를 적극적으로 활용할 수 있다.
장점 2. enum 자료형을 추가하면 그에 맞는 문자열이 등록된다.
(enum 값만 추가하고 문자열을 등록하지 않는 실수를 막을 수 있다.)
장점 3. 전처리기 지시어를 두려워하지 않아도 된다.(cl 명령어로 손쉽게 해석해서 보시면 됩니다.)




















