728x90
enum (열거형)
- enum 타입 내부 멤버들에게 정수(int)값으로 이름을 붙일 때 사용한다.
- 주로 내부 멤버이름을 대문자로 이름 짓는경우가 많다.
- 각 열거자들의 값은 이전 열거자 값에 +1이 증가 된 값으로 알아서 할당된다.
- ex) enum days {Sunday = 1 , Monday, Friday=10, Wednesday};
Monday == 2 (True) , Wednesday == 11 (True)
- ex) enum days {Sunday = 1 , Monday, Friday=10, Wednesday};
- 각 열거자들의 값은 이전 열거자 값에 +1이 증가 된 값으로 알아서 할당된다.
- 만약 enum 타입의 첫 번째 멤버에 값을 생략하면 컴파일러가 알아서 0부터 대입 해준다.
- 실제 메모리를 잡아먹지 않는다. 단 열거자가 할당된 변수에 대해 메모리가 할당됨.
그럼 열거형을 쓰면 좋은점은? 왜 써요?
- 위험한 상황(의도하지 않게 타입의 값이 변경되어 다르게 동작 하는 상황들)을 피할 수 있다.
이 그림에서 유닛 타입에는 지상, 대공, 수중 유닛 3종류를 각각 1 , 2 , 3 을 이용해 구분 지었다.
- slime이 생성될때 이 유닛은 지상유닛(Ground)이다.
- 하지만 내부 코드나 실수에 의해 -1과 같이 유닛타입을 벗어나는 숫자가 대입되었다.
- 이 경우 예상치 못한 유닛이 될 수 있다.. (물속에서 하늘을 공격하는 슬라임?...)
열거형은 변수에 지정할 수 있는 값의 범위를 제한하기 때문에 이러한 문제를 방지할 수 있다.
열거 타입에 일반 변수처럼 값을 직접 대입하거나 연산을 하는경우 대부분 컴파일러에서 경고나 에러를 발생시킨다.
enum class (더 엄격한 열거 타입)
enum class로 정의한 열거 타입은 유효 범위 (스코프)가 자동으로 확장 되지 않는다.
- 값이 자동으로 증가하지 않는다는 말이 아니다.
- 값이 자동으로 증가하지 않는다는 말이 아니다.
즉 아래 그림처럼 열거타입의 멤버 값 (그림에서는 UT_Ground, UT_antiAir, UT_UnderWater)을 사용할때마다 :: 스코프 지정 연산자를 붙여야 한다.
아래 그림처럼 UnitType2::UT_Ground 이라고 하는 UnitType2의 범위연산자를 통해서 사용해야한다.
또한 열거타입은 자동으로 정수타입으로 변환 되지 않는다. 그래서 아래 그림과 같은 표현은 불가능하다.
열거타입은 정수 타입으로 저장 되지만, enum class UnitType2 :: unsigned long 과 같이 내부 표현 타입을 바꿀수 있다.
300x250
'Programing_Language > C++' 카테고리의 다른 글
템플릿(Template) (1/2) (0) | 2020.12.13 |
---|---|
2차원 동적 배열 할당과 해제 (배열 vs 벡터) (0) | 2020.12.07 |
VisualStudio 내부 스택 크기 조절방법 (0) | 2019.04.06 |
[MFC] 문자열 변환 매크로 및 사용 주의사항 (0) | 2019.04.06 |
[MFC] CFileDialog 클래스 (0) | 2019.04.06 |
댓글