Front-end Developer

0%

열거형(enum)과 어서트(Assert)

가능한 경우의 수가 제한적인 경우, 이를 열거할 수 있다. 컴퓨터가 이해하기엔 정수와 다르지 않지만, 컴파일러에서는 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#)