본문 바로가기
  • AI (Artificial Intelligence)
Programming/C, C++

다시쓰는 C언어 강좌] 079 - 열거형 - enum

by 로샤스 2014. 7. 18.
이번엔 구조체나 공용체와 완전히 다른 형식이지만
역시 뭔가 모아 놓고 쓸 수 있는
열거형(enumeration)입니다.
열거형은 여러 문자열을 하나의 그룹으로 만들어 놓고
각각 번호를 붙여서, 그 키워드가 곧 값이 되는 상수와도 비슷한 존재인데

#include <stdio.h>

enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat};

int main() {

enum week Day = Sun;
printf("Sun: %d\n", Day);
Day = Tue;
printf("Tue: %d\n", Day);
Day = Fri;
printf("Fri: %d\n", Day);

return 0;
}

단, 열거형으로 선언한 상수 집단을 쓰고 싶다면
그 열거형으로 변수를 선언해야 합니다. 저렇게요.
그 뒤 키워드를 넣으면 해당하는 정수값이 들어가며,
기본적으로 맨 처음 키워드가 0,
그 다음부터 1씩 증가합니다.
그래서 Mon은 1, Tue는 2, ... Sat는 6 식입니다.

Sun: 0
Tue: 2
Fri: 5
[커서]

이렇게 나옵니다.
물론 무조건 값이 이렇게 정해지는 건 아니고,

#include <stdio.h>

enum week {Sun=3, Mon, Tue, Wed=9, Thu, Fri, Sat};

int main() {

enum week Day = Sun;
printf("Sun: %d\n", Day);
Day = Tue;
printf("Tue: %d\n", Day);
Day = Fri;
printf("Fri: %d\n", Day);

return 0;
}

열거형 선언에서 필요에 따라 키워드에 값을 대입하면
그 값을 가지게 되며, 그 뒤 키워드들은 그 값으로부터 1씩 증가되는 값을 가집니다.
이때는 Sun은 3, Mon은 4, Tue는 5가 되고
다시 Wed는 9, Thu는 10, Fri는 11, Sat는 12가 되죠.

Sun: 3
Tue: 5
Fri: 11
[커서]

굳굳. 이렇게 됩니다.
그리고... 열거형 변수에는 정수형을 바로 대입할 수가 없고
저렇게 키워드로 대입해야 합니다. 안 그러면 컴파일 에러.
그러나, 열거형으로 형변환을 해 주면 대입 가능합니다.

#include <stdio.h>

enum week {Sun=3, Mon, Tue, Wed=9, Thu, Fri, Sat};

int main() {

enum week Day = (enum week)4;
printf("%d\n", Day);

return 0;
}

이렇게 해 주면 됩니다.

그 반대로, 정수형을 대입하지 못하고 키워드로만 대입하니
한 열거형 그룹 안에 중복되는 값이 있어도 괜찮습니다.

enum week {Sun=3, Mon, Tue, Wed=4, Thu, Fri, Sat};

이래도 문제 없습니다.
이대로라면 Mon, Wed가 중복되고 Tue, Thu가 중복되죠.
단, 같은 키워드는 코드 전체에서 중복되면 안 됩니다.
서로 다른 열거형 그룹이어도 같은 키워드는 존재하면 안 됩니다.



이제 예제입니다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

enum dice {One=1, Two, Three, Four, Five, Six};

int main() {

srand(time(0));
enum dice n;
int score = 0;

do{
n = (enum dice)(rand()%6 + 1);
printf("주사위의 눈은 %d입니다.\n", n);
switch(n){
case One
printf("게임이 종료됩니다.\n");
break;
case Two
printf("점수 +1점, 현재 점수: %d점\n", score+=1);
break;
case Three
printf("점수 +1점, 현재 점수: %d점\n", score+=1);
break;
case Four
printf("점수 +2점, 현재 점수: %d점\n", score+=2);
break;
case Five
printf("점수 +5점, 현재 점수: %d점\n", score+=5);
break;
case Six
printf("점수 *2,   현재 점수: %d점\n", score*=2);
break;
}
}while(n!=One);

printf("---------------------------\n");
printf("최종 점수: %d점\n", score);

return 0;
}

무려 switch 문과 중복했습니다.
이때 switch 문에 들어간 변수가 열거형 변수입니다.
컴퓨터가 알아서 주사위를 계속 던집니다. 1이 나올 때까지.
그 전 까지는 점수를 계속 더하거나 곱해가다가
주사위 눈이 1이 나오면 최종 점수를 발표합니다.

주사위의 눈은 6입니다.
점수 *2,   현재 점수: 0점
주사위의 눈은 4입니다.
점수 +2점, 현재 점수: 2점
주사위의 눈은 4입니다.
점수 +2점, 현재 점수: 4점
주사위의 눈은 6입니다.
점수 *2,   현재 점수: 8점
주사위의 눈은 6입니다.
점수 *2,   현재 점수: 16점
주사위의 눈은 4입니다.
점수 +2점, 현재 점수: 18점
주사위의 눈은 5입니다.
점수 +5점, 현재 점수: 23점
주사위의 눈은 3입니다.
점수 +1점, 현재 점수: 24점
주사위의 눈은 2입니다.
점수 +1점, 현재 점수: 25점
주사위의 눈은 5입니다.
점수 +5점, 현재 점수: 30점
주사위의 눈은 6입니다.
점수 *2,   현재 점수: 60점
주사위의 눈은 3입니다.
점수 +1점, 현재 점수: 61점
주사위의 눈은 2입니다.
점수 +1점, 현재 점수: 62점
주사위의 눈은 6입니다.
점수 *2,   현재 점수: 124점
주사위의 눈은 5입니다.
점수 +5점, 현재 점수: 129점
주사위의 눈은 1입니다.
게임이 종료됩니다.
---------------------------
최종 점수: 129점
[커서]

이건 아름다운 결과 중 하나.(...)



< 보너스 >

#include <stdio.h>

typedef enum week {Sun=3, Mon, Tue, Wed=9, Thu, Fri, Sat} Week;

int main() {

Week Day = (Week)4;
printf("%d\n", Day);

return 0;
}

열거형도 typedef 가능합니다!!

 

 

 

 

 

 

 

 

출처 : http://kks227.blog.me/60198053240

         좋은 강의 감사합니다.

 

 

 

 

 

 

 

 

'Programming > C, C++' 카테고리의 다른 글

[C언어]strcmp함수  (1) 2014.07.18
비동기 입출력 프로그래밍  (0) 2014.04.16
Chapter 1. C++ 시작하기 pdf 파일  (0) 2014.03.31
[C#] Queue, Thread, AutoReset  (0) 2014.03.31

댓글