옛 버전이 없습니다
2006.09.16
enum을 보죠. 음... 사실 어려운 얘기는 없습니다. 4번은 모르시는 분들도 있을지 몰라요. 봐두면 좋겠죠? (출처; http://jof4002.net/?CppKeywords/enum) cpp enum { red, green, blue };이렇게 선언하면 red, gree, blue라는 상수가 선언됩니다. 기본적으로는 0부터 시작해서 1씩 증가하죠? cpp enum COLOR { red = 1, green, blue = 10 };이렇게 선언하면 COLOR라는 타입으로 red, green, blue가 선언됩니다. red, green, blue는 각각 1, 2, 10의 값을 가지죠. enum 타입 자체에 이름을 줄 수도, 안 줄 수도 있습니다. 상황에 따라 각자 판단해서 사용하세요.
enum은 상수를 사용해야 하는 자리에 사용할 수 있습니다. 가장 대표적인게 switch내의 case 문이죠.
그럼 잠시 The C++ Programming Language의 코드를 베끼겠습니다.
cpp enum e1 { dark, light }; // range 0:1 enum e2 { a = 3, b = 9 }; // range 0:15 enum e3 { min = -10, max = 1000000 }; // range -1048576:1048575즉, enum의 범위는 그 모든 수를 표시할 수 있는 비트수가 된다는 얘기입니다. cpp enum flag { x=1, y=2, z=4, e=8 }; // range 0:15 flag f1 = 5; // type error : 5는 flag 형이 아님. flag f2 = flag(5); // ok : flag(5)는 flag형이고 범위도 문제없음. flag f3 = flag(z | e); // ok : flag(12)는 flag형이고 범위도 문제없음. flag f4 = flag(99); // undefined : 99는 flag형의 범위를 벗어남. // f4의 경우 사실 컴파일 에러가 나지는 않습니다.
그렇다면 enum에 대해서 sizeof를 하면 어떨까요? 책에 따르면 sizeof(int)보다는 작다고 합니다. \\
컴파일러에 따라 다를 수도 있다는 것이죠. VC++에서는 4가 나왔습니다. cpp enum Day { sun, mon, tue, wed, thu, fri, sat }; Day& operator++(Day& d) { return d = (sat == d) ? sun : Day(d+1); }
다음 문장은 C에서는 가능했지만 C++에서는 에러가 납니다.
cpp enum Direction { up, down }; Direction d1 = 1; // error Direction d2 = Direction(1); // ok int i1 = d2; // 안될 이유가 없잖수?
const에서 잠깐 얘기했습니다. 클래스의 상수로서 enum은 정말 편리합니다.
cpp class CColor { public: enum Rainbow { r, o, y, g, b, i, v }; // ... };
이렇게 선언한 다음에
CColor::Rainbow 라고 해서 변수를 선언하거나, CColor::r, CColor::b 이런 식으로 상수를 사용할 수 있습니다. 물론 클래스 내부에서라면 CColor::은 필요없겠죠.
배열을 선언할 때 다음과 같은 형태로도 많이 사용합니다.
cpp class CColorMenu { public: enum menuColor { colorBorder, colorBackground, colorText, colorGrayedText, colorHighlightText, colorHighlight, colorIconTransparent, numColors }; COLORREF m_Colors[numColors]; // ... };
위와 같이 선언하면 프로그램에서는
cpp m_Colors[colorText] = RGB(0, 0, 128);이런 식으로 사용해서 이해하기 쉽도록 할 수 있습니다.
여기서 그럼 다시 const에 대해 볼게 있습니다. \\
const에서 한꺼번에 하려고 했으나 너무 길어지는 것 같아서 여기서 합니다. \\ (사실은 이런게 있다는 걸 까먹었었습니다. -_-;)
현재의 C++ 문법은 이와 같은 문장을 허용합니다. 즉, static const 에 대해서 클래스의 선언부에서 초기화를 할 수 있다는 것이죠. (const가 아니면 안됩니다.)
그런데!!!! Visual C++은 뭐가 맘에 안드는지 이 문장을 에러처리합니다! 으아아아아~ 틀림없이 이 문법이 허용된 다음에 VC++ 6.0이 나왔을텐데~ 저렇게 하면 MAX_VALUE가 순수 가상 함수니까 = 0 으로 초기화해야한다고 우깁니다. <footnote(요즘 VC++에서는 될 겁니다)>
상수의 실제값을 헤더에 명시할 수 없다는 것은 슬픈 일입니다. 저 에러를 피하기 위해서는 enum을 사용하거나 값을 아래쪽에서 정의해줘야 합니다.
1) enum
cpp class CUsingEnum { public: enum { MAX_VALUE = 10 }; // ... };
두 경우 모두 사용하는 법은 같습니다.
끝~
|
오늘의 실패는 지난날의 허비한 시간들의 복수다(나폴레옹) FortuneCookies BabelFishMacro 바람_gems_cs_Playerlevels 신용_200910_위기에_빛난_기업의_교훈 |