본문 바로가기
C++/C++ 기초 문법

[C++] 열거 타입

by 후야- 2023. 12. 22.

📙 열거 타입

무언가를 제한하고 싶다면 enum 타입을 사용한다.

enum class numBer {King, Queen, Rook, Pawn };
numBer a{ numBer::Rook };

-> enum 타읍을 구성하는 멤버는 내부적을 정숫값으로 표현된다. {0, 1, 2, 3}

 

◾ 멤버마다 할당되는 값을 별도로 지정 할 수도 있다.

enum class PieceType
{
	king= 1,
	Queen,
	Rook = 10,
	Pawn,
};

PieceType piece{ PieceType::king };
PieceType piece1{ PieceType::Queen };
PieceType piece2{ PieceType::Rook };
PieceType piece3{ PieceType::Pawn };

-> 열거 타입의 멤버에 값을 따로 할당하지 않으면 컴파일러는 이전 멤버의 값에 1을 더한 값으로 알아서 할당한다.

 

 상위 스코프에 똑같은 이름이 있더라도 충돌되지 않는다.

int main()
{
	enum class State { UnKnown, Started, Finished};
	enum class Error{ None, UnKonwn};
	return 0;
}

-> 서로 다른 열거 타입에 동일한 이름의 멤버가 존재할 수 있다.

 

C++ 20 부터는 using enum 으로 선언하면 열거값을 길게 풀어 쓰지 않아도 된다.

using enum PieceType;
PieceType mango{ Rook };
// PieceType piece2{ PieceType::Rook };

-> 이 기능은 조심해서 사용해야 한다. 스코픅 너무 크면 이름이 충돌하는 현상이 발생할 수 있다.

 

📗 예전 방식의 열거 타입

예전에 작성된 레거시 코드에서는 enum class 가 아닌 enum 으로 선언했다.

int main()
{
	enum pieceTypes { King, Queen, Rook, Pawn };
	pieceTypes abc{ king };
	return 0;
}

-> 이러게 사용하면 상위 스코프에 같은 이름이 있으면 컴파일 에러가 발생한다.

-> 예전 방식으로 열거 타입을 정의할 때는 멤버 이름을 고유한 이름으로 지정해야 한다.

-> 하지만 예전 방식은 강타입이 아니므로 안전하지 않아서 잘 사용하지 않는다.

'C++ > C++ 기초 문법' 카테고리의 다른 글

[C++] 조건문 if , switch 문  (0) 2023.12.23
[C++] 구조체  (0) 2023.12.23
[C++] 인라인(inline) 함수  (0) 2023.12.22
[C++] 매개변수의 디폴트 값  (0) 2023.12.21
[C++] 함수 오버로딩  (0) 2023.12.21