14. switch 문으로 다양한 조건 처리하기
선택문인 switch 문은 값에 따라서 다양한 제어를 처리할 수 있습니다. 앞서 살펴본 다중 if 문을 사용할 때 조건을 처리할 내용이 많을 경우에 그 대체 구문으로 switch 문을 사용할 수 있습니다. 박용준 강사의 강의에서 switch 문은 switch 선택문, switch 분기문으로도 부릅니다.
> // 선택문(switch 문): switch와 case 그리고 default 키워드를 사용하여 다양한 조건 처리
14.1 switch 문 소개
switch 문의 모양은 다음과 같습니다. 표현식은 줄여서 식으로 표현하고 영어로 Expression입니다.
switch (표현식)
{
case 값1 : 실행문1; break;
case 값2 : 실행문2; break;
...
default: 실행문n; break;
}
표현식의 결괏값이 '값1'이면 '실행문1'을 수행하고, '값2'면 '실행문2'를 수행하는 식으로 표현식에 맞는 실행문을 수행합니다.
switch 문에는 추가적으로 case
키워드와 default
키워드가 사용되는데요 이를 case 레이블, default 레이블이라고 합니다. case 레이블은 상수(값)가 들어오고, default 레이블은 생략 가능합니다.
14.2 switch 문 사용하기
이번에는 switch 문을 사용해보겠습니다.
코드: switch_expression.c
// switch 문 사용하기
#include <stdio.h>
int main(void)
{
int x = 2;
switch (x)
{
case 1:
printf("1입니다.\n"); // x가 1일 때 실행
break;
case 2:
printf("2입니다.\n"); // x가 2일 때 실행
break;
default:
printf("1과 2가 아닙니다.\n"); // 기본값
break;
}
return 0;
}
2입니다.
변수 x
의 값을 1로 두면 "1입니다."가 출력되고 x
의 값을 2로 두면 "2입니다."가 출력됩니다. 1과 2 이외의 값을 지정하면 default
구문이 실행됩니다.
객관식 문제에서 하나를 선택하는 유형은 switch
문 사용이 편리합니다.
14.3 입력한 값에 따른 출력 구문을 switch 문으로 선택하기
다음은 사용자로부터 정수를 입력 받은 후 1, 2, 3일 경우에는 그에 해당하는 문자열을 출력하고 나머지 정수는 default 레이블에서 지정한 문자열을 출력하도록 하는 예제입니다.
코드: switch.c
#include <stdio.h>
int main(void)
{
int answer = 0;
int _ = 0;
printf("정수를 입력하세요.\n");
// 정수 하나 입력하고 엔터 입력한 후 answer 변수에 담기
_ = scanf_s("%d", &answer); _ = getchar();
// 선택문
switch (answer)
{
case 1:
printf("1을 선택했습니다.\n");
break;
case 2:
printf("2을 선택했습니다.\n");
break;
case 3:
printf("3을 선택했습니다.\n");
break;
default:
printf("그냥 찍으셨군요.\n");
break;
}
return 0;
}
정수를 입력하세요.
3
3을 선택했습니다.
위 프로그램을 실행 후 원하는 값을 입력 후 그에 해당하는 문자열이 출력되는지 확인해보세요.
14.4 좋아하는 프로그래밍 언어 선택하기
가장 좋아하는 프로그래밍 언어를 물어보는 프로그램을 다음과 같이 switch 문을 사용하여 만들 수 있습니다.
코드: switch_statement.c
#include <stdio.h>
int main(void)
{
int choice = 0;
int _ = 0;
printf("가장 좋아하는 프로그래밍 언어는?\n");
printf("1. C\t");
printf("2. C++\t");
printf("3. C#\t");
printf("4. Java\n");
// 사용자로부터 정수 하나를 입력받아 choice 변수에 저장
_ = scanf_s("%d", &choice); _ = getchar();
switch (choice)
{
case 1:
printf("C 언어 선택\n");
break;
case 2:
printf("C++ 선택\n");
break;
case 3:
printf("C# 선택\n");
break;
case 4:
printf("Java 선택\n");
break;
default:
printf("C, C++, C#, Java가 아니군요.");
break;
}
return 0;
}
가장 좋아하는 프로그래밍 언어는?
1. C 2. C++ 3. C# 4. Java
1
C 언어 선택
switch 문은 if else 문을 사용해서 구현해도 되지만, 좀 더 간결하게 분기 구문을 표시할 수 있는 장점을 가지고 있습니다.
14.4.1 switch 문을 사용하여 오늘 날씨를 물어보기
오늘 날씨를 숫자로 입력받은 후 그에 해당하는 메시지를 출력하는 예제를 만들어 보겠습니다.
코드: switch_weather.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int weather = 0;
int _ = 0;
printf("오늘 날씨는 어떤가요? (맑음(1), 흐림(2), 비(3), 눈(4), ...)\n");
_ = scanf("%d", &weather);
switch (weather)
{
case 1:
printf("오늘 날씨는 맑군요.");
break;
case 2:
printf("오늘 날씨는 흐리군요.");
break;
case 3:
printf("오늘 날씨는 비가 오는군요.");
break;
default:
printf("혹시 눈이 내리나요?");
break;
}
return 0;
}
오늘 날씨는 어떤가요? (맑음(1), 흐림(2), 비(3), 눈(4), ...)
1
오늘 날씨는 맑군요.
14.5 case에서 break 생략하기
fall_through.c
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main(void)
{
char alphabet;
scanf("%c", &alphabet);
switch (alphabet)
{
case 'a':
case 'b':
printf("a 또는 b입니다.\n");
break;
default:
printf("a, b가 아닌 다른 문자입니다.\n");
break;
}
return 0;
}
C 언어로 만드는 정수 계산기
이 예제는 C 언어를 사용하여 기본적인 산술 연산을 수행하는 간단한 콘솔 계산기를 만드는 과정을 안내합니다. 사용자로부터 두 정수와 하나의 산술 연산자를 입력받아 해당 연산을 수행하고 결과를 출력합니다.
입력
사용자는 두 정수와 사이에 산술 연산자(+
, -
, *
, /
)를 포함하는 형식으로 입력합니다. 예를 들어, 3 + 5
와 같이 입력할 수 있습니다.
이 입력에서 첫 번째 정수는 x
, 연산자는 opr
, 두 번째 정수는 y
변수에 저장됩니다. 이렇게 입력받은 값들을 switch
문을 사용하여 처리하며, 연산자에 따라 적절한 연산을 수행하고 그 결과를 출력합니다.
테스트 케이스
입력 예시
3 + 5
출력 예시
3 + 5 = 8
구현 코드
아래 코드는 위에서 설명한 계산기의 구현을 보여줍니다. 이 코드는 표준 입력으로부터 두 정수와 연산자를 받아 연산 결과를 출력합니다.
코드: c_calculator.c
#define _CRT_SECURE_NO_WARNINGS // scanf 사용 시 보안 경고 방지
#include <stdio.h>
int main(void) {
int x = 0, y = 0, result = 0;
char opr;
// 사용자 입력 받기
scanf("%d %c %d", &x, &opr, &y);
// 연산자에 따른 연산 수행
switch (opr) {
case '+':
result = x + y;
break;
case '-':
result = x - y;
break;
case '*':
result = x * y;
break;
case '/':
result = x / y;
break;
default:
printf("지원하지 않는 연산자입니다.\n");
return 1;
}
// 결과 출력
printf("%d %c %d = %d\n", x, opr, y, result);
return 0;
}
추가 예제
- 뺄셈:
3 - 5
입력 시3 - 5 = -2
출력 - 곱셈:
3 * 5
입력 시3 * 5 = 15
출력 - 나눗셈:
3 / 5
입력 시, 정수 나눗셈이므로3 / 5 = 0
출력
이 계산기는 scanf
를 사용하여 입력을 받습니다. 정수 입력은 %d
로, 연산자는 %c
로 처리합니다. 변수 앞에는 주소를 나타내는 &
기호를 사용해야 합니다. switch
문을 통해 입력받은 연산자에 따라 해당 연산을 수행하고, printf
를 사용하여 연산 결과를 출력합니다.
연습문제: 실수를 이용한 사칙연산 계산기 프로그램
이 연습문제에서는 C 언어를 활용하여 두 실수와 하나의 산술 연산자를 입력받아, 사칙연산을 수행하는 간단한 계산기 프로그램을 작성합니다. 프로그램은 사용자가 입력한 연산에 대한 결과를 실수 형태로 출력합니다.
입력 및 출력 예제
테스트 케이스 1
- 입력:
3.0 + 5.0
- 출력:
8.000000
테스트 케이스 2
- 입력:
9 / 2
- 출력:
4.500000
구현된 프로그램 코드
다음은 사용자로부터 두 실수와 연산자를 입력받아 해당 사칙연산을 수행하고 결과를 실수로 출력하는 계산기 프로그램의 구현 코드입니다.
코드: judge_calculator.c
#define _CRT_SECURE_NO_WARNINGS // scanf 사용 시 보안 경고를 방지
#include <stdio.h>
int main(void) {
double x = 0.0, y = 0.0;
char opr;
long double result = 0.0l;
// 사용자 입력 받기
scanf("%lf %c %lf", &x, &opr, &y);
// 연산자에 따른 연산 수행
switch (opr) {
case '+':
result = x + y;
break;
case '-':
result = x - y;
break;
case '*':
result = x * y;
break;
case '/':
result = x / y;
break;
default:
printf("지원하지 않는 연산자입니다.\n");
return 1;
}
// 결과 출력
printf("%Lf\n", result);
return 0;
}
추가 테스트 케이스 결과
4 + 4
입력 시8.000000
출력4 - 2
입력 시2.000000
출력4 * 3
입력 시12.000000
출력9 / 2
입력 시4.500000
출력9.0 / 2
입력 시4.500000
출력9 / 2.0
입력 시4.500000
출력
해설
프로그램은 scanf
함수를 사용하여 사용자로부터 두 개의 실수 값을 %lf
형식 지정자를 사용해 입력받습니다. 연산자는 %c
로 받으며, 변수에 값을 저장할 때는 &
기호를 사용하는 것이 중요합니다. 사용자가 입력한 연산자에 따라 switch
문을 통해 적절한 사칙연산을 수행하고, printf
함수의 %Lf
형식 지정자를 통해 실수 형태의 연산 결과를 출력합니다.
14.6. 장 요약
여러 항목 중 하나를 편하게 선택해주는 선택문인 switch 문을 알아보았습니다. 조건문과 선택문을 알아봤으니 계속해서 반복문을 알아보도록 하겠습니다.
문제 풀이
정보처리기사 실기 시험 기출 문제 - switch
문의 실행 흐름
문제
다음 C 프로그램이 실행되었을 때의 동작을 설명하고, 출력 결과를 예측하시오.
소스 코드 파일명: switch_execution_flow.c
#include <stdio.h>
main() {
int c = 1;
switch (3) {
case 1: c += 3;
case 2: c++;
case 3: c = 0;
case 4: c += 3;
case 5: c -= 10;
default: c--;
}
printf("%d", c);
}
입력 예시
이 프로그램은 사용자로부터 입력을 받지 않습니다.
출력 예시
-8
해설
이 프로그램은 switch
문을 사용하여 변수 c
의 값을 변경하고, 그 결과를 출력합니다.
- 변수
c
는 1로 초기화됩니다. switch (3)
문은 조건이3
인case
로 직접 이동하여 실행을 시작합니다.case 3
에서c
의 값을 0으로 설정합니다.switch
문에break
문이 없기 때문에,case 3
이후의 모든case
와default
문이 순차적으로 실행됩니다.case 4
에서c
에 3을 더하여c
는 3이 됩니다.case 5
에서c
에서 10을 빼서c
는 -7이 됩니다.default
에서c
에서 1을 빼서c
는 최종적으로 -8이 됩니다.printf("%d", c);
는 최종 결과인 -8을 출력합니다.
이 프로그램은 switch
문의 실행 흐름을 이해하고, break
문의 부재가 case
들이 연속적으로 실행되게 만드는 것을 보여줍니다.