가능한 경우의 수가 제한적인 경우, 이를 열거할 수 있다. 컴퓨터가 이해하기엔 정수와 다르지 않지만, 컴파일러에서는 enum으로 지정된 원소 외의 것이 들어오면 잡을 수 있다.
- 정수형 상수의 집합 (부동소수점은 안된다.)
- 각 원소마다 고유의 이름을 가짐
- 집합 역시 고유의 이름을 가짐
- enum은 변수로 사용 가능
- enum은 사전에 정의된 값만 대입 가능하고, 정수형은 정수형 범위에 있는 어떤 값이든 대입 가능하다.
열거형의 정의(기본형)
유사한 성질을 가진 정보들을 나열할 때 정수형 상수보다는 enum을 사용하도록 한다.
1 2 3 4 5 6 7 8 9 10
| //정수형 상수 const int HOME = 1; const int SCHOOL = 2;
//enum으로 나열 enum EBookmark { HOME, SCHOOL };
|
1 2 3 4 5 6 7
| enum <이름> { <원소1>, <원소2>, ..., <원소n> };
|
- 정의는
함수 밖
에서 한다.
- 첫 번째 원소의 기본값은 0
- 아무 값도 대입해주지 않으면 원소의 값은 1씩 증가한다.
1 2 3 4 5 6 7 8 9 10
| class Program { enum EDirection { North, //0 South, //1 East, //2 West //3 }; }
|
열거형의 정의(원소 값 직접 정의)
각 원소에 원하는 값을 대입 가능
1 2 3 4 5 6 7
| enum EDirection { North = 5, South = 10, East = 15, West = East + 10 }
|
1 2 3 4 5 6 7
| enum EDirection { North = 5, South, //6 East, //7 West //8 }
|
대입 없이 변수를 정의만 하면 값이 0인 원소가 기본
으로 들어간다.
1 2 3 4 5 6 7 8 9 10
| enum EDirection { North, South, East, West };
//메인 함수 EDirection direction; //EDirection.North (대입 없이 기본값만 정의했으므로 기본값은 0)
|
1 2 3 4 5 6 7 8 9 10
| enum EDirection { North = -2, South, //-1 East, //0 West //1 };
//메인 함수 EDirection direction; //EDirection.East (초기화를 해주지 않으면 0인 East가 기본값이 된다.)
|
열거형 변수 정의 및 대입
1
| <열거형 이름> <변수명> = <열겨형 이름>.<열거형 원소>
|
열거형 변수에는 해당 열거형의 원소만 대입 가능하다.
1 2 3 4 5 6 7
| enum EDirection { North, South, East, West };
|
1 2 3 4 5
| enum ESex { Female, Male, };
|
1 2 3 4 5 6 7
| //메인 함수 EDrection direction1; //선언 EDrection direction2 = EDrection.East; //대입
EDrection direction1 = EDrection.East; //OK EDrection direction2 = ESex.Male; //컴파일 오류 EDrection direction3 = 1; //컴파일 오류
|
EDrection direction2 = ESex.Male;
이나 EDrection direction3 = 1;
처럼 EDrection에 없는 값은 넣으면 컴파일 오류가 발생한다.
enum을 쓰면 좋은 점
- 코드가 읽기 편하다.
- enum에 지정된 값 외에 다른 값이 들어가면 컴파일 오류가 발생하여 문제 발생을 사전에 예방할 수 있다.
- 함수 매개변수로 쓰이면 함수가 요구하는 인자형을 빨리 알 수 있으므로 함수에 잘못된 값이 넘어가는 것을 예방할 수 있다.
enum의 꼼수
enum의 마지막 원소를 배열 생성 시 배열 원소 개수로 사용 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| enum EDirection { North, South, East, West, MAX };
//어떤 함수 string[] directions = new string[(int)EDrection.MAX];
for (int i = 0; i < directions.Length; ++i) { //코드 //directions[i]로 접근 가능 }
|
어서트(Assert)
코드 검증을 위한 코드.
enum을 수정하고, 그 enum을 쓰는 함수의 case문은 수정하지 않을 경우 해결하는 방법이 어서트이다.
- 절대로 발생하지 않아야 하는 조건을 런타임 중에 검사
- 만약 발생한다면 코드가 올바르게 동작하지 않는 것
- 함수의 선조건 검사에 쓰기 적당.
- 디버그 모드에서만 동작
- 릴리즈 모드에서 어서트 함수는 마치 주석처럼 무시된다.
- 릴리즈 모드에서 동작하게 되면 성능 저하가 발생한다.
- 최종 제품의 성능저하 없이 개발 중에 문제를 고치는 바람직한 방법.
1 2 3 4 5 6 7
| //방식 1 Debug.Assert(<표현식>); Debug.Assert(menu < 5); // menu가 5 이상일 때 어서트 발생
//방식 2 어서트가 발생했을 때 보여줄 메세지를 함께 작성 Debug.Assert(<표현식>, <메세지>); Debug.Assert(menu < 5, "Wrong menu number!");
|
- Debug.Assert()를 사용하기 위해서
System.Diagnotics
라이브러리를 추가해야 한다.
using System.Diagnotics
로 추가한다.
- Assert() 안에 들어가는 조건은 참이라고 가정하고 작성되는 것이므로
조건이 거짓일 때 프로그램은 일시 중단
되고, 어서트 메세지가 출력창에 출력된다.
References
실무 프로그래밍 입문(C#)