C++의 열거 형

Jinku Hu 2023년10월12일
  1. C++의 범위가 지정되지 않은 열거
  2. C++의 범위가 지정된 열거
C++의 열거 형

이 기사에서는 C++에서 열거 형을 사용하는 방법을 보여줍니다.

C++의 범위가 지정되지 않은 열거

열거 형은 한동안 C 언어의 일부였습니다. C++는 또한 몇 가지 추가 기능으로 동일한 개념을 구현했습니다. 일반적으로 열거는 상수 정수의 이름을 지정하는 메커니즘입니다. 프로그래머는 열거 자 이름을 정의합니다. 정수 값은 명시 적으로 지정하거나 주어진 이름의 위치로 유추 할 수 있습니다.

열거 형은enum키워드를 사용하여 결정되며 선택적으로 유형의 이름을 정의 할 수 있습니다 (예 : 다음 코드 스 니펫의Color). C++ 열거 형 상수에는 구현 정의 정수 유형이 있습니다. 따라서 주어진 값에int보다 더 큰 공간이 필요한 경우 해당 정수 유형이 기본 유형으로 선택됩니다. 이 유형은 열거 형 이름 뒤에 사용자가 명시 적으로 지정할 수도 있으며 단일 콜론으로 구분해야합니다 (이 기사의 네 번째 코드 스 니펫에 표시됨).

다음 예에서는Color라는 열거 형을 정의하고 열거 형 상수로 6 개의 색상 이름을 지정합니다. 이러한 상수에는 명시 적 값이 할당되지 않았기 때문에 적분 값은 0부터 시작하는 위치로 추론됩니다. 이 코드는 주어진 값으로 제한되는 색상을 문자열로 변환하는 함수를 구현합니다. Color변수도 범위가 지정되지 않은 열거입니다. 이는 열거 자 (상수)가 열거 자체와 동일한 범위에서 액세스 할 수 있음을 의미합니다.

#include <iostream>

using std::cout;
using std::endl;
using std::string;

enum Color { RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW };

string ColorToString(Color c) {
  switch (c) {
    case RED:
      return "Red";
    case BLUE:
      return "Blue";
    case GREEN:
      return "Green";
    case CYAN:
      return "Cyan";
    case MAGENTA:
      return "Magenta";
    case YELLOW:
      return "Yellow";
    default:
      return "NAN";
  }
}

int main() {
  Color col1 = RED;

  cout << "the given color is " << ColorToString(col1) << endl;

  return EXIT_SUCCESS;
}

출력:

the given color is Red

또는 각 열거 자에 명시 적으로 할당 된 정수 값이있는 열거 (예 :WeekDay)를 정의 할 수 있습니다. 이 기능을 활용하여 다양한 날짜 규칙에 따라 수정할 수있는 유연한 구조를 구현할 수 있습니다. 필요한 경우 동일한 열거 형 개체에서 명시 적 및 위치 적 값을 혼합 할 수 있습니다.

#include <iostream>

using std::cout;
using std::endl;

enum WeekDay { MON = 1, TUE = 2, WED = 3, THU = 4, FRI = 5, SAT = 6, SUN = 7 };

int main() {
  auto today = SAT;
  cout << "today is " << today << "th day" << endl;

  return EXIT_SUCCESS;
}

출력:

today is 6th day

C++의 범위가 지정된 열거

열거의 또 다른 유용한 기능은 범위를 갖는 것입니다. 따라서 범위가 지정된 열거라고합니다. 후자는enum class또는enum struct키워드를 사용하여 선언 할 수 있습니다. 범위가 지정된 열거는 일반적인 범위 지정 규칙을 따르며 열거 범위 외부에서 액세스 할 수 없습니다. 플러스 측면에서, 전역 범위 열거는 범위가 지정되지 않은 열거가 할 수있는 것처럼 이름 충돌을 일으키지 않습니다.

다음 코드 샘플은 이전 예의WeekDay를 범위 열거로 정의합니다. 범위가 지정되지 않은 열거는cout함수를 다른 변수로 사용하여 인쇄 할 수 있지만 범위가 지정된 항목은 해당 정수 값으로 캐스트되어야합니다.

#include <iostream>

using std::cout;
using std::endl;

enum class WeekDay {
  MON = -1,
  TUE = 2,
  WED = 3,
  THU = 4,
  FRI = 5,
  SAT = 6,
  SUN = 7
};

int main() {
  auto today = WeekDay::MON;
  cout << "today is " << static_cast<unsigned>(today) << "th day" << endl;

  return EXIT_SUCCESS;
}

출력:

today is 6th day

범위가 지정된 열거에는 범위가 지정되지 않은 열거와 달리 이름이 있어야합니다. 반면에 범위가 지정된 열거에는 기본 기본 정수 유형이 없습니다. 기본 형식 변환으로 인해 열거자가 다른 형식으로 캐스팅 될 때 오버플로가 발생할 수 있습니다.

#include <iostream>

using std::cout;
using std::endl;

enum class WeekDay : int {
  MON = -1,
  TUE = 2,
  WED = 3,
  THU = 4,
  FRI = 5,
  SAT = 6,
  SUN = 7
};

int main() {
  auto today = WeekDay::MON;
  cout << "today is " << static_cast<unsigned>(today) << "th day" << endl;

  return EXIT_SUCCESS;
}

출력:

today is 4294967295th day
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Enum