본문 바로가기
Language&Framework&Etc/C

구조체와 사용자 정의 자료형2(23-5) 열거형(Enumerated Type)의 정의와 의미

by 머리올리자 2020. 12. 14.

구조체나 공용체와 마찬가지로 자료형을 정의하는 방법으로 사용이 된다.

구조체를 정의하는 이유

열거형으로 syllable이라는 이름의 자료형을 정의하는 것은 다음의 의미를 지닌다.

 

"syllable형 변수에 저장이 가능한 정수 값들을 결정하겠다!"

 

열거형의 경우 저장이 가능한 값 자체를 정수의 형태로 결정.

 

"syllable형 변수에는 1, 2, 3, 4, 5, 6, 7이 저장 가능하다"

 

열거형 정의

enum syllable // syllable이라는 이름의 열거형 정의
{
	Do=1, Re=2, Mi=3. Fa=4, So=5, La=6, Ti=7;
};

 

위는 다음의 의미를 가짐

"Do를 정수 1을 의미하는 상수로 정의. 그리고 이 값은 syllable형 변수에 저장이 가능"

 

즉, 열거형 정의에서는 Do, Re, Mi, Fa, So, La, Ti라는 이름의 상수를 각각 1, 2, 3, 4, 5, 6, 7로 정의하고 이 값들을 syllable형 변수가 저장할 수 있는 값들로 제한.

 

#include <stdio.h>

typedef enum syllable
{
	Do = 1, Re = 2, Mi = 3, Fa = 4, So = 5, La = 6, Ti = 7
}Syllable;

void Sound(Syllable sy)
{
	switch (sy)
	{
	case Do:
		puts("도"); return;
	case Re:
		puts("레"); return;
	case Mi:
		puts("미"); return;
	case Fa:
		puts("파"); return;
	case So:
		puts("솔"); return;
	case La:
		puts("라"); return;
	case Ti:
		puts("시"); return;
	}
	puts("끝");
}


int main(void)
{
	Syllable tone;

	for (tone = Do; tone <= Ti; tone += 1)
		Sound(tone);
	return 0;
}

main의 for문을 아래처럼 만들어도 결과는 동일

for(tone=1; tone<=7; tone+=1)
	Sound(tone)

위 예제의 case 레이블에 사용된 상수 Do, Re, Mi ... 를 대신해서 1, 2, 3.... 을 삽입해도 결과는 동일하다.

왜냐하면 Do, Re, Mi.... 와 같은 열거형 상수 들은 int형으로 표현되는 상수이기 때문이다.

 

따라서 int형 데이터가 올 수 있는 위치에는 이들 '열거형 상수'가 올 수 있다.

 

열거형 상수의 값이 결정되는 방식

열거형을 정의하는데 있어서 상수의 값을 명시하지 않으면?

enum color {RED, BLUE, WHITE, BLACK};

위 정의에는 열거형 상수의 이름만 선언되었을 뿐 상수의 값은 선언되어 있지 않다.

 

이러한 경우 열거형 상수의 값은 0에서부터 시작해서 1씩 증가하는 형태로 결정

enum color {RED=0, BLUE=1, WHITE=2, BLACK=3};

정의가 또 다른 예

enum color {RED=3, BLUE, WHITE=6, BLACK};

위와 같으면 선언된 상수보다 1이 증가된 값이 할당된다.

enum color {RED=3, BLUE=4, WHITE=6, BLACK=7};

열거형의 유용함은 이름있는 상수의 정의를 통한 의미의 부여에 있음

일반적으로 열거형을 정의하는 이유는 다음과 같음

 

"Do, Re, Mi와 같이 연관이 있는 이름을 동시에 상수로 선언할 수 있다."

 

Do, Re를 대신해서 1, 2를 사용했다면 각각의 상수가 의미하는 바를 파악하기도 힘들뿐 아니라, 예제가 음계와 관련이 있다는 사실도 파악하기가 쉽지 않았을 것이다.

 

열거형의 유용함은 둘이상의 연관이 있는 이름을 상수로 선언함으로써 프로그램의 가독성을 높이는데 있다.

 

따라서 자료형의 이름을 생략한 형태로 열거형을 정의 가능

enum {Do=1, Re=2, Mi=3, Fa=4, So=5, La=6, Ti=7};

변수의 선언이 목적이 아닌 상황에서는 위와 같이 정의하기도 함.

 

참고 : [윤성우 열혈 C 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.