열거형 - 가독성을 위한 타입

예시코드)
#include "Header.h"
enum Gender {
MALE, FEMALE
};
class Student {
public:
char name[10];
int student_no;
Gender gender;
Student(const char* name, int student_no, Gender gender) {
strcpy(this->name, name);
this->student_no = student_no;
this->gender = gender;
}
void printInfo() {
printf("%s 학생의 학번은 %d 입니다. 성별은 %s 입니다.",
//Gender가 MALE이면 남성 아니면 여성 ?의 의미 잘 이해하기
name, student_no, gender == Gender::MALE ? "남성" : "여성"
);
}
};
int main() {
Student* student = new Student("말자하", 2, Gender::FEMALE);
student->printInfo();
return 0;
}
**상황에 따라 else if 보다 가독성이 좋아질 수가 있다.(switch 문과 enum을 통한 가독성 향상)
예제코드)
#include "Header.h"
enum Month {
//JAN 에 1을 주었기에 1-12까지 숫자가 배정된다 1을 안주면 0부터 시작이다.
JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG,SEP, OCT, NOV, DEC
};
int main() {
Month m = Month::JAN;
switch (m)
{
case Month::JAN: printf("1월입니다."); break;
case Month::FEB: printf("2월입니다."); break;
case Month::MAR: printf("3월입니다."); break;
case Month::APR: printf("4월입니다."); break;
case Month::MAY: printf("5월입니다."); break;
case Month::JUN: printf("6월입니다."); break;
case Month::JUL: printf("7월입니다."); break;
case Month::AUG: printf("8월입니다."); break;
case Month::SEP: printf("9월입니다."); break;
case Month::OCT: printf("10월입니다."); break;
case Month::NOV: printf("11월입니다."); break;
case Month::DEC: printf("12월입니다."); break;
}
printf("%d", m);
return 0;
}

예시코드)
#include "Header.h"
//enum class 사용법
enum class Month {
JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
};
int main() {
//enum 클래스는 타입 생략 불가(Month)
Month m = Month::OCT;
//enum 클래스에서 형변환을 해야 한다.
int value = (int)m;
switch (m)
{
case Month::JAN: printf("1월입니다."); break;
case Month::FEB: printf("2월입니다."); break;
case Month::MAR: printf("3월입니다."); break;
case Month::APR: printf("4월입니다."); break;
case Month::MAY: printf("5월입니다."); break;
case Month::JUN: printf("6월입니다."); break;
case Month::JUL: printf("7월입니다."); break;
case Month::AUG: printf("8월입니다."); break;
case Month::SEP: printf("9월입니다."); break;
case Month::OCT: printf("10월입니다."); break;
case Month::NOV: printf("11월입니다."); break;
case Month::DEC: printf("12월입니다."); break;
}
printf("%d", m);
return 0;
}

일반적인 enumeration의 문제점에 대해 살펴봅니다. enum의 enum 상수가 동일한 이름을 갖게 되는 것을 C / C++ 에서는 허용하지 않고 있습니다.
왜 이런것이냐.
C++의 이해할 수 없는 동작에는 항상 이것만 생각하시면 됩니다 '퍼포먼스' 하지만 지금은 그런 좀스런 퍼포먼스 정도는 컴퓨터 하드웨어의 성능 향상으로 얼마든지 커버가 되기 때문에 의미 없는 코딩 스타일이 된 것이죠
그 와중에 기존 소스코드와의 호환성을 유지하기 위해 아직 enum이 남아있을 뿐입니다.