C 프로그래밍 입문/나열형 데이터

나열형(enumerated type) 데이터는 프로그래밍 작업을 할 때 편의를 돕기 위한 것으로 반드시 써야 하는 것은 아니고, 전처리 문의 #define을 이용하는 편이 편리한 경우가 많기 때문에 그다지 자주 쓰이지 않는다. 그러나 나열형 데이터가 필요한 시점에서 적절히 사용한다면 프로그래밍이 더 단순해 지고 실수를 줄일 수 있게 된다. 이해를 위해 일단 다음의 프로그램을 보도록 하자:

gender = 0; /* 0 for male, 1 for female */

어던 프로그램의 일부인지는 모르겠지만, gender라는 변수에 대상이 남자면 0을 입력하고 여자면 1을 입력하기로 결정한 모양이다. 문제는 모든 코드에 위와 같이 주석을 달아 주기엔 배보다 배꼽이 더 커진다는 문제가 있다는 것이다. 혼자 프로그램을 작성하는 경우에도 프로젝트의 기간이 길거나 프로젝트의 크기가 큰 경우에는 스스로 헷갈릴 수 도 있거니와, 여럿이 함께 작업하는 경우라면 위와 유사한 상황이 벌어질 때 마다 모든 이들에게 그 사실을 알려주어야 한다는 어려움은 물론이고, 값을 잘못 사용하는 경우도 충분히 발생할 수 있다. 그러나 다음과 같은 코드를 사용할 수 있다면 이에대해 고민할 필요가 없을 것 이다:

gender = MALE;

오해하거나 실수하고 싶어도 쉽지 않을 것이다. 위와 같은 코드를 사용하기 위해서는 다음과 같이 작성해 주면 된다:

#include <stdio.h>

enum gendertype {
    MALE,
    FEMALE
};

int main (int argc, char *argv[]) {
    enum gendertype gender;
    gender = MALE;
    return 0;
}

프로그램을 작성할 때에 오해하기 쉬운 것이 하나 있는데, 변수에 값을 할당할 때 MALE 이라는 이름값을 사용했기 때문에 인쇄할 때 MALE 이라고 출력될 것이라 생각하기 쉽겠지만 사실 열거형은 int 타입의 변형이기 때문에 기본적인 취급은 정수형 다루는 것 과 동일하게 다루어 주어야 한다. 그렇기 때문에 다음과 같은 코드는 에러를 발생 시킬 것인데, 컴파일시 에러 메시지를 내보낼 수 도 있고, 실행시에 에러를 발생시킬 수 도 있다:

enum gendertype gender;
gender = MALE;
printf("gender: %s\n", gender);

배열형 데이터는 기본적으로 정수형 이기 때문에 정수형과 동일한 특성을 갖는다. 즉, 다음과 같은 코드도 사용이 가능하다:

gender = MALE;
gender = gender + 1;

열거형 데이터의 각 멤버는 실제로 정수 값 이라는 점을 이해하였다면, 할당된 정수값을 강제로 할당하기를 바라는 경우도 발생할 수 있을 것 이다. 예를 들어 MALE을 1로, FEMALE을 2로 하기로 결정하였다면 나열형 데이터 타입을 쓰기위해서는 지금까지 설명된 내용을 기초로 코드를 작성 한다면 다음과 같이 할 수 있을 것이다.

enum gendertype {
    NOGENDER,
    MALE,
    FEMALE
};

실제로 위와 동일한 역할을 하는 코드는 다음과 같다:

enum gendertype {
   MALE = 1,
   FEMALE
};

열거형 타입 멤버중 하나에게 값을 할당하면 그 이후에 따르는 다른 멤버들은 지정한 값으로 부터 1씩 증가하면서 값이 할당된다. 그러므로 위에서 지정된 멤버들은 MALE은 1, FEMALE은 2의 값을 갖게 된다. 동일한 방식으로, 다음과 같이 사용할 수 도 있다.

enum gendertype {
    MALE = 0,
    FEMALE = 128
};