[C/C++] enum, enum class

지상 최악의 개발자·2024년 1월 22일

열거형이란?

프로그램을 만들다보면 C/C++가 제공하는 자료형만으로는 뭔가 아쉬울때가 있다. C/C++는 그런 우리를 위해 사용자가 마음대로 만들어 쓸 수 있는 enum, enum class, struct, class, union과 같은 사용자 정의 자료형을 제공한다.
열거형(enum)은 특정 정수에 이름을 붙여 가독성을 높이는데 유용하다.
->열거형은 열거한 모든 값이 지정한 정수값으로 컴파일 타임에 변경된다.
->열거형을 정의해도 메모리에는 할당되지 않는다. 변수를 선언한 경우에 메모리가 할당된다.
->각 열거자의 값은 정수상수이지만, int 등 정수형과 비교하려면 형변환 연산자가 필요하다. (원래는 됐는데 enum class 나오면서 불가능해짐.)

📌enum

사용법

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 class

위처럼 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;

전방선언이 가능한데, 전방선언시 컴파일러가 미리 메모리를 잡아놓을 수 있도록 데이터 타입을 꼭 지정해주어야 한다.

0개의 댓글