c언어 열거형에 대하여 알아보기
네 안녕하세요, 이번 포스팅에서는 열거형에 대하여 알아보도록 하겠습니다.
열거형이란 변수가 가질 수 있는 값들을 나열해 놓은 자료형인데,
보통은 일반 자료형들만 쓰는 경우가 많지만,
필요에 따라서 열거형을 쓰는 경우가 생깁니다.
그럼 지금부터 열거형의 특징은 무엇이며,
열거형을 왜 사용하며 어떻게 사용을 하는 지 한 번 알아보도록 하겠습니다.
1. 열거형의 특징과 사용하는 이유
우선 열거형을 어떻게 사용하는 지 알아보기 전에,
열거형은 어떤 특징을 가지고 있으며,
열거형을 왜 사용을 하는 지 알아보겠습니다.
1 - 1. 열거형의 특징
열거형은 앞서 말씀드렸다시피 변수가 가질 수 있는 값들을 나열해 놓은 자료형이라고 했습니다.
그로 인하여 열거형 자료형에 나열되어 있는 값들은 모두 상수입니다.
그 이유는 말 그대로 어떤 변수가 가질 수 있는 값들을 나열한 것이기 때문에
누군가가 접근하여 바꿀 수 있는 값이 아니기 때문입니다.
1 - 2. 열거형을 쓰는 이유
그러면 이 열거형을 왜 쓸까요?
한 가지 예를 들어보겠습니다.
우리가 요일을 변수에 저장을 하려고 합니다.
그럴 경우에 일반적인 경우에 어떻게 하나요?
이런 식으로 하죠?
int today;
today = 0; // 일요일
today = 1; // 월요일
.
.
.
이런 식으로 계속 나열을 하게 됩니다.
하지만 이럴 경우에는 가독성도 떨어지고,
이상한 값이 변수에 들어가서 프로그램이 망가지는 경우도 생깁니다.
그렇기에 우리는 이상한 값이 들어오는 것을 방지할 수 있는 방법도 고안을 해둬야 합니다.
그래서 그러한 것을 방지하기 위해서 우리는 열거형을 씁니다.
2. 열거형을 정의하는 방법
열거형을 정의할 때는 'enum'이라는 키워드를 써서 나타냅니다.
위에서 든 예시로, 요일을 열거형으로 한 번 나타내보도록 하겠습니다.
enum days {SUN, MON, TUE, WED, THU, FRI, SAT};
이런 식으로 나타낼 수 있습니다.
열거형 안에 있는 값들은 기호상수들이며,
형태는 배열과 비슷하게 생겼습니다.
하지만 배열처럼 선언이 바로 되는 것이 아니라,
마치 구조체처럼 틀만 짜여져 있고,
열거형 변수는 따로 선언을 해주어야 합니다.
이런 식으로 말이죠.
enum days today; // 열거형 변수 선언
today = MON; // 사용 가능
today = MY_DAY // 열거형 내에 있는 값이 아니므로 사용 불가
그리고 이 열거형 변수는 선언이 되는 순간 열거형 기호상수 이외의 값을 입력하게 되면 애러가 나기 때문에
주의를 하셔야 합니다.
3. 기호 상수의 값
기호 상수들의 값은 다른 자료형들처럼 시작은 무조건 0에서부터 시작을 합니다.
그리고 개수에 따라서 1씩 자동적으로 정수값으로 증가하도록 설정이 되어있습니다.
위의 요일을 예로 들자면 제일 처음에 있는 값인 'SUN'은 0이 되고,
바로 뒤에 있는 값인 'MON'은 1이 됩니다.
이게 제일 기본이지만, 개발자 재량에 따라서 값을 다르게 설정을 할 수도 있습니다.
제가 몇 가지 예시를 들어보도록 하겠습니다.
enum days {SUN = 1, MON, TUE, WED, THU, FRI, SAT}; // SUN = 1, MON = 2, ...
enum days {SUN = 7, MON = 1, TUE, WED, THU, FRI, SAT = 6}; // MON = 1, SAT = 6, SUN = 7
이런 식으로 시작점을 1로 둘 수도 있고, 제일 처음에 있는 값을 제일 마지막 값으로 지정도 가능합니다.
그럼 이번에는 열거형을 이용해서 간단한 코드를 한 번 작성을 해보도록 하겠습니다.
#include <stdio.h>
enum days {SUN, MON, TUE, WED, THU, FRI, SAT};
char *days_name[] = {"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"};
int main()
{
enum days d;
d = WED;
printf("%d 번째 요일은 %s 입니다.\n", d, days_name[d]);
return 0;
}
이렇게 작성을 해봤습니다.
그럼 결과는 어떻게 나오는지 한 번 보도록 하겠습니다.
3 번째 요일은 wednesday 입니다.
결과도 잘 나오는 것을 확인할 수 있습니다.
4. 다른 방법들과 비교해보기
이번에는 다른 방법들과 비교를 해보도록 하겠습니다.
기본적으로 열거형은 정수 형태의 기호 상수를 정의하는 경우에 사용을 합니다.
그럼 제가 하나씩 보여드리도록 하겠습니다.
제일 먼저 정수를 사용하는 경우입니다.
// 정수를 사용하는 경우
switch(code)
{
case 1:
{
printf("LCD TV\n");
break;
}
case 2:
{
printf("OLED TV\n");
break;
}
}
정수를 사용하는 경우에는 경우의 수가 많지 않다면 큰 문제가 없겠지만,
수가 많아지면 경우의 수를 다 숫자로 나열해 뒀기 때문에 가독성이 떨어집니다.
두 번째로 기호 상수를 사용했을 경우입니다.
// 기호 상수를 사용하는 경우
#define LCD 1
#define OLED 2
switch(code)
{
case LCD:
{
printf("LCD TC\n");
break;
}
case OLED:
{
printf("OLED TV\n");
break;
}
}
기호 상수를 사용을 하게 되면 오류를 저지할 수 있어서 좋습니다.
하지만, 이 역시 계속 전처리기를 이용해서 설정을 해줘야 하기 때문에 피곤하고,
선언을 많이 하면 할수록 가독성이 떨어지게 됩니다.
마지막으로 열거형을 사용했을 경우입니다.
// 열거형을 사용하는 경우
enum tvtype {LCD, OLED};
enum tvtype code;
swtich(code)
{
case LCD:
{
printf("LCD TV\n");
break;
}
case OLED:
{
printf("OLED TV\n");
break;
}
}
열거형을 쓸 경우에는 당연히 위에서 기호 상수를 선언했기 때문에 가독성이 좋아지기도 하고,
컴파일러가 중복이 일어나지 않도록 체크를 해주기 때문에 여러 가지로 편리합니다.
여기까지 열거형에 대하여 알아보았는데요,
다음 포스팅에서는 'typedef'에 대하여 알아보도록 하겠습니다.
긴 글 읽어주신 독자분들께 진심으로 감사드립니다~
'c언어' 카테고리의 다른 글
c언어 구조체, typedef를 이용하여 여러가지 문제 풀어보기(2차원 공간 상의 점을 구조체로 표현하기, 사각형을 구조체로 나타내기, 벡터 연산하기, 2차원 공간 상의 점을 typedef를 이용해서 정의.. (0) | 2023.02.04 |
---|---|
c언어 typedef에 대하여 알아보기 (0) | 2023.02.03 |
c언어 공용체에 대하여 알아보기 (0) | 2023.01.30 |
c언어 구조체와 함수와의 관계 알아보기 (0) | 2023.01.30 |
c언어 구조체에서 사용되는 포인터에 대하여 알아보기 (0) | 2023.01.29 |
댓글