본문 바로가기

무언가 만들기 위한 지식/C,C++,Embedded C

[c] Enum(열거형) Test

C에서 type중에 enum형이라는 것이 존재한다. (다들 아시다시피..)
enum형도 c에서 여기저기 사용됨에도 불구하고, 필자가 직접 사용할일이 별로 없어서 관심이 없던도중,
structure의 문제를 틀린후, 기초를 다시 챙겨야겠다는 생각에 테스팅을 시도해 보았다.

enum은 열거형으로 하나의 자료형에 들어갈 수 있는 자료들을 제한할때 쓰인다.
쉽게 예를 들자면 우리가 보통 사용하는 Boolean(또는 bool)에서 true or false 2가지 값만 취할 수 없는 경우이다.
이는 0, 1로 각각 내부적으로 값이 저장된다.
이런식으로 열거형이라는 선언으로 그 값에 저장될 수 있는 값을을 특정 개수로 제한할 수 있다.

직접 사용예제를 만들어 보았다. 예제를 통해서 그 특징을 알아보자.
[작성환경 : Window XP  작성툴 : Visual Studio 6.0   컴파일러 : Visual Studio 6.0  사용언어 : C]

 
3~4 Line :  typedef를 이용해 열거형 선언을 하였다. 선언방법은 structure와 같다. enum 다음에 태그명을 선언한 후 {}로 enum 내부 구조를 정의하고 마지막에 열거형으로 선언한 변수명을 적으면 된다. 예전에 언급했던 structure의 정의 및 선언, typedef 사용법에 맞추어 사용하면 이와 같다. (태그명은 역시 생략이 가능하다.)
7~8 Line :  typedef로 정의한 각 enum Type을 선언하였다.
10~12 Line : 요즘들어 민감해진 sizeof 관련 테스트를 하였다. 보면 enum type으로 선언된 변수를 출력하면 4byte 가 나온다는 것을 알 수 있다. 또한 enum Type 내부에 정의된 Attribute Value의 값도 4byte가 나온 것을 확인할 수 있다. enum 형 내부의 값들에게도 각각 메모리 공간이 할당된 모습을 볼 수 있다. 단 한번의 enum type 선언으로 값들은 상수화되어 고정된다. 또한 연산에도 사용할 수 없다. (enum type 변수들은 값에 접근이 가능함.- enum 내부적으로 선언된 속성들이 값 변경이 불가능 한 것임.)
또한 그냥 enum type을 sizeof 하게되면 4byte가 출력되게 된다.
종합해보면 결국 enum속성값들이 하나당 4byte씩 할당되고 선언된 변수 에게도 4byte가 할당된다.
3 Line의 경우 총 enum에 의해 12byte가(비록 typedef기는 하지만 개념적으로) 4 Line의 경우 32byte가 할당된다. 단 각 속성들은 상수화
14~18 Line : enum type으로 선언된 sexTest에 내부적인 man값을 넣었다. 물론 그외의 값을 넣으면 컴파일 에러가 발생한다. 그 후 %d로 출력하면 0이 나온 것을 알 수 있다.
이는 enum type의 특징이다.
enum이 선언되게 되면 내부적으로 속성들이 default로 0부터 1씩증가하며 할당이 된다. (마치 배열처럼)
자동으로 숫자가 할당된다. (4byte가 할당되는 것으로 보아 정수형으로 할당되는 듯 싶다.)
20~22 Line : 여기서 enum 변수의 특징을 알 수 있다. 위와 같이 테스트하면 +operator가 연산을 제공하지 않는다며 컴파일 에러가 발생한다. 비록 sexTest변수상에 0이 할당되어 있더라고 ++이나, +1등의 연산은 허용되지 않는다. 또한 enum 형 속성(ex : man) 에 대한 연산도 전혀 허용하지 않다.
24~26 Line : 기본적으로 enum type 변수 자체에 대한 연산과 정수에 의한 값 대응은 불가능하지만 이와 같이 하면 가능하다. 기본적으로 4byte값이기 때문에 int Type으로 값을 받아올 수 있고, 그 상태에서 증감 연산후 다시 대입이 가능하다. 단 그냥 대입은 불가능하고 Enum Type으로 강제 형변환을 해주어야만 값을 넣을 수 있다. 28 Line에서 바뀐 상태를 확인할 수 있다.
34~41 Line : 이곳에서는 Default로 할당되는 enum Type의 속성들의 정수값들에 대한 테스트이다. default로 할당하지 않고 4 Line에서처럼 강제적으로 할당이 가능하다. 강제로 할당할 경우 그 다음의 값들은 이전 값에서 +1을 한값이 할당되게 된다. 'A'라고 할당한 값에서는 아스키 코드값이 숫자로 저장됨을 알 수 있다. (사실 char형으로 저장해도 sat의 타입은 4byte int형이다.) 그 다음값은 아스키값의 +!한값이 저장된 모습을 볼 수 있다.


<결과 값은 위와 같이 나타난다.>