-
2024.02.26 - 열거형 자료형(enum)C++ 2024. 2. 27. 00:58
c++에 내장된 자료형으로 원하는 표현을 할 수 없을 때, 사용자 정의 자료형을 사용하여 새로운 자료형을 만들 수 있다. 그중 열거형 자료형은 가장 간단한 사용자 정의 자료형이라 할 수 있다. 열거형 자료형은 모든 값이 열거된 키워드로 정의되는 자료형이다. enum 키워드를 통해 정의된다.
- 열거형 자료형 정의하는 방법
1. 열거자의 명시적인 값을 지정하지 않는 경우
//Color 라는 이름의 열거형 자료를 정의한다. enum Color{ COLOR_RED, //0 COLOR_GREEN, //1 COLOR_BLUE //2 };
첫 열거자의 값이 0이되며, 명시되지 않은 다음 열거자의 값은 앞 열거자의 값에서 1 늘어난 값이 된다.
2. 열거자의 명시적인 값을 지정한 경우
enum Animal { ANIMAL_CAT = 3, ANIMAL_DOG = 5, ANIMAL_BIRD = 4, ANIMAL_FISH = 10 };
각 열거자의 값을 원하는 대로 명시할 수 있다. 열거자의 값은 정수 값이어야 한다.
3. 열거자의 값을 일부만 명시한 경우
enum LUNCH { LUNCH_RAMYEON = 1, LUNCH_KIMBAB, //2 LUNCH_BOKUMBAB = 1, LUNCH_HAMBURGER, //2 LUNCH_PIZZA = 3, LUNCH_COKE = 3 };
명시되지 않은 열거자의 값은 앞 열거자의 값에서 1 늘어난 값을 가진다.
또한 열거자의 값은 중복될 수 있다.
*그러나 같은 열거자 이름을 사용할 수 는 없다.
enum BRUNCH { RAMYEON, KIMBAB, COLA }; enum DINNER { PIZZA, PASTA, COLA };
- 열거형 자료형을 사용하는 방법
#inclue<iostream> enum Color{ COLOR_RED, COLOR_GREEN, COLOR_BLUE }; int main(){ int num = COLOR_BLUE; Color cr = COLOR_GREEN; std::cout << "COLOR_RED 그냥 갖다쓰기 -> " << COLOR_RED << std::endl; std::cout << "정수형 변수 num에 넣어 쓰기 -> " << num << std::endl; std::cout << "Color형 변수 cr에 넣어 쓰기 -> " << cr << std::endl; }
열거형 변수를 정수형 변수에 대입하면 정수값으로 대입이 된다.
*반대로 열거형 변수에 정수값을 대입 할 수는 없다.
#include<iostream> enum Color{ COLOR_RED, COLOR_GREEN, COLOR_BLUE }; int main() { int num = 4; Color cr = num; }
- enum class
위에서 열거형 자료형의 이름은 겹치면 안된다고 했었다. 하지만 enum을 여러번 사용하다 보면 하나둘씩 겹치는 이름이 생길 수도 있다. 그래서 이름이 겹치지 않게 아래와 같은 방법으로 이름을 구분하고는 했다.
1. 각 열거자 앞에 enum타입을 붙여서 구분하는 방법
enum BRUNCH { BRUNCH_RAMYEON, BRUNCH_KIMBAB, BRUNCH_COLA }; enum DINNER { DINNER_PIZZA, DINNER_PASTA, DINNER_COLA };
이렇게 하면 COLA가 BRUNCH에 속했는지, DINNER에 속해있는지 컴파일러가 헷갈리지 않을 수 있다.
2. 중복되는 이름의 열거자가 생길경우, 별도의 namespace를 만들어서 사용하는 방법
#include<iostream> namespace TYPE_A { enum BRUNCH { RAMYEON, KIMBAB, COLA }; } namespace TYPE_B { enum DINNER { PIZZA, COLA }; } int main() { std::cout << "브런치 COLA: " << TYPE_A::COLA << std::endl; std::cout << "디너 COLA: " << TYPE_B::COLA << std::endl; }
이 두가지 방법으로 중복되는 열거자가 생기는 경우를 처리했었다.
enum class 사용하면 위와 같은 방법으로 구분할 필요가 없어진다.
enum class BRUNCH { RAMYEON, KIMBAB, COLA }; enum class DINNER { PIZZA, COLA };
그런데 이렇게 생성한 열거형을 바로 가져다 쓸 수는 없다.
#include<iostream> enum class BRUNCH { RAMYEON, KIMBAB, COLA }; enum class DINNER { PIZZA, COLA }; int main() { std::cout << "브런치 COLA: " << BRUNCH::COLA << std::endl; std::cout << "디너 COLA: " << DINNER::COLA << std::endl; }
그냥 enum으로 만든 열거자들은 아무 말 없을 때 정수형으로 변환되는 반면, enum class로 생성한 열거자들은 그렇지 않다. 정수형으로 변환되는 것이 편할 수 있지만, 열거자들의 형식이 제한되는 것이 생각지 못한 오류를 줄일 수 있다.
enum class로 생성한 열거자를 형변환 하기 위해선 static_cast 기능을 사용할 필요가 있다.
- static_cast (타입캐스트 연산자)
static_cast<변환할 타입>(대상)
static_cast는 실수와 정수, 열거형과 정수의 변환 등을 허용한다.
#include<iostream> enum class BRUNCH { RAMYEON, KIMBAB, COLA }; enum class DINNER { PIZZA, COLA }; int main() { std::cout << "브런치 COLA: " << static_cast<int>(BRUNCH::COLA) << std::endl; std::cout << "디너 COLA: " << static_cast<int>(DINNER::COLA) << std::endl; }
'C++' 카테고리의 다른 글
2024.02.27 - 포인터 (0) 2024.02.27 2024.02.27 - 구조체(struct) (0) 2024.02.27 2024.02.26 - 함수 (0) 2024.02.26 2024.02.23 - 실습 (0) 2024.02.24 2024.02.23 - 배열 (0) 2024.02.24