쉽게 말해 enum 은 열거형 변수 입니다.
"어떻게" 생각하면 struct와 다르냐? 라고 물을 수 있지만.
"전혀" 다릅니다.
보통 enum은 상수를 정의하는데에 많이 쓰입니다.
소스의 가독성을 높인다거나 상수에 의미를 부여해서 쓸 수 있습니다.
전처리기인 #define 을 사용하거나, 전역 변수를 const로 선언해서 상수처럼 사용이 가능하지만
enum을 상수로 생각해서 처리할때의 이점이 있습니다. (뒷부분에 설명하겠습니다.)
우선 이넘(enum)을 선언하는 방법은 다음과 같습니다.
enum {mon, tue, wed, thr, fri, sat, sun } day;
여기서 day를 열거형 변수라 하고 그 하위의 항목(원소) 들 ( mon, tue, wed, thr, fri, sat, sun)로 구성됩니다.
특별하게 값을 지정하지 않는다면 enum의 각 원소들은 순차적인 "정수" 값을 갖게 됩니다.
이때 갖게되는 값은 mon부터 0, 1, 2 ... 6 까지 각 각 가지게 됩니다.
특별하게 값을 지정해서 enum을 사용한다면
enum {mon=100, tue, wed=200, thr, fri=300, sat, sun } day;
이렇게 선언을 하게 되면, mon은 당연히 100일거고,, tue는... 150일까요?
tue는 101을 갖게 됩니다.
enum의 값을 정하는 정의는 "이전 원소 값의 + 1" 입니다.
그럼. "왜 이넘을 사용해야 하는가.." 입니다.
사실 enum은 필요없을 지도 모릅니다.
#define 이 있고,
const int 가 있습니다.
하지만 C++ 이 enum에게 준 몇가지의 특별한 이유 때문에 enum을 사용합니다.
① 기억이 용이하다.
enum대신 정수형 변수를 대신 사용할 수 도 있습니다. 하지만, 이렇게 될때 각 정수의 의미가 무엇인지를 만드는 사람이 기억하고 있어야 하죠. 값이 많아질 수록 혼란스러울겁니다. 보통, 사람은 숫자보다 문자를 더 잘 기억합니다. 그리고, enum의 원소들을에게 의미를 부여한 이름을 준다면 더 기억하기가 쉽겠죠..
② 소스의 가독성(Readability)이 높아진다.
enum의 원소만 봄으로써, 그 상수의 의미를 보다 쉽게 파악 할 수 있고, 소스 전체의 가독성을 높이는데 도움이 됩니다. 예를 들어 whatdays = 0; 이라고 표현한다면, 이게 월요일인지,, 일요일인지, 도무지 알 길이 없습니다. 하지만 whatdays = mon; 이라고 한다면, 두말할나위없이 이해할 수 있겠죠. 두명이상의 Project나 팀단위 작업을 할때에는 알고리즘을 아무리 잘 짜도 소스가 X같으면, 프로젝트 진행이 어려워집니다. 따라서 이런 팀단위 작업에는 가독성이 아주 중요시 됩니다.
③ 안전하다.
앞서 예를든 days에 대입될수 있는 값은 7개중 하나로 제한이 되기때문에 사용자의 실수를 컴파일러가 미리 예방해줄 수 있습니다. 따라서 변수형을 사용하는것보다 안전하죠.
필수는 아니지만 있으면 좋다. 이게 이넘(emum)입니다.
enum을 보다 효율적으로 사용하는 방법은
typedef를 사용하는겁니다.
바로 예부터 보자면...
typedef enum CDays {enum {mon, tue, wed, thr, fri, sat, sun };
이제 CDays는 하나의 타입으로 생성된겁니다.
CDays WhatDay(); 와 같이 오늘이 몇요일인지 리턴하는 함수를 작성 할 수도 있구요.
CDays Day = WhatDay();
와 같이 Enum을 효과적으로 처리할 변수를 만들어 사용할 수 있습니다.
enum 사용 예제 입니다.
// 실행 결과
'Stupid Computer > 2. C 언어' 카테고리의 다른 글
[C/C++] 날짜를 입력받고 timeStamp로 바꾸는 함수 !! ( date to TimeStamp in C/ C++) (0) | 2014.07.04 |
---|---|
[C/C++] TimeStamp to DateTime 시간을 초단위로 변환하여 출력 (convert timeStamp to DateTime String ) (0) | 2014.06.23 |
[C/C++] 현재 시간을 가져와서 timeStamp(초 단위) 출력, 우리가 쓰는 시간으로 출력 (0) | 2014.06.02 |
[C/C++] 난수 생성하기 rand(), srand()함수 사용! 랜덤 숫자 생성하기 ! (0) | 2014.05.29 |
[C/C++] Class 사용, 은행 계좌 개설 및 입금, 출금 예제 ! (코드 첨부 ) (0) | 2014.05.28 |
[C/C++] #ifdef 사용법 ! ifdef, endif 사용법 !! 모드 전환 ! (0) | 2014.05.08 |
[C/C++] Menu 화면 구성 ! if else if ~ ( 메뉴 10개 이상 넘어갈때 ) (0) | 2014.04.24 |
[C/C++] switch case문 10개 이상 만들기 ! (0) | 2014.03.24 |
[json/cjson] json_object_is_type 사용법 (0) | 2014.03.06 |
[C/C++/리눅스/자바] Json 사용법 및 사용예제 (0) | 2014.02.28 |