본문 바로가기

프로그래밍/C

[C] 힘숨찐 자료형, 열거형

들어가며

오늘은 열거형에 대해 공부할 생각이다.

왜 이렇게 배우는 순서가 들쭉날쭉한지 궁금한가?

안 알려줄 것이다.

내 맘이다.

히히.

 

힘을 숨긴 찐따

ValueA, ValueB, ValueC라는 정수형 상수를 선언한다면

두세 개까지는 뭐 그럭저럭 괜찮지만 개수가 많아지면

입에서 야발 소리가 절로 나오지 않을 수가 없다.

const int ValueA = 1;
const int ValueB = 2;
const int ValueC = 3;
 · · · · · 

 

이러한 상황에서 열거형(enumeration)을 사용하여

정수형 상수좀 더 편하게 정의할 수 있다.

다음처럼 말이다.

그림 1 - 대충 열거형이 어떻게 생겼는지에 대해 간단하게 나타낸 그림

열거형은 정의만 한다고 해서 사용할 수가 없다.

따라서 열거형변수로 선언해서 사용한다.

  • enum (열거형 이름) (변수 이름);

열거형으로 아이템 등급을 정의한다면 다음과 같다.

enum ItemClass    // 열거형 정의
{
    crude = 0,    // 초깃값 할당
    normal,
    rare,
    unique,
    epic,
    legendary
};

int main()
{
    enum ItemClass item_class;    // 열거형 변수 선언
    
    item_class = rare;            // 열거형 값 할당
    
    printf("%d\n", item_class);   // 2: rare의 값 출력
    
    return 0;
}

 

열거형의 값은 처음에만 할당해주면

그 아래에 위치하는 값들은

1씩 증가하면서 자동으로 할당된다.

이때 아무 값도 할당하지 않으면

0부터 시작하여 증가한다.

따라서 『crude』에 0을 할당하면

『normal』은 1, 『rare』는 2가 된다.

 

열거형의 이름과 대소문자

문법으로 정해진 규칙은 아니지만

열거형 이름이나 값을 정의할 때

대문자만 사용하는 경우가 많다.

특히 단어와 단어 사이에는 『_』(언더바)를

주로 사용한다.

 

하지만 어떤 다른 환경에서는, 열거형 이름은 모두 대문자이고

열거형 값은 단어의 첫 글자만 대문자로 되어있을 수도 있다.

 

그러나 운영체제, 회사, 단체에 따라서

명명 스타일이 제각각이기 때문에

알아서 잘 적응하면 된다.

히히.

 

열거형 변수

정의한 열거형을 사용하려면 열거형 변수 선언해야 한다.

이때는 열거형 이름 앞에 반드시 enum 키워드로 열거형임을 명시한다.

다음은 ItemClass 열거형 타입의 변수 item_class를 선언한다는 뜻이다.

enum ItemClass item_class;   // 열거형 변수 선언

 

보통 열거형 변수에는 미리 정의한 열거형 값을 넣는다.

열거형 값 대신 정수를 할당해도 상관은 없지만

정의하지 않은 열거형 값은 넣을 수 없다.

// 열거형 변수 값 할당 가능 (미리 정의)
item_class = rare;

// 열거형 변수 값 할당 가능 (정수 할당)
item_class = 4; 
// 열거형 변수 값 할당 불가
item_class = hidden;
//『hidden』이라는 결거형 값은 열거형 내부에 미리 정의되어 있지 않다.

 

아무튼 저렇게 할당받은 열거형 변수를 출력하면

printf("%d\n", item_class);

 

당연하게도 『rare』의 값인 '2'가 출력된다.

 

열거형 사용

보통 열거형을 정의할 때

처음에 오는 값에만 초깃값을 할당하지만

모든 값에 정수를 할당할 수 있다.

enum ItemClass          // 열거형 정의
{
    crude =       0,    // 초깃값 할당
    normal =      1,
    rare =        2,
    unique =      3,
    epic =        4,
    legendary =   5
};

이런 식으로 말이다.

 

사실 이런 식으로 불규칙하게

값을 할당해도 상관은 없다.

enum ItemClass          // 열거형 정의
{
    crude =       0,    // 초깃값 할당
    normal =      2,
    rare =        4,
    unique =      6,
    epic =        8,
    legendary =   10
};

이처럼 연속되지 않은 불규칙한 값을 사용하려면

모든 열거형 값정수를 할당하면 된다.

 

열거형 활용

일단 위에서도 말했다시피 열거형은 자료형이지 않은가?

근데 기본 자료형이랑은 생긴게 좀 다르다.

 

그럼 우리가 아는, 생긴게 다른 자료형은 무엇인가.

구조체가 불현듯 대뇌 한 구석을 쓱 핥고 지나가지 않는가?

 

그렇다. 구조체처럼 열거형도

정의와 동시에 변수의 선언이 가능하다.

심지어 모습도 똑같다.

enum ItemClass          // 열거형 정의
{
    crude =       0,    // 초깃값 할당
    normal =      2,
    rare =        4,
    unique =      6,
    epic =        8,
    legendary =   10
} item_class;           // 열거형 변수 선언

 

마치며

간단하게 열거형이 뭐하는 놈인지를 알아보았다.

전처리기, 그러니까 매크로를 사용하려고 할 때

사용해야 할 매크로의 수가 많을 때

요긴하게 활용해보면 어떨까 싶다.


참고 및 출처

코딩의 시작, TCP school

코딩 도장