열거형이란?
컴퓨터 프로그래밍에서 열거형(enumerated type, enumeration), 이넘(enum)은 요소, 멤버라 불리는 명명된 값의 집합을 이루는 자료형이다. 열거자 이름들은 일반적으로 해당 언어의 상수 역할을 하는 식별자이다.
출처 : 위키백과 '열거형'
이렇게 설명을 보니 쉽게 이해가 되지 않는다. 보다 쉽게 설명하자면 사용자가 자신이 필요한 정보를 열거(=선언, 정의)하여 사용하는 집합 자료형이다. 이 때 사용자가 명명한 상수 집합은 모든 값이 정수 상수 값을 가지며, 이 때 특정 자료에 사용자가 원하는 정수 값을 할당 할 수도 있다. 열거형은 enum 키워드를 통해 사용할 수 있다. 예를 들어 열거형을 사용하여 다음과 같은 색상 집합을 정의할 수 있다.
// 'Color'라는 새로운 열거형(enum)을 정의한다.
enum Color
{
// 열거자는 세미클론이 아닌, 쉼표로 구분한다.
RED = 1,
GREEN = 2,
BLUE = 3
// 그렇지만 열거형(eunm)은 세미클론으로 끝마춰야 한다.
};
위 'Color' 열거형에서는 RED, GREEN 및 BLUE의 세 가지 상수 값을 갖는 Color라는 열거형 유형을 정의합니다. 각 상수에는 사용자가 임의의 값을 할당하지 않았을 때에는 정수 값이 차례대로 할당되므로 RED는 1, GREEN은 2, BLUE는 3입니다.
열거형을 정의 후 코드에서 사용하려고 할 경우 아래와 같은 유형처럼 사용할 수 있습니다. 예를 들어 Color 유형의 변수를 선언하고 상수 값 중 하나를 할당할 수 있습니다.
Color favoriteColor = BLUE;
또한, 아래와 같이 코드의 조건(if), 루프(for) 및 기타 제어 구조에서도 열거형 상수를 사용할 수도 있습니다. 아래는 switch 문을 사용하여 열거형(eunm) 유형 마다 다른 값을 처리하는 코드입니다.
switch (favoriteColor)
{
case RED:
std::cout << "Your favorite color is red." << std::endl;
break;
case GREEN:
std::cout << "Your favorite color is green." << std::endl;
break;
case BLUE:
std::cout << "Your favorite color is blue." << std::endl;
break;
default:
std::cout << "Your favorite color is unknown." << std::endl;
break;
}
해당 코드는 사용자의 favoriteColor 변수 값을 기반으로 사용자가 선호하는 색상을 나타날 때 메시지를 출력할 수 있도록 합니다. 정리하자면, 전반적으로 enum은 명명된 상수 집합을 정의하고 명확하고 읽기 쉬운 방식으로 코드에서 사용할 수 있게 해주는 C++의 유용한 기능입니다.
열거형 클래스란?
열거형 클래스(enum class)란, 열거형(enum)에서 정의된 상수에 대해 추가적인 형식의 안정성과 보다 강력한 캡슐화를 제공하는 열거형 유형입니다. 한마디로 열거형(eunm)을 보다 업그레이드 시켰다고 볼 수 있습니다.
열거형 클래스(enum class)는 열거형을 사용하는 것과 같이 enum 키워드 다음에 class 키워드를 사용하여 정의할 수 있습니다.
// 마찬가지로 'Color'라는 새로운 열거형 클래스(enum class)를 정의한다.
// 빨강, 초록, 파랑의 세 가지 가능한 값을 사용하여 Color라는 새 열거형 클래스(enum class)를 정의합니다.
enum class Color
{
RED,
GREEN,
BLUE
};
위 코드는 RED, GREEN, BLUE 라는 3개의 열거자를 가지는 'Color' 열거형 클래스(enum class)를 정의합니다.
열거형 클래스(enum class)는 일반 열거형(enum) 유형과 달리 열거자에게 상수 값이 자동으로 할당되지 않습니다. 그러므로 아래와 같이 각 열거자들에게 상수의 값을 명시적으로 지정해야 합니다.
enum class Color
{
RED = 1,
GREEN = 2,
BLUE = 3
};
일반 열거형(enum) 대신 열거형 클래스(enum class)를 사용하는 주요 장점 중 하나는, 열거형 클래스(enum class)는 상수가 자동으로 정수로 변환되지 않는다는 점입니다.
즉, 하나의 열거형 클래스(enum class) 유형의 값을, 다른 열거형 클래스(enum class)의 변수에 할당하려고자 하면 컴파일 오류가 발생합니다. 이렇게 하면 코드의 오류를 방지하고, 보다 더 강력하게 만들 수 있습니다.
열거형 클래스(enum class)의 또 다른 장점은 열거자들에게 상수 값을 저장하고자 하는 데 사용되는 기본 유형을 지정할 수 있다는 것입니다.
기본적으로 기본 형식은 int를 사용하지만 정수 형식(short, long, unsigned int) 등을 기본 형식으로도 사용 할 수 있습니다. 이는 메모리를 절약할 수 있으며, 열거형 클래스(enum class) 상수의 값이 특점 범위에 저장할 수 있는지 확인하려고 할 때 유용합니다.
마찬가지로 열거형 클래스(enum class)을 정의 후 코드에서 사용하려고 할 경우 아래와 같은 유형처럼 사용할 수 있습니다. 예를 들어 Color 유형의 변수를 선언하고 상수 값 중 하나를 할당할 수 있습니다.
// Color 유형의 새 변수(favoriteColor)를 정의하고 값을 Color::red로 초기화합니다.
Color favoriteColor = Color::red;
마찬가지로 조건문 또한 사용할 수 있습니다.
// 조건문에서 변수 사용
if (favoriteColor == Color::red)
{
std::cout << "Your favorite color is red!" << std::endl;
}
열거형 클래스(enum class)를 사용할 때에는 클래스(Color)에 정의된 상수 중 하나(예시에서는 Color::RED)를 사용할 때 마다 클래스 이름(예시에서는 Color)를 지정해줘야 합니다. 이렇게 하면 코드의 다른 위치에서 정의될 수 있는 다른 열거형(enum) 유형과의 이름 충돌을 피할 수 있습니다.
전반적으로 열거형 클래스(enum class)는 C++에서 열거형(enum) 보다 조금 더 유용한 기능으로 열거형(enum) 유형에 대한 추가적인 안전성과 보다 강력한 캡슐화를 제공합니다.
열거형과 열거형 클래스의 차이점
열거형(enum)과 열거형 클래스(enum class)의 주요 차이점은 열거형 클래스(enum class)가 추가 형식 안전성과 열거형 (enum)에 정의된 상수보다 강력한 캡슐화를 제공한다는 것입니다. 주요 차이점은 다음과 같습니다.
1. 열거자에게 값 할당 여부
열거형(enum)에서는 상수 값은 자동으로 0부터 시작하는 정수 값을 할당됩니다. 그렇지만 열거형 클래스(enum class) 에서 상수 값은 명시적으로 지정되어야 하며 정수 형식(short, long, unsigned int) 등을 사용자가 설정할 수 있습니다.
2. 다른 열거형 변수에 할당 여부
열거형(enum)에서 상수 값은 자동으로 정수로 변환되므로 컴파일 오류 없이 하나의 열거형 값을 다른 열거형(enum) 변수에 할당 할 수 있습니다. 이는 자칫하면 사용자가 원하는 방식으로 작동하지 않을 수 있습니다.
그러나 열거형 클래스(enum class)는 상수 값이 자동으로 정수로 변환되지 않습니다. 그러므로 한 열거형 클래스(enum class) 유형의 값을 다른 열거형 클래스(enum class) 유형의 변수에 할당하려고 할 경우 컴파일 오류가 발생합니다.
3. 접근 권환
열거형(enum)에서 얼거형에 정의된 상수(열거자)는 일반적으로 전역적이며, 열거형 유형 이름 뒤에 상수 이름(예:Color::RED) 등을 사용해 코드 어디서든 언제든지 엑세스 할 수 있습니다. 그러나 이는 자치 잘못하면 매우 위험한 행동입니다.
이에 반해 열거형 클래스(enum class)에서 상수(열거자)는 일반적으로 전역적이지 않으며, 정규화된 이름(예:Color::RED)를 사용하거나 상수에 액세스 할 때 열거형 클래스 자체에 접근해야 합니다.(예:Color(클래스)::RED)로 지정하여 액세스 할 수 있습니다.
정리하자면 열거형 클래스(enum class)를 사용하면 열거형(enum)을 사용하는 것 보다 안전성과 캡슐화를 제공하지만 보다 더 명시적으로 코드를 작성해야 하므로, 이로 인해 장황한 코드가 필요할 수 있습니다. 그러면 언제, 어디서 열거형(enum)과 열거형 클래스(enum class)를 구분 지어서 사용해야 할까? 이에 대한 대답은 프로젝트의 특정 요구 사항과, 개개인의 코딩 스타일에 따라 달라집니다.
출처 : https://boycoding.tistory.com/179
C++ 05.04 - 열거형, enum
05.04 - 열거형, enum C++에는 많은 자료형이 내장되어 있다. 하지만 이 자료형들이 원하는 걸 표현하기에 항상 충분하지는 않다. 그래서 C++은 프로그래머들이 자신만의 자료형을 만들 수 있게 해 주
boycoding.tistory.com
출처 : https://boycoding.tistory.com/180
C++ 05.05 - enum class
05.05 - enum class 열거형(enum)은 C++ 에서 고유한 유형이지만, 형식이 안전하지 않으므로 어떤 경우에는 이해가 되지 않는 작업을 수행할 수 있다. #include int main() { enum Color { RED, // RED is placed in the same
boycoding.tistory.com
'공부 > C++' 카테고리의 다른 글
가상 함수(Virtual Function)와 가상 함수 테이블(Virtual Function Table) 개념 및 차이 (0) | 2022.12.22 |
---|---|
Vector resize, reserve의 차이점 (0) | 2022.12.21 |
포인터(Pointer)와 참조자(Reference)의 차이 (1) | 2022.12.20 |
Vector push_back과 emplace_back의 차이 (0) | 2022.12.16 |
구조체(Struct)와 클래스(Class)의 개념과 차이 (2) | 2022.12.14 |