패스트캠퍼스 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;
}
'공부 > C++' 카테고리의 다른 글
C++, 부동소수점 (0) | 2024.04.15 |
---|---|
C++ Integer, 정수 최대 최소 및 크기 (0) | 2024.04.12 |
백준 알고리즘 1004번, 어린왕자 (C++) (0) | 2024.01.08 |
백준 1008번 (C++) (3) | 2024.01.01 |
C++ 백준 1002번 (1) | 2023.12.25 |
선형 대수 - 13. 선형 부분공간 (4) | 2023.11.02 |
선형 대수 - 8. 벡터의 정의 및 연산 (7) | 2023.09.26 |
C++과 Python의 차이, 컴파일 언어와 인터프리터 언어의 차이 (83) | 2023.09.07 |