열거형 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;
}

+ Recent posts