(C++) 4.6 열거형

이준우·2021년 10월 16일
0
post-custom-banner
#include <iostream>
#include <typeinfo>

int computeDamage(int weapon_id)
{
	if (weapon_id == 0)
	{
	
		return 1;
	}
	if (weapon_id == 1)
	{

		return 2;
	}
	// ...
}

int main()
{
	using namespace std;


	return 0;
}

위의 함수처럼 종종 여러개를 나열하여 사용해야 하는 경우가 생긴다. 이를 좀더 간편하게 사용할 수 있는 방법은 없을까?

#include <iostream>
#include <typeinfo>

enum Color // user defined data types
{
	COLOR_BLACK,
	COLOR_RED,
	COLOR_BLUE,
	COLOR_GREEN,

};

int main()
{
	using namespace std;


	return 0;
}

enum을 사용하면 좀더 편하게 짤 수 있다. 실제로 COLOR_BLACK, COLOR_RED, COLOR_BLUE, COLOR_GREEN,에 커서를 대면 0, 1, 2 ,3인 것을 알 수 있다. 그리고 마지막에 ','가 있어서 문제가 되는거 아니냐 라고 생각할 수도 있는데, 예전같은 경우에는 허용이 안됐지만 지금은 상관없으니 user가 편한대로 사용하면 된다. 뭔가 구조가 구조체 같은 느낌이 나지만 뒤에 설명할 것이므로 일단 패스! 하지만 이 enum도 장점이 있는 것처럼 단점이 존재한다.

#include <iostream>
#include <typeinfo>

enum Color // user defined data types
{
	COLOR_BLACK,
	COLOR_RED,
	COLOR_BLUE,
	COLOR_GREEN,

};

enum Feeling 
{
	Happy,
	Joy,
	Angry,
	COLOR_BLACK,
};

int main()
{
	using namespace std;

	Color paint = COLOR_BLACK;
	Color house(COLOR_RED);
	Color apple{ COLOR_BLUE }; //uniform initialization

	return 0;
}

이 코드는 오류가 난다. 이유가 나는 이유는 COLOR_BLACK이라는 변수 때문에 발생한다. enum Color에도 COLOR_BLACK가 있고 enum Feeling에도 COLOR_BLACK가 있다. 보통 우리가 알기에는 한 scope안에 선언되면 그 안에서만 효력이 있고 밖에서는 효력이 없어 문제가 없어야하는데, enum같은 경우에는 전역변수처럼 작동하여 문제가 생긴다. 따라서 enum을 사용할 때에는 무조건 변수이름이 달라야 한다.

만약 -5부터 순차적으로 출력하고 싶다면

#include <iostream>
#include <typeinfo>

enum Color // user defined data types
{
	COLOR_BLACK = -5,
	COLOR_RED,
	COLOR_BLUE,
	COLOR_GREEN,

};

int main()
{
	using namespace std;

	Color paint = COLOR_BLACK;
	Color house(COLOR_RED);
	Color apple{ COLOR_BLUE }; //uniform initialization

	return 0;
}

와 같이 바꾸면 COLOR_BLACK = -5, COLOR_RED = -4, COLOR_BLUE = -3으로 출력되는 것을 볼 수 있다.

profile
꿈꾸는 CV
post-custom-banner

0개의 댓글