열거형 enumerated types
어떤 같은 종류(색,무기종류)를 정할때 그 조건의 값을 다 기억하기는 어렵다.
그럴때 enum으로 자료형을 생성한다.
사용자 지정 자료형으로 생성된다.
내부적으로 정수 0,1,2,3순(100%integer는아님)으로 저장된다.
기본값으로 특정수를 설정하면 그 수부터 저장된다.
ex)처음 기본값을 -3으로 설정하면 -3,-2,-1,0,1순으로 된다.
enum 주의점
enum안에 선언해놓은것은 전역에서 중복될 수 없다.
캐스팅을 할 수 있다. static_cast<enum명>(정수);
cin으로 직접입력받을 수 없어 정수형,문자열으로 우회하여 받아야한다.(비추천)
#include <iostream>
#include <typeinfo>
#include <string>
using namespace std;
enum colorId {//사용자 지정 자료형
COLOR_BLACK,
COLOR_RED,
COLOR_BLUE,
COLOR_GREEN,
};
enum feelId {//사용자 지정 자료형
HAPPY,
JOY,
//예를들어 colorId와 feelId의 BLUE가 이름이 같다면 에러가난다.
BLUE,
};
int getColor(int colorId)
{
if (colorId == 0) {
return 1;
}
else if (colorId == 1) {
return 2;
}
}
int main()
{
colorId apple(COLOR_RED);
cout << apple << endl;
//캐스팅하기
colorId id = static_cast<colorId>(3);
cout << id << endl;
//string으로 입력받기(추천하지 않는다.)
string str;
getline(cin, str);
if (str == "BLACK") {
id = static_cast<colorId>(0);
}
cout << id << endl;
return 0;
}
영역제한 열거형 enum class
enum으로만 생성하면 다른 enum안의 같은 순번의 데이터가
같은 숫자처럼 보일 수 있다.
enum class로 생성하게 되면 비교를 못하게 막아준다.
enum class 명 ::으로 불러온다.
같은 enum class끼리는 비교가 가능하다.
다른 enum class도 캐스팅하면 비교가 가능하긴 하다.
#include <iostream>
using namespace std;
int main()
{
enum class Color
{
RED,
BLUE,
};
enum class Fruit
{
BANANA,
APPLE,
};
Color c = Color::RED;
Color c1 = Color::RED;
Fruit f = Fruit::BANANA;
//두 출력 0으로 같지만 class를 선언하면 직접적으로 비교는 안된다.
cout << static_cast<int>(c)<< " : " << static_cast<int>(f) << endl;
//다른 enum class는 비교할 수 없다.
/*if (c == f) {
}*/
//같은 class는 비교는 가능하다.
if (c == c1) {
cout << "같다." << endl;
}
return 0;
}
'개발 소발 > 개발 C++(기초)' 카테고리의 다른 글
c++ 제어흐름종류,중단 Halt,조건문 if (0) | 2019.07.10 |
---|---|
c++ 자료형 가명(별명)typedef,구조체 struct (0) | 2019.07.09 |
c++ 문자열,string (0) | 2019.07.08 |
c++ 암시적형변환,명시적형변환 (0) | 2019.07.05 |
c++ using,auto 키워드 란? (0) | 2019.07.05 |