if 조건문은 참이거나 거짓일 때 두 가지만 처리할 수 있거나,
else if를 사용하더라도 매번 조건식을 지정해주어야 했다.
switch 분기문은 조건이 많아도 손쉽게 처리할 수 있다.
switch (값을 판단할 변수)
{
case 1:
printf("1 입니다.\n");
break;
case 2:
printf("2 입니다.\n");
break;
default:
printf("default\n")
break;
}
값을 판단할 변수가 1이라면
case 1에 따라 "1 입니다." 가 출력되고, 2라면 case 2에 따라 "2 입니다."가 출력된다.
그 무엇도 아니라면 default를 따라 "default"가 출력된다.
사용자가 입력한 값에 따라 문자열 출력하기
컴파일 후 2를 입력하고 엔터를 치면 아래와 같은 내용이 출력된다.
이때, case 다음에는 반드시 값(리터럴/상수)이 와야하며, 변수나 조건식은 올 수 없다.
case에 변수나 조건식을 넣는다면 아래와 같은 에러 메시지가 나온다.
if는 첫 조건식 다음에 else if로 다른 조건식을 일일히 지정해줘야 한다. 즉 조건식이 바뀌지 않고 값만 바뀔때는
switch가 적합하며, 값과 조건식이 모두 바뀔때는 else if 가 적합하다.
case에서 break를 사용하지 않으면 어떻게 될까?
case마다 붙여준 break를 지워보자.
이런 경우, 1을 입력하면 case 1, 2, default가 모두 출력되고
2를 입력하면 case 2, default가 출력되고
그 외의 값을 입력하면 default가 출력된다.
case를 작성할 때 마지막 부분에서 break로 중단해주지 않으면 그 다음의 case와 default가 계속 실행된다.
(이런 상황을 fall through라고 부른다.)
case에서 break 생략 응용하기
위에서 break를 생략하면 값이 연달아 나오는 것을 확인할 수 있었다.
이를 활용해 case의 OR 연산을 활용할 수 있다.
case1과 case2를 연달아 지정하면 num1의 값이 1일때도 코드가 실행되고 2일때도 실행된다. 2일때는 break가 걸리니 해당 문을 나오게 된다. 3과 4도 마찬가지이다.
위의 코드를 if 조건문과 논리 연산자로 표현하면 다음과 같다.
if (num1 == 1 || num2 == 2)
printf("1 또는 2 입니다.\n");
else if (num1 == 3 || num2 == 4)
printf("3 또는 4 입니다.\n");
else
printf("default\n);
if, else if는 일일이 조건식을 나열해줘야 하므로 처리해야 할 숫자가 많아지면 매우 번거로워진다.
이런 경우에는 case에서 break를 생략하는 방식이 유효하다.
case 안에서 변수 선언하기
switch의 case에 들어가는 코드가 길어지다 보면 변수를 선언하기도 한다.
case에서 변수를 선언하려면 case를 중괄호{}로 묶어주면 된다.
다만 중괄호 안에 선언된 변수 num2는 case 1: 안에서만 사용이 가능하다.
즉 case 2나 switch 바깥에서는 사용할 수 없다.
switch에서 판별할 수 있는 자료형 알아보기
switch에서 판별할 변수는 정수 자료형만 사용할 수 있고, 실수 자료형(float, double)은 사용할 수 없다.
단 문자 자료형(char)은 정수 자료형이므로 switch에서 사용할 수 있다.
단 case에서는 숫자 대신 'a' 처럼 작은 따옴표를 붙여 문자를 지정해줘야 한다. (아스키코드 입력 방식을 맞춰야 한다.)
또한 C언어에서는 case "Hello": 처럼 case에 문자열을 사용할 수 없다.
연습문제 : switch에서 연산자 활용하기
case 문에서도 연산자 활용이 가능하다
위에서는 시프트 연산자를 활용했다.
2를 입력 후 엔터를 친다면
case 1의 왼쪽 시프트 1개가 2이기 때문에
2라는 값이 출력된다.
심사문제: 음료수 자판기 만들기
정답을 보시려면 아래 더보기를 눌러주세요.
'C, C++' 카테고리의 다른 글
C언어 코딩도장(while 반복문) (0) | 2022.04.27 |
---|---|
C언어 코딩도장(for 반복문) (0) | 2022.04.27 |
C언어 코딩도장(비트 연산자 응용하기 / 플래그) (0) | 2022.04.26 |
오늘 공부한 C언어(비트 연산자 이용하기) (0) | 2022.03.09 |
오늘 공부한 C언어(불 자료형 사용하기) (0) | 2022.03.09 |