c++에 내장되어 있는 자료형이 아닌, 사용자 정의 자료형. 열거된 유형(열거형)은 가능한 모든 값이 기호 상수(열거형)으로 정의되는 자료형이다. 열거형은 enum 키워드를 통해 정의된다.
열거형을 정의해도 메모리는 할당되지 않는다. 열거된 유형의 변수가 정의된 경우에 해당변수에 대한 메모리가 할당된다.
각 열거자는 쉼표(,)로 구분되고 전체 열거는 세미콜론으로 끝난다.
#include <iostream>
using namespace std;
//열거형 자료형 만들기
enum Job{
Warrior,
Archer,
Magician
}; //enum 자체는 세미콜론으로 끝남.
int main(){
//enum 타입의 자료형을 가진 변수를 선언, 단순 자료형
Job myCharacterJob = Warrior;
myCharacterJob = Job::Warrior;
//이런식으로 선언 가능
Job myCharacterJob(Warrior);
Job myCharacterJob{Warrior};
}
아래 코드처럼 사용 가능하다
#include <iostream>
using namespace std;
// 열거형 자료형 만들기
enum Job{
Warrior,
Archer,
Magician
};
void AttackWarrior(){
cout << "근접 공격 시작";
}
int main(){
// enum 타입의 자료형을 가진 변수를 선언하고 초기화
Job myCharacterJob = Warrior; // 올바른 방식으로 초기화
// 사용 예시
if (myCharacterJob == Warrior) {
AttackWarrior();
}
return 0;
}
enum 식별자는 대문자로 시작하는 경우가 많으며, 열거자는 모두 대문자로 이름이 지어진다. 열거자는 열거와 같은 네임스페이스에 배치되므로(같은 메모리에 같이 존재), 열거자 이름은 같은 네임 스페이스 내의 여러 열거에서 사용할 수 없다.
// 열거형 자료형 만들기
enum Job{
Warrior,
Archer,
Magician
};
enum Color
{
RED,
BLUE, // BLUE is put into the global namespace
GREEN
};
따라서 이름 충돌을 방지하기 위해 열거자 앞에 COLOR와 같은 접두어를 붙이는 것이 일반적이다.
각 열거자는 열거 목록의 위치에 따라 정수 값이 자동으로 할당된다. 기본적으로 첫번째 열거자에는 정수 값 0이 할당되며, 각 이후 열거자에는 이전 열거자보다 1 더 큰 값이 할당된다.
// 열거형 자료형 만들기
enum Job{
Warrior, // assigned 0
Archer, // assigned 1
Magician // assigned 2
};
Job myJob(Warrior);
cout << myJob; //0
위 코드는 0을 출력한다.
아래의 코드는 숫자를 이용해 열거자를 표현한다.
enum Job{
Warrior, // assigned 0
Archer, // assigned 1
Magician // assigned 2
};
int myJob = 2;
if(myJob == 0){
...
}
else if(myJob == 1){
...
}
....
위의 코드처럼 숫자를 이용해 직업을 표시할 수도 있다. 다만 이렇게 하면 열거자에 맞는 숫자를 외워야하기 때문에 잘 쓰이지 않는다.
또한 열거형을 작성할때 숫자를 대입해서 푸는 방법또한 있다.
enum Job{
Warrior = 1001, // assigned 0
Archer = 1002, // assigned 1
Magician = 1003 // assigned 2
};
Job myJob = 1001;
if(myJob == 1001){
...
}
else if(myJob == 1002){
...
}
....
enum WarriorType{
Fire,
Water,
Wind
};
enum MagicianType{
Fire,
Water,
Wind
};
위의 코드처럼 작성하면 아까 열거형의 특징처럼 같은 메모리내에 이름이 들어가기 때문에 코드에 오류가 발생한다.
이를 방지하기 위해 class 타입을 이용한다
enum class WarriorType{
Fire,
Water,
Wind
};
enum class MagicianType{
Fire,
Water,
Wind
};
//클래스의 인스턴스
WarriorType myCharacterType = WarriorType::Water;
=> 이렇게 하면 정상적으로 돌아간다. 같은 이름을 써야할 경우가 온다면 enum보단 enum class를 이용한다. 언리얼의 경우 enum class만 사용한다.
다만 클래스 형식으로 enum을 만들 때 숫자를 사용하면 조건문에서 에러가 뜬다. 아래의 코드처럼 변경이 필요하다.
enum class Job{
Warrior = 1001, // assigned 0
Archer = 1002, // assigned 1
Magician = 1003 // assigned 2
};
Job myJob = Warrior;
//int형으로 변형해서 사용하겠다고 명시적으로 선언
if(static_cast<int>(myJob) == 1001){
...
}
else if(static_cast<int>(myJob) == 1002){
...
}
....