OFFICE/프로그램

Enum 에 대해서

gandus 2012. 11. 29. 11:35

기본개념.


#define A 0
#define B 1
#define C 2

A가 1이고 B가 2 C가 3으로 바뀌었다고 했을때, define이라면 
하나씩 다 바꾸어주어야 겠지요. 하지만 enum 이라면

#define _NUMBER{A=1, B, C}


설명

enum(열거형)은 여러개의 상수를 기호로 선언할 수 있습니다.

형식

enum { A , B, C };

 여기서 A와 B와 C는 컴파일러에서 상수 값으로 변환합니다. 한마디로 A,B,C는 상수입니다.

 

간단한 예제

enum { A , B, C };
void main( )
{
    printf("%d %d %d\n", A, B, C );
}
  1. 0 1 2

 값은 자동으로 0부터 정수 값을 갖습니다.

 

enum { A=100, B, C };
void main( )
{
    printf("%d %d %d\n", A, B, C );
}
  1. 100 101 102

 초기값을 주면 자동으로 1씩 증가하며 정수 값으로 상수화됩니다.

 

enum { A=100, B =200, C=300 };
void main( )
{
    printf("%d %d %d\n", A, B, C );
}
  1. 100 200 300

 모든 초기화할 수 있습니다.

 

enum MyEnum { A=100, B =200, C=300 };
void main( )
{
    enum MyEnum val;

    val = A;
    printf("%d\n", val);
}
  1. 100

enum의 이름을 사용하면 변수를 만들고 enum 상수(A,B,C) 를 저장하고 사용할 수 있습니다.

enum변수를 어디에 사용할까요?

자료형을 명확하게 하고자 할 때 사용합니다.

과일을 표현하는 자료가 있다고 할때 아래 예제를 보입니다.

enum Fruits { Orange, Apple, Banana };
void main( )
{
    enum Fruits val;

    val = Orange;
    printf("%d\n", val);
}
  1. 0

 출력결과는 0이지만 val이라는 변수는 명확히 과일을 저장하기 위한 변수이며 Orange를 저장하고 있다는 것을 알 수 있습니다. 간단한 예제에서야 사용할 필요를 느끼지 못하겠지만 큰 프로그램등에서는 유용하게 사용됩니다. 지금은 사용법만 정확히 아시면 됩니다.

 

아래는 과일을 출력하는 예제입니다.

enum Fruits { Orange, Apple, Banana };
void PrintFruits(enum Fruits fruit)
{
    switch(fruit)
    {
    case Orange:
        printf("오렌지입니다!\n");
        break;
    case Apple:
        printf("사과입니다!\n");
        break;
    case Banana:
        printf("바나나입니다!\n");
        break;
    default:
        printf("과일이 ㅠ.ㅠ..\n");
    }
};
void main( )
{
    PrintFruits( Apple );
}
  1. 사과입니다!

 void PrintFruits(enum Fruits fruit)에서 fruit이 과일(오렌지, 사과, 바나나 중 하나)이라는 것을 명확히 할 수 있습니다.

 다른 사용예는 앞으로 예제들을 연습하며 공부하면 됩니다. 이 페이지에서는 사용법만 확실히 알아 두세요.


활용


// Parsing Variable

typedef struct parsing_variable {

enum {Header=0, Data, Terminator};

int nParsingStat;


enum {SystemMessageData=0, ResultData};

int nMessageType;


enum {SystemMessageStart=-1, SystemMessage=0};

int nSystemMessageParsingStat;


int nSystemMessage; // Received System Message


  enum {ResultStart=-1, nCamNo=0, nGrabCmdCnt, nGrabStartFrame, nGrabNo, nAvg/*, cnt, index, cogX, cogY, size, type, val*/};

  int nResultParsingStat;


int nResultCnt; // Result Count


CString strMessagePart;

} ParsVar;


이렇게 적어주면, 플래그를 활용할 때 편하게 사용할 수 있다.

m_parsVar.nParsingStat  = nParsingStat.Header;

이렇게 넣어주고


if(m_parsVar.nParsingStat == m_parsVar.Header)

else if(m_parsVar.nParsingStat == m_parsVar.Terminator)