MoniWikiCpp_enum
Login:
Password:
대문|찾기|바뀐글|목록|메모장|책갈피|연꽃|링크
Edit Diff Reload Search Print Info Mail Help RSS

2006.09.16
0 기본적인 enum
1 C++에서의 enum
1 class 내부에서 선언되는 enum
1 const에서 했어야 하는 얘기.

enum을 보죠.
음... 사실 어려운 얘기는 없습니다.
4번은 모르시는 분들도 있을지 몰라요. 봐두면 좋겠죠?
(출처; http://jof4002.net/?CppKeywords/enum)

0 기본적인 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가 나왔습니다.

1 C++에서의 enum #

enum은 User-defined type입니다. 따라서 다음과 같이 operator를 정의하는 일이 가능합니다.


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;                     // 안될 이유가 없잖수?

1 class 내부에서 선언되는 enum #


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);
이런 식으로 사용해서 이해하기 쉽도록 할 수 있습니다.

1 const에서 했어야 하는 얘기. #


여기서 그럼 다시 const에 대해 볼게 있습니다. \\
const에서 한꺼번에 하려고 했으나 너무 길어지는 것 같아서 여기서 합니다. \\
(사실은 이런게 있다는 걸 까먹었었습니다. -_-;)

xxx.h

cpp
class CError
{
public:
    static const int MAX_VALUE = 10;
    // ...
};

xxx.cpp

cpp
const int CError::MAX_VALUE;

현재의 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 };
    // ...
};

2) 아래쪽에 선언
xxx.h

cpp
class CBelow
{
public:
    static const int MAX_VALUE;
    // ...
};

xxx.cpp

cpp
const int CBelow::MAX_VALUE = 10;

두 경우 모두 사용하는 법은 같습니다.

끝~

September, 2019
1234567
891011121314
15161718192021
22232425262728
2930 

시간을 존중하고, 기술에 겸손하며, 자기를 사랑하자.

신용_2016_Global
신용_2011_For_You
딱지_글로벌게임산업Trend_2013
책갈피_500
last modified 2006-09-16 06:05:49
고치기|찾기|쪽 지우기|비슷한 쪽 Valid XHTML 1.0! Valid CSS! powerd by MoniWiki
0.0183 sec