본문 바로가기
[C++]

[C++] ENUMERATION

by Hevton 2021. 6. 24.
반응형

코드의 가독성을 높일 수 있다.

 

enum { A, B, C }; // A = 0, B = 1, C = 2;

int main() {
    
    if(A == 0)
        cout << "YES";
}

OUTPUT : YES

 

enum { A, B = 2, C }; // A = 0, B = 2, C = 3;

int main() {
    
    if(C == 3)
        cout << "YES";
}

OUTPUT : YES

 


열거체에 이름 지정하기

 

enum ALPHABET { A, B, C };

int main() {
    
    ALPHABET x = C;
    
    
    cout << x;
    
}

OUTPUT : 2

 

 

ENUM은 산술연산 불가

열거체는 정수형으로 동작하는 것 같지만, 완전히 같지는 않다.

비교할 때에는 정수형과 비교가 가능했지만 산술연산은 안된다.

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

int main() {
    
    Color c1 = RED;
    c1 = GREEN + BLUE; // 불가능!!
    c1 = c1 + 2; // 불가능!!
    
}

 

 

ENUM에 정수 대입도 불가

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

int main() {
    
    Color c1 = RED;
    Color c2;
    
    c2 = 3; // 불가능
}

 

하지만

c2 = (Color)3; // 이렇게 명시적으로 캐스팅하면 가능하다.

 

또한 INT형에 ENUM 대입은 가능, 산술연산 결과도 가능

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

int main() {
    
    Color c1 = RED;
    
    int n = BLUE;
    int o = GREEN + BLUE;

}


마치, ENUM은 INT의 자식느낌이고

INT가 ENUM을 담는 것은 묵시적으로 캐스팅되나

 ENUM이 INT를 담으려면 명시적으로 캐스팅해야하는 것이라고 보면 된다.

 

 

ENUM은 또한 중복이 불가능하다

enum C { PASS, FAIL };
enum JAVA { PASS, FAIL };

이렇게 다른 enum 선언이라도 중복이 발생하면 코드가 컴파일 되지 않는다.

 

이를 해결할 방법 중 namespace를 이용하는 방법이 있다.

namespace sophomore {
    enum C { PASS, FAIL };
}
namespace freshman {
    enum JAVA { PASS, FAIL };
}

 

디렉토리, 패키지를 다르게 하여 다른 공간에 있도록 한다고 보면 된다.

 

또한 C++ 11부터 enum class가 등장하여, 또다른 해결 방법이 있다.

enum class C { PASS, FAIL };
enum class JAVA { PASS, FAIL };


사용할 땐 그냥 PASS, FAIL이 아니라
C::PASS, JAVA::FAIL 이런식으로 사용해야한다.

이렇게 class 타입으로 선언하게 되면, 아까처럼 비교 자체도 정수와 할 수 없게 된다.

C::PASS == 0 비교 불가.

 

반응형

'[C++]' 카테고리의 다른 글

[C++] 함수 포인터  (0) 2021.06.24
[C++] REFERENCE  (0) 2021.06.24
[C++] 구조체 크기 관련  (0) 2021.06.23
[C++] 공용체. Union, 주의점!!  (0) 2021.06.22
[C++] 구조체와 포인터  (0) 2021.06.22