이글은 "전문가를 위한 c++(개정4판)"을 학습한 내용을 직접 실습해보며 정리한 Review용 글입니다.
enum(열거타입)
열거 타입은 변수를 특정 값의 범위로 제한하고 싶을 때 많이 사용하는 타입입니다. 예를 들어 체스 게임에서 체스말을 표현하는 변수의 값을 4가지 값으로 제한하고 싶다면 다음과 같이 enum 타입의 변수를 새로 정의해서 사용하면 됩니다.
enum PieceType { PieceTypeKing, PieceTypeQueen, PieceTypeRook, PieceTypePawm };
이렇게 선언한 열거형 타입 변수에 값을 대입하거나 변화시키려는 행위를 하면 컴파일 에러가 발생합니다.
PieceType myPiece = PieceTypePawm;
myPiece = 0; // 값 대입 : 컴파일 에러
myPiece++; // 후행증가 : 컴파일 에러
결과
enum 타입의 멤버들은 특별히 값을 지정하지 않으면 0부터 순차적으로 할당(1씩 증가)됩니다. 위의 경우 PieceTypeking = 0, PieceTypeQueen = 1, PieceTypeRook = 2, PieceTypePawm = 3과 같이 할당됩니다.
enum타입을 정의할 때 각 멤버에 해당하는 정수값을 직접 지정할 수 있습니다. 다음과 같이 시작값을 0이 아닌 다른 값으로 지정하면 시작값에서 부터 순차적으로 할당됩니다.(PieceTypeQueen = -9, PieceTypeRook = -8, PieceTypePawm = -7)
enum PieceType { PieceTypeKing = -10, PieceTypeQueen, PieceTypeRook, PieceTypePawm };
또한 중간에 할당값을 변경하면 그 다음 부터 순차적으로 할당됩니다.(PieceTypeKing = 0, PieceTypeQueen = 1, PieceTypRook = -10, PieceTypePawm = -9)
enum PieceType { PieceTypeKing, PieceTypeQueen, PieceTypeRook = -10, PieceTypePawm };
enum class
위에 enum으로 정의한 PieceType을 다음과 같이 enum class로 정의하면 타입에 안전한 형태로 쓸 수 있습니다.
enum class PieceType
{
King = 1,
Queen,
Rook = 10,
Pawm
};
enum 타입은 항상 정수로 해석하기 때문에 선언한 형태에 관계없이 모든 enum타입을 서로 비교할 수 있지만 enum class로 정의한 열거 타입은 자동으로 정수 타입으로 변환되지 않기 때문에 다음과 같이 쓸 수 없습니다.
cout << PieceType::Queen << endl; // 컴파일 에러
if (PieceType::Queen == 2) { /* ... */ } // 컴파일 에러
제대로 사용하기 위해서는 다음과 같이 명시적으로 형변환을 해야합니다.
cout << static_cast<int>(PieceType::Queen) << endl;
if (static_cast<int>(PieceType::Queen) == 2) { /* ... */ }
enum class로 선언한 변수는 멤버 사용 시 항상 스코프(::)를 써야합니다. (enum은 써도되고 안써도 됩니다.) 또한 멤버의 타입을 다음과 같이 바꿀 수 있습니다.
enum class PieceType : unsigned long
{
King = 1,
Queen,
Rook = 10,
Pawm
};
'Program Language > c++' 카테고리의 다른 글
c++ 기초(조건문(if ~ else if ~ else)) (0) | 2023.01.03 |
---|---|
C++ 기초(구조체) (0) | 2023.01.03 |
c++ 기초(연산자) (0) | 2022.12.29 |
c++ 기초(리터럴 & 변수) (0) | 2022.12.26 |
c++ 기초(namespace) (0) | 2022.12.22 |
댓글