본문 바로가기
c++정리하기

enum, enum class

by seizetheda 2024. 12. 10.

enum(열거형)

정수 상수 집합으로 구성된 사용자 정의 형식

 

 
enum 타입의 변수 Number을 새로 정의함
ZERO 부터 상수 값 0 이 되고, 특별히 값을 지정하지 않으면 순차적으로 
1씩 증가되어 할당
ZERO = 0, ONE = 1, ... FIVE = 5가 할당됨
 
TWO에 5을 지정 해서 THREE부터 5의 1식 증가되어 할당됨
위의 경우 THREE = 6, FOUR = 7, FIVE = 8이 할당됨
 
 

enum을 쓰는 이유는?

👉 허용 가능한 값을 제한 할 수 있다.
👉 코드가 단순해지고 가독성이 좋아진다.
👉 사용자의 실수를 미리 예방할 수 있다.
 
 

구현 예시

👀 switch를 사용한 enum 처리
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
enum Number
{
    ZERO,
    ONE,
    TWO,
    THREE,
    FOUR,
    FIVE
};
 
void main()
{
    unsigned int number;
    number = TWO;
    switch (number)
    {
    case ZERO:
    {
        std::cout << "숫자 0" << std::endl;
        break;
    }
    case ONE:
    {
        std::cout << "숫자 1" << std::endl;
 
        break;
    }
    case TWO:
    {
        std::cout << "숫자 2" << std::endl;
 
        break;
    }
    case THREE:
    {
        std::cout << "숫자 3" << std::endl;
 
        break;
    }
    case FOUR:
    {
        std::cout << "숫자 4" << std::endl;
 
        break;
    }
    case FIVE:
    {
        std::cout << "숫자 5" << std::endl;
 
        break;
    }
    }
}
 
cs


실행 결과


 

 

 

 

enum class

 

 

서로 다른 enum의 맴버의 이름이 중복되면 안되는 문제,

컴파일러가 묵시적으로 정수타입으로 변환하는 문제를 보완하기 위해서

enum class가 등장함

 

 

enum class 특징

1. enum class의 맴버 이름을 중복으로 사용해도 됨

1
2
3
4
5
6
7
8
9
enum class Color
{
    RED, GREEN, BLUE
};
 
enum class Signal
{
    RED, GREEN, BLUE
};
cs
 

Color의 맴버이름과 Signal의 맴버이름이 같아도 됨
그러나 코드를 명확하게 작성해서 사용해야함

ex) Color::RED, Signal::RED

 

2. 암시적 형변환이 이루어지지 않는다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespqce std;
 
enum class ESubject
{
MATH,//MATH = 0
KOREAN,
ENGLISG,
};
 
int main(void)
{
//static_cast<바꾸려는 타입>(대상) : 논리적으로 변환 가능한 타입을 변환한다
if(static_cast<int>(ESubject::KOREAN) == 1)
{
cout<<"KOREAN is 1" << endl;
}
else
{
cout<<"KOREAN is not 1" << endl;
}
 
return 0;
}
cs

 

enum은 따로 형변환을 하지않아도 암시적으로 정수형을 상수로 변환이 되었지만,

enum class는 cast 연산자를 통해 명시적으로 형변환을 해야함

static_cast<int>(ESubject::KOREAN) : 정수를 int로 명시적으로 형변환을 하고있음

'c++정리하기' 카테고리의 다른 글

접근 제어자  (2) 2024.12.22