c언어 enum : 의미를 명확하게 해 보자.

코딩/C 2019. 10. 4. 18:28

 제목에도 달았다 시피, c언어에서 enum은, 의미를 명확하게 하기 위해서 쓰입니다. 저번 시간에 했었던, student를 예로 들어 봅시다. student에는, 이름과, 과목별 점수가 있었을 겁니다.

 

 

 단순하게, "chogahui"라는 이름을 가지는 학생이, 과목 1번부터 과목 5번까지 몇 점을 맞았는지를 출력해 주는 함수입니다. 여기까지만 보면 그렇게 어려울 거 같지는 않습니다. 그런데, 이런 경우를 생각해 봅시다. chogahui의 Korean 점수는 몇 점이고, Math 점수, English 점수는 각각 몇 점일까요? 이걸 제 1과목, 2과목, 3과목으로 접근하기는 헷갈릴 여지가 다분합니다.

 

 


 그러면 이걸 어떻게 해야 할까요? 보통, 과목은 subject_code로 불립니다. 그리고, 이 안에, KOREAN과 MATH와 ENGLISH 등등을 열거할 거에요. '나열' 하는 거라고 생각하시면 좋겠습니다.

 

 

 

 5개의 열거자를 가지는 열거형을 선언하도록 합시다. 이 경우, default로, KOREAN은 0, MATH는 1, ENGLISH는 2로, ... 이런 식으로 값을 가집니다. 그러면 우리는 최소한, 국어를 0번 과목이라고 말을 하지 않아도 됩니다. 단순히, 이렇게 접근을 하면 되는 것입니다.

 

 

 그러한가요? 실행 결과는 아래와 같습니다.

 

 

 국어 성적을 72로 업데이트 했어요. 그리고 score[KOREAN]으로 접근했더니, 72라는 값이 나왔음을 알 수 있어요. 그냥 0번 과목에 비해서, '국어' 라는 과목으로 접근했으니, 판독성은 향상이 된 셈입니다. enum의 사용 목적이라고 할 수 있어요. 그러면, 이런 것도 가능할까요? 예를 들어서, 국어는 10, 수학은 20, 영어는 5, 과학은 13, 사회는 4로 할당하고 싶습니다.

 

 

 그러면 이렇게 하시면 됩니다. KOREAN을 출력해 볼까요?

 

 

 10이 나옵니다.

 

 


 이제, day 열거형을 선언해 봅시다.

 

 

 그리고, main 함수를 아래와 같이 작성해 봅시다.

 

 

 실행 결과가 어떻게 나올까요? 아무것도 출력이 되지 않을까요?

 

 

 사실 아닙니다. 그림을 그려보면, KOREAN이 0, MATH는 1, ... 이런 식으로 열거가 되어 있어요. 이 때, SCIENCE가 3으로 값이 set이 되어 있어요. 그런데 이 3의 값은 WED도 가지고 있단 말입니다. 10을 7로 나누면 3인데요. 이 3은, WED와도 일치하겠지만, SCIENCE와도 일치합니다.

 

 

 따라서, sci가 출력이 됩니다. 사실, 16번째 줄에 있는 문장들을 잘 풀어서 써 보면 아래와 같은데요.

 

 

 

 enum 형이 int형으로, 그리고 int형이 enum으로 형 변환이 될 수 있어요. 심지어, 사칙 연산도 되었어요. 이는 열거 타입에 대한 타입 검사가 이루어 지지 않았다는 것을 의미해요. 그러면 어떤 연산도 가능할까요? 당연하게도, 일요일에 1을 더하는 이런 연산도 가능할 거에요.

 

 

 분명한 것은, 열거형 변수를 C에서는 정수형 변수처럼 취급한다는 것입니다. 이것은 이 포스팅에서 제일 중요한 말입니다. 당연하게도, KOREAN + MATH라던지, (1+SAT) * MON 도 적법한 연산일 겁니다. 그러면 범위 바깥의 값도 할당을 받을 수 있을 거에요. 잘 쓰기는 굉장히 어렵다는 겁니다.