c언어 switch 문 : case와 짝꿍이다.

코딩/C 2019. 9. 6. 00:53

 ps를 하면서, switch문은 그렇게 많이 작성하지는 않았습니다. 오히려 if, else if문을 가지고 많이 작성하거나, 배열로 많이 처리를 했는데요. 그래도 알아두면 유용한 조건문입니다. 대략적인 문법은 아래와 같습니다.

 

 

 여기서 default는, 정수 변수가 정수값(1), ... , 정수값(n)이 아닐 때, 걸립니다. 이 때에는 실행(n+1)이 수행되고 switch문이 끝날 겁니다. 괄호에 정수 변수가 하나 들어갑니다. 예를 들어서 op나, cc와 같은 것들이 그러한 예입니다. 그리고, case 정수값(i)는 정수 변수의 값이 정수값(i)일 때, 걸립니다. 즉, 분기가 되는 위치 정도로 생각하시면 좋겠네요. 이것을 그림으로 쉽게 그려 드리면 다음과 같습니다.

 

 

 예를 들어, op가 switch문의 정수 변수로 들어갔다고 합시다. 이 값이 1인 경우, case 1: 이라는 문이 있다면, 그 문장이 시작되는 위치로 갈 겁니다. 화살표가, 점프를 하는 방향입니다. 만약에 op의 값이 2라면 어떨까요?

 

 

 막바로 case 2: 가 있는 라벨로 껑충 뛸 겁니다. 그런데 왜 case문 다음에 문장들을 쭉 나열한 다음에, 왜 break문을 걸까요? 그냥 냅두면 안 될까요? 사실 그냥 냅둬도 크게 문제는 없습니다.

 

 


 아래 프로그램을 실행시켜 봅시다.

 

 

 실행 결과가 어떻게 나올까요? 간단하게 도식화를 시켜 봅시다.

 

 

 먼저 op가 3이므로, 3이라는 라벨이 걸려있는 print(op), 그러니까 9번째 줄로 이동합니다. 그런데, break가 없어요. 그러면 9번째 줄을 수행하고, case 4 라는 라벨이 붙어있는 10번째 줄도 수행할 거에요.

 

 

 위에 있는 case문을 수행하고 break가 걸리지 않았기 때문에, 아랫쪽 case문으로 내려갔습니다. 이를 fallthrough라고 이야기를 합니다. 그래서 보통, op의 값이 1인 경우 A라는 문장을, 2인 경우 B라는 문장을, 3인 경우 문장 C를, 아닌 경우 D를 수행한다. 이런 식으로 코딩해야 할 경우에는, case 문을 3개 만들어놓고, break를 거는 식으로 코딩을 합니다.

 

 

 즉, case 문의 끝에 break를 걸어두면 switch loop 자체를 빠져나오게 됩니다. 그러니, 3인 경우 C, D가 수행되는 게 아니라, C만 수행되고 빠져나오는 효과를 보게 됩니다. 이를 코드로 구현하면 아래와 같습니다.

 

 

 break를 만나면, 제어가 12번째 줄로 이동합니다. 이 점을 주목해서 보시면 됩니다.

 

 


 그런데 fallthrough가 유용하게 쓰이는 경우도 있습니다. 예를 들어서 op의 값이 2이거나 6일 때 B를, 3이거나 1일 때 A를, 4이거나 5일 때 C를 수행하고, 그게 아니라면 D를 수행해야 한다고 칩시다.

 

 

 그러면 이렇게 그릴 수 있어요. op가 1인 경우, 그냥 라벨 3번으로 내려오게 만듭니다. op가 3인 경우, 바로 라벨 3번으로 갈 건데요. 이 때, A를 출력하고 break를 해 버려서 switch 문을 빠져나갑니다.

 

 

 그러면 이렇게 그리면 될 겁니다. 2이거나 6인 경우에 B를, 4이거나 5인 경우 C를, 그게 아닌 경우 D를 출력하라고 했는데요. 이 경우에는 어떻게 그리면 될까요? 똑같습니다.

 

 

 이것을 그대로 코드로 구현해 봅시다.

 

 

 그러면 위와 같이 구현하면 좋을 거에요. break를 걸지 않았을 때, 밑에 있는 case로 fall이 된다는 것을 십분 활용한 셈입니다.

 

 


 이야기가 삼천포로 빠졌으니, c언어의 switch문을 잘 활용할 수 있는 예제를 들고 오겠습니다. a와 b, 그리고 op를 받습니다. 이 때, op가 1이면 a+b를, 2이면 a-b를, 3이면 a*b를 출력합니다. 당연하게도 그 외의 수가 들어오면 error를 출력해야 합니다. 어떻게 해야 할까요?

 

 

 그림으로 그려보면 위와 같을 겁니다. 이것을 그대로 코드로 바꿔 봅시다.

 

 

 case 문에 각각 op가 1인 경우, 2인 경우, 3인 경우에 두 수의 합, 차, 곱을 출력하게끔 하면 됩니다. 그렇지 않은 경우에, 에러다. 라는 정보를 출력해 주면 되겠네요.