프로그램을 만들다보면 C/C++가 제공하는 자료형만으로는 뭔가 아쉬울때가 있다. C/C++는 그런 우리를 위해 사용자가 마음대로 만들어 쓸 수 있는 enum, enum class, struct, class, union과 같은 사용자 정의 자료형을 제공한다.
열거형(enum)은 특정 정수에 이름을 붙여 가독성을 높이는데 유용하다.
->열거형은 열거한 모든 값이 지정한 정수값으로 컴파일 타임에 변경된다.
->열거형을 정의해도 메모리에는 할당되지 않는다. 변수를 선언한 경우에 메모리가 할당된다.
->각 열거자의 값은 정수상수이지만, int 등 정수형과 비교하려면 형변환 연산자가 필요하다. (원래는 됐는데 enum class 나오면서 불가능해짐.)
enum ChessPiece{
PAWN,
ROOK,
KNIGHT,
BISHOP,
QUEEN,
KING
};
열거형 키워드, 열거형 이름, 구성 상수 이름 순서로 적는다. 값을 지정하지 않으면 0부터 1씩 차례로 증가하며 값을 지정하면 지정된 값부터 1씩 증가한다.
enum ChessPiece{
PAWN = 1,
ROOK,
KNIGHT,
BISHOP,
QUEEN = 10,
KING
};
PAWN = 1, ROOK = 2, KNIGHT = 3, BISHOP = 4, QUEEN = 10, KING = 11 이 된다.
enum ChessPiece{
PAWN,
ROOK,
KNIGHT, //이름 중복으로 오류가 난다.
BISHOP,
QUEEN,
KING
};
enum CharacterClass{
KNIGHT, //이름 중복으로 오류가 난다.
WIZARD,
ARCHER
};
열거자의 값들은 같은 namespace에 속하므로 같은 이름을 사용할 수 없다.
위처럼 enum은 별도의 namespace를 가지지 못한다는 단점을 가지고 있었다. 이 문제점을 보완하기 위해 등장한것이 enum class다.
enum class ChessPiece{
PAWN,
ROOK,
KNIGHT,
BISHOP,
QUEEN,
KING
};
enum class CharacterClass{
KNIGHT,
WIZARD,
ARCHER
};
이후 enum class명::열거자로 접근하면 이름중복 걱정없이 사용할 수 있다.
//명시적 형변환 사용
int main() {
if(static_cast<int>(ChessPiece::PAWN) == 0) {
std::cout << "PAWN is 0." << std::endl;
}
}
enum class를 int와 비교하려면 명시적 형변환을 사용해야한다.
enum class CharacterClass : short{
KNIGHT,
WIZARD,
ARCHER
};
해당 열거형의 크기가 형식에 맞춰진다.
enum class CharachterClass : short;
전방선언이 가능한데, 전방선언시 컴파일러가 미리 메모리를 잡아놓을 수 있도록 데이터 타입을 꼭 지정해주어야 한다.