열거형

열거형은 정수 값에 고유한 이름을 붙인 것들을 모아놓은 사용자 정의 자료형입니다.

특정 정수 값에 이름을 붙였기 때문에 특정 정수가 사용된 의미에 대해 직관적으로 이해할 수 있습니다.
즉 코드 문서화 및 가독성 목적으로 유용합니다.

정수 값에 이름을 붙인 것만 사용 할 수 있으므로 표현할 수 있는 값의 범위가 제한된 자료형입니다.

열거형 정의

열거형은 다음과 같이 정의됩니다.

enum 열거형이름
{
    열거자1,
    열거자2,
    ...
}

enum Week
{
    Sunday,   // 0
    Monday,   // 1
    Tuesday,  // 2
    Wednesday,// 3
    Thursday, // 4
    Friday,   // 5
    Saturday  // 6
};

열거형은 우선 enum키워드를 사용해 정의합니다.

각 열거자는 쉼표(,)를 사용해 구분합니다.

전체 열거는 세미콜론(;)으로 끝납니다.

위의 경우 첫 번째 열거자인 Sunday는 정수 값 0이 할당되며, 그 이후 열거자부터는 이전 열거자보다 1이 더 큰 값이 할당됩니다.
그렇기 때문에 Monday는 1이고, Tuesday는 2가 됩니다.

enum Week
{
    Sunday,       // 0
    Monday,       // 1
    Tuesday = 5,  // 5
    Wednesday,    // 6
    Thursday,     // 7
    Friday = 10,  // 10
    Saturday      // 11
};

이런식으로 직접 열거자의 정수값이 몇이 될지 정해줄 수 있습니다.

사용법

Week LastWeek = Friday;
Week ThisWeek(Friday);
Week NextWeek{Friday};

열거형은 사용자가 직접 자료형을 만든것이기 때문에 직접 만든 자료형의 이름을 써주고 변수의 이름을 써주면 됩니다.
그 후 기본 자료형의 변수를 선언이나 초기화했던 것처럼 작성합니다.
다만 값에는 정수값이 아닌 사용자가 정한 이름을 작성해주어야 합니다.

주의점

열거형을 사용 할 때 주의할 사항들이 몇가지 있습니다.

이전 열거자보다 1이 더 큰 값이 할당되므로 다음과 같은 상황이 있을 수 있습니다.

#include <iostream>

enum Week {
    Sunday = 2,   // 2
    Monday = 1,   // 1
    Tuesday,  // 2
    Wednesday,// 3
    Thursday, // 4
    Friday,   // 5
    Saturday  // 6
};

Sunday는 2를 Monday는 1이라는 값을 할당받았는데, 이전 열거자보다 1이 더 큰 값이 할당되게 되므로 Tuesday는 2를 할당받습니다.
이 경우 SundayTuesday는 정수값으로는 2를 가지므로 사용에 주의가 필요합니다.

열거자의 이름은 같은 네임스페이스에 배치되기 때문에 같은 이름을 가진 열거자가 있어서는 안됩니다.

enum Week
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
};

enum Weekend
{
    Sunday,   //ERROR
    Saturday, //ERROR
}

열거형을 초기화 하거나 값을 대입할 때 정수를 암시적으로 변환하지 않습니다.

Week CurWeek = 1; // ERROR
Week CurWeek = static_cast<Week>(1);

이 경우 명시적으로 형변환을 할 경우 오류가 발생하지 않습니다.

암시적으로 형변환을 허용하지 않는 것은 열거형 변수에 정수를 암시적으로 형변환하지 않을 뿐이고, 정수형 변수에 열거자를 사용할 경우 형변환이 됩니다.

int a = Monday;

열거형 클래스

열거형 클래스의 기본적인 개념은 열거형과 같습니다.
열거형의 문제점들과 단점들을 보완하기 위해 만들어진 것이 열거형 클래스입니다.

C++11에서부터 추가되어 사용할 수 있습니다.

기본적인 열거형과 다르게 열거자의 이름이 충돌하지 않고, 전방 선언을 지원합니다.

열거형의 기반 타입을 지정할 수 있게 되었는데, 기본적으로 int를 사용하며 명시적으로 변경해 char자료형 등 다른 자료형으로 변경 할 수 있습니다.

이 외의 기본적인 사용법은 열거형과 같습니다.

열거형 클래스 정의

enum class 열거형이름
{
    열거자1,
    열거자2,
    ...
}

enum class Week : char
{
    Sunday,   // 0
    Monday,   // 1
    Tuesday,  // 2
    Wednesday,// 3
    Thursday, // 4
    Friday,   // 5
    Saturday  // 6
};

열거형과 같게 정의하지만 키워드는 enum에서 enum class가 됩니다.

주의점

열거형에서 사용하던 방법대로 소속 없이 이름만 사용할 수 없습니다.

Week a = Sunday; //ERROR
Week b = Week::Monday;

어떤 열거형인지 열거형의 이름을 함께 명시해주어야 합니다.
이 경우 코드가 너무 지저분하거나 불편하다면 using enum을 사용할 수 있습니다.

정수형 변수에 열거자를 사용해 암시적 형변환으로 초기화하거나 값을 변경 할 수 있었지만 enum class에서는 이 암시적 형변환을 사용할 수 없습니다.

int a = Week::Sunday; //ERROR
int b = static_cast<int>(Week::Monday);

정적 형변환을 사용하면 사용할 수 있습니다.

Date:     Updated:

카테고리:

태그:

Cpp 카테고리 내 다른 글 보러가기

댓글남기기