제 13강) 조건문2 - Switch문 |
조건문의 두번째 시간입니다.
바로 "Switch문"에 대해서 배울건데요.
"switch case문"이라고 말하기도 합니다.
1) switch case 문 |
스위치문은 if문과 거의 비슷합니다.
/* 사용법 */
switch(조건_변수)
{
case 조건1: // if와 같음
// 내용~~~
break;
case 조건2: // else if와 같음
// 내용~~~
break;
...
case 조건n: // else if와 같음
// 내용~~~
break;
default: // else와 같음
// 내용~~~
break;
}
사용법은 위와 같습니다.
이때 "조건_변수"는 무조건 정수형이어야 합니다.
(C99 표준 6.8.4.2.1에 "The controlling expression of a switch statement shall have integer type."라고 명시되어 있습니다.)
if문과 거의 비슷하지만 if문의 경우에는 내용이 끝나면 나머지 조건을 무시하지만 switch문의 경우에는 해당 조건이 만족하면 그 이후의 조건(case)을 전부 참이라고 생각하고 실행하게 됩니다.
즉, 위와 같이 실행을 하게 되는 것이죠.
그래서 switch case문에는 "break"라는 탈출포인트를 넣어서 사용합니다.
위의 switch문 소스에 break를 넣게 되면
int num = 5;
switch (num)
{
case 4:
printf("입력한 수는 4 \n");
break;
case 5:
printf("입력한 수는 5 \n");
break;
case 6:
printf("입력한 수는 6 \n");
break;
}
// [실행 결과]
// 입력한 수는 5
num의 조건에 맞는 "case 5"의 실행소스만 실행하게 되고 "break" 즉, switch문을 빠져나가게 됩니다.
break |
break가 있는 스코프(범위)를 빠져나가게 됩니다. (즉, 위의 경우에는 스코프가 switch문이 됨으로 break가 걸리면 switch문을 빠져나가게 됩니다.) |
예제를 봅시다.
#include <stdio.h>
int main(void)
{
int num = 14;
printf("Break가 있는 Switch 문 \n");
switch (num)
{
case 13:
printf("num = 13 \n");
break;
case 14:
printf("num = 14 \n");
break;
case 15:
printf("num = 15 \n");
break;
case 16:
printf("num = 16 \n");
break;
default:
printf("선언되지 않은 숫자 \n");
break;
}
printf("\nBreak가 없는 Switch 문 \n");
switch (num)
{
case 13:
printf("num = 13 \n");
case 14:
printf("num = 14 \n");
case 15:
printf("num = 15 \n");
case 16:
printf("num = 16 \n");
default:
printf("선언되지 않은 숫자 \n");
}
return 0;
}
아주 간단한 예제입니다.
break가 있는 switch문과 없는 switch문으로 만든 예제이죠.
실행결과는 위와 같습니다.
default |
if~else if~else문에서 else과 같은 기능으로 case에 정의되지 않은 조건이 나올 경우에 실행되는 구문입니다. 이 default에는 break를 쓰지 않아도 상관은 없습니다. |
2) case 중복 |
스위치문에서 case를 중복시킬 수 있습니다.
#include <stdio.h>
int main(void)
{
int num = 5;
switch (num)
{
case 3:
case 4:
case 5:
printf("num은 3 또는 4 또는 5 입니다. \n");
break;
case 6:
case 7:
case 8:
printf("num은 6 또는 7 또는 8 입니다. \n");
break;
default:
printf("선언되지 않은 숫자 \n");
}
return 0;
}
이렇게 case문이 중복이 될 수 있죠.
9번줄은 num이 3, 4, 5 즉, (num >= 3 || num <= 5)의 조건과 같게 됩니다(정수일 경우에만)
실행결과는 위와 같습니다.
3) 범위 조건 |
스위치문에서도 범위를 나타낼 수 있습니다.
1. case 중복 사용 |
방금 위에서 봤던 case 중복을 이용하여 표현이 가능합니다.
(정수형)
2. ... 사용 (비표준) |
이 방법은 "GCC"나 "CLang"을 사용하는 IDE에서 사용 가능한 방법으로 비표준(C언어 표준안에 없는 기능)으로 MS에서 만든 "Visual Studio"에서는 사용할 수 없는 방법입니다.
#include <stdio.h>
int main(void)
{
int num = 5;
switch (num)
{
case 0 ... 5:
printf("0이상 5이하 \n");
break;
case 6 ... 10:
printf("6이상 10이하 \n");
break;
default:
printf("범위를 벗어남 \n");
break;
}
return 0;
}
이런 방법으로 GCC에서는
(웹 IDE 혹은 리눅스(GCC, CLang 사용) 같은 경우)
이렇게 잘 돌아가지만
Visual Studio에서는 처음부터 사용이 불가능 합니다.
(비 표준이기 때문에 넣지 않은것같습니다.)
(물론 표준이어도 MS는 잘 안넣긴하지만..)
번외) if문과 Switch문 |
그럼 언제 if문을 사용해야하고 언제 switch문을 사용해야할까요?
범위를 가지고 조건을 검사해야한다면 if문이 좋고, 값이 정해져있다면 switch로 하는 것이 좋습니다만,
최근에 C를 엄청 파고들어서 배우게 되었는데 switch문이 if문보다 성능이 보편적으로 좋습니다.
(이 부분은 좀 깊은 부분입니다.)
그래서 어떤 값이 일정하게 정해져 있다면(범위의 형식이 아닌) 가급적 switch문으로 작성하는 것이 좋습니다.
아래의 링크는 한번쯤 읽어보면 좋은 글들입니다.
다음시간에는 |
반복문에 대해서 알아보도록 하겠습니다.
'Study > C언어' 카테고리의 다른 글
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 15 [반복문2 - While] (0) | 2018.10.17 |
---|---|
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 14 [반복문1 - For] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 07 [입력문과 출력문(printf, scanf, scanf_s)] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 08 [변수에 대한 추가적인 이야기] (0) | 2018.10.17 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 10 [연산자 이야기] (0) | 2018.10.17 |