본문 바로가기
Program Language/c++

c++ 기초(enum)

by 토담이아빠 2023. 1. 2.

enum

 

이글은 "전문가를 위한 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

댓글