본문 바로가기
  • 공부, 여행 리뷰해요~~!!
공부/C++

C++, 열거형 Enumerate type

by 하나리나 2024. 5. 6.
반응형

패스트캠퍼스 C++ 실력 완성 올인원 패키지 Online 수강 내용 중, 공부한 내용을 올립니다.

 

C++, 열거형 Enumerate type

 

1. 배열 활용

 - Red, Green, Blue를 나타내는 colors라는 배열이 있다고 하겠습니다.

 - 간단하게 아래와 같이 나타낼 수 있겠습니다.

	// 0: Red, 1: Green, 2: Blue
	int colors[3] = { 255, 128, 64 };

 

 - constant 변수를 사용한다면, 배열 내의 값을 명확하게 확인이 가능하겠습니다.

	// constant 변수 사용하여 명확하게 확인 가능
	cout << "Red: " << colors[red] << endl;
	cout << "Green: " << colors[green] << endl;
	cout << "Blue: " << colors[blue] << endl;

 

2.  열거형 enumerate 활용

 - enum을 생성하면, enum 내에 생성된 변수는 0, 1, 2, ... 순서대로 정의됩니다.

enum Color
{
	// enum 내의 값은 상수임.!!
	Red, Green, Blue
	// Red = 0, Green = 1, Blue = 2 와 같음.
};

 - enum을 사용한다면, 배열 내의 값을 명확하게 확인이 가능합니다.

 - 평균을 구하는 것도 어렵지 않습니다. 아래 코드를 확인하여 보십시오.

	// enum 사용하여 명확하게 확인 가능
	cout << "Red: " << colors[Red] << endl;
	cout << "Green: " << colors[Green] << endl;
	cout << "Blue: " << colors[Blue] << endl;
	int avg0 = (colors[Red] + colors[Green] + colors[Blue]) / 3;
	cout << "평균: "<<avg0 << endl;

 

 - 일반적으로, 평균을 일반화하여 구할 수도 있습니다.
   하지만, 이것의 단점으로는 colors 개수가 변경이 되면 for 구문 내의 iteration 숫자와 나누는 숫자를 수동으로 변경해야 한다는 것이 있습니다.

	//평균을 좀 더 일반화하여 구할 수도 있음.
	int total = 0;
	for (int i = 0; i < 3; i++)
	{
		total += colors[i];
	}
	cout << "평균: " << total / 3 << endl;

 - 구조체를 이용하는 방법도 있겠습니다.

struct ColorStruct
{
	int red;
	int green;
	int blue;
};

int main()
{

	// 구조체 활용도 가능함.
	ColorStruct cs = { 255, 128, 64 };
	int avg = (cs.red + cs.green + cs.blue) / 3;
	cout << "평균: " << avg << endl;

}

 - enum을 활용한다면, colors의 size가 변경되더라도 수동으로 수정할 필요가 없습니다.

enum ColorEnum
{
	Red2, Green2, Blue2, Alpha2, SIZE
};

int main()
{
	// enum은 다음과 같이 활용이 가능함.
	int Tot = 0;
	int newColors[SIZE] = { 255, 128, 64 }; // alpha는 초기화하지 않아서 0임.
	for (int i = 0; i < SIZE; i++)
	{
		Tot += newColors[i];
	}
	cout << "평균: " << Tot / 3 << endl;
}

 

 

3. enum을 활용한 bit-wise 연산자 활용

 - 텍스트의 속성을 나타내는 enum을 만들어 보겠습니다.

enum TextAttribute
{
	// 2의 제곱수로 설정
	Bold = 1,
	Underline = 2,
	Italic = 4,
	Strikethrough = 8
};

 - bit 연산자를 통하여 텍스트의 속성을 부여할 수 있습니다.

	int textAttrs = 0; // 텍스트의 속성을 저장
	textAttrs |= Bold; // or 연산자 활용하여, 텍스트 속성을 bold로 설정하였음.
	textAttrs |= Underline; // or 연산자 활용하여, 텍스트 속성에 밑줄 추가
	if (textAttrs & Underline)
		cout << "텍스트 속성에 Underline 되어 있음." << endl;
	if (!(textAttrs & Italic))
		cout << "텍스트 속성에 Italic 없음." << endl;

	cout << "텍스트 속성 출력" ;
	cout << textAttrs << endl; // 0011

 - enum은 범위 지정 연산자를 사용할 수 있습니다.

	// 다음과 같이 범위 지정 연산자 사용 가능
	textAttrs |= TextAttribute::Bold;

 

 

4. enum의 단점 및 Scoped enumerate

 - enum이 여러개 있는 경우, 같은 변수명을 쓸 수 없습니다.

enum TextA
{
Bold
}
enum CircleA
{
// Bold // 에러 발생!
}

 - Scoped enumerate를 활용하여 이러한 문제를 해결할 수 있습니다.

 - Scoped enum 내의 변수를 integer를 사용할 경우 형변환 하여 사용이 가능합니다.

// 범위가 있는 열거형을 통해, enum 내의 const를 여러 enum에서 사용할 수 있게 되었음.
// scoped enumerate
enum struct TextA
{
	Bold = 1
};
enum struct Circle
{
	Bold = 1
};

int main()
{
	int textA = 0;
    textA |= TextA::Bold;
    
   	// Scoped enumerate는 형변환 가능
	int sum = int(TextA::Bold) + int(Circle::Bold);
}

 

 

5. enumerate 장점

 - 안전하고 명확하게 사용이 가능함! (아래와 같이 불편하고 복잡해 보이지만, 명확하고 안전함!!)

 - (또한, enum 생성 시 변수형 지정이 가능함.)

enum struct Color
{
	Red, Green, Blue, SIZE
};
enum Color_Test : int64_t
{
	Red = 1000000000
};

int main()
{
	// 아래와 같이 불편하게 보이지만, 더 안전하고 명확하게 사용이 가능 함.
	int colors[(int)Color::SIZE] = { 255,128,64 }; // 이렇게 써야 함!
	colors[(int)Color::Red];

	cout << Red << endl;
}
반응형