C & C++

[C언어] switch ~ case 문 사용법, 유의 사항 정리

jimmy_AI 2021. 12. 15. 15:09
반응형

C언어 조건문 분기 : switch ~ case 문

안녕하세요. 이번 글에서는 C언어에서 조건이 여러개인 경우

분기를 원활하게하고, 가독성을 높일 수 있는

switch ~ case 문의 사용법에 대해서 살펴보겠습니다.

 

예를 들어, 한 과목의 총점이 80점 이상이면 A, 60점 이상이면 B,

40점 이상이면 C, 20점 이상이면 D, 20점 미만이면 F를 부여하는 상황의

예시를 들어보도록 하겠습니다.

 

일단 다음 처럼 if와 else if 문을 통해서 코드를 작성해볼 수 있을 것입니다.

#include <stdio.h>

int main(){

int midterm = 41;
int finalterm = 45;

int total = midterm + finalterm;

if(total >= 80)
  printf("A학점 입니다.\n");
else if(total >= 60)
  printf("B학점 입니다.\n");
else if(total >= 40)
  printf("C학점 입니다.\n");
else if(total >= 20)
  printf("D학점 입니다.\n");
else
  printf("F학점 입니다.\n");

}

중간 + 기말 점수 합이 86점으로, A학점이라는 메시지가 잘 출력되기는 하지만,

else if 내에 조건을 계산 반복해서 써주어야 한다는 번거로움이 있습니다.

 

모든 조건이 전부 total 변수의 값에 의해서 지배를 받는 상황인데요.

이런 경우 switch ~ case 문을 사용한다면 코드를 다음과 같이 작성할 수 있습니다.

#include <stdio.h>

int main(){

int midterm = 41;
int finalterm = 45;

int total = midterm + finalterm;

int total_reduce = total / 20; // 20으로 나눈 몫

switch(total_reduce){
  case 5: // total = 100
    printf("A학점 입니다.\n");
    break;
  case 4: // total >= 80
    printf("A학점 입니다.\n");
    break;
  case 3: // total >= 60
    printf("B학점 입니다.\n");
    break;
  case 2: // total >= 40
    printf("C학점 입니다.\n");
    break;
  case 1: // total >= 20
    printf("D학점 입니다.\n");
    break;
  default: // total < 20
    printf("F학점 입니다.\n");
}

}

총점을 20으로 나눈 몫의 숫자를 가지고 case를 나눠서 작성해볼 수 있습니다.

 

위 코드의 예시를 살펴보시면 이해가 쉽겠지만,

switch ~ case 문의 문법은 다음과 같이 짜여집니다.

 


switch(검사할 변수){

   

   case 검사할 변수의 값 1:

     실행될 코드 1;

     break;

   case 검사할 변수의 값 2:

     실행될 코드 2;

     break;

   ...

   default:

     실행될 코드;

}

 


여기서 저희는 검사할 변수와, break, default 부분에 주목해서

switch ~ case 문을 사용할 경우, 유의할 점을 말씀드리겠습니다.

반응형

C언어 switch ~ case 문 유의 사항 1 : 검사할 변수의 타입 (int, char 형)

위 코드에서 의문이 들 수 있는 점이 있는데요.

점수가 72, 86점 처럼 정수형일 수도 있겠지만,

때로는 65.7, 83.5점 처럼 실수형일 수도 있을 것 같습니다.

 

switch ~ case문의 유의 사항이자 단점 중 하나는 검사할 변수로 int와 char형만

지정이 가능하고, double 등 다른 자료형은 지정할 수 없다는 것입니다.

 

위 예시 코드에서 다음과 같이 코드 한 줄을 바꿔서 실행시켜 보겠습니다.

// 원래 코드
int total_reduce = total / 20;

// 바꿔본 코드
double total_reduce = total / 20.0;

그랬더니, 다음과 같이 컴파일 에러가 발생하는 것을 확인해볼 수 있습니다.

double 자료형은 invalid하다고 등장하며 코드가 실행되지 않았습니다.

 

아쉽게도, 위와 같은 상황에서는 정수형으로 대치한 다음 사용하는 대체 방법

고려하시거나, if ~ else if 문을 사용하시는 방법을 택하셔야 합니다.

 

 

 

C언어 switch ~ case 문 유의 사항 2 : break와 default

이번에는 breakdefault의 용도에 대해서 살펴보겠습니다.

 

먼저, switch ~ case 문의 특징을 하나 알아두셔야 하는데요.

바로, case 중 하나에 해당될 경우, 아래의 코드는 모두 실행한다는 것입니다.

다음과 같이 break를 빼고 위 예시 코드를 다시 작성해보겠습니다.

#include <stdio.h>

int main(){

int midterm = 41;
int finalterm = 45;

int total = midterm + finalterm;

int total_reduce = total / 20;

switch(total_reduce){
  case 5: // total = 100
    printf("A학점 입니다.\n");
  case 4: // total >= 80
    printf("A학점 입니다.\n");
  case 3: // total >= 60
    printf("B학점 입니다.\n");
  case 2: // total >= 40
    printf("C학점 입니다.\n");
  case 1: // total >= 20
    printf("D학점 입니다.\n");
  default: // total < 20
    printf("F학점 입니다.\n");
}

}

원래는 case 4: 에만 해당이 되서 "A학점 입니다" 메시지만 출력되어야 하는데,

실제 출력 결과는 다음과 같았습니다.

case 4: 에 해당된 이후로, case 3, 2, 1 그리고 default 부분의 코드까지 모두 실행

된 것을 확인할 수 있었습니다.

 

즉, break는 원하는 코드 부분만 실행되고 switch 문이 정상 종료될 수 있게 해주는

중요한 역할을 해주므로, 생략되서는 안됩니다.

 

default 문은 마지막 부분에 써주는데, 앞의 모든 case에 해당되는 조건이 없는 경우,

해당 코드를 실행하게 되는 역할을 가집니다.

즉, if ~ else 문에서 else 문의 역할과 동일하다고 볼 수 있으며,

default 부분은 생략이 가능합니다.

 

기타 참고 사항

이 외에도 case 뒤에는 세미콜론(;)이 아닌 콜론(:)이 와야하며,

case 사이에는 중괄호{}로 구분을 하지 않는다는 점도 참고해주시면 좋을 듯 합니다.

물론, 위에서는 가독성을 위해 들여쓰기를 하였으나, 들여쓰기는 C언어에서는

필수는 아닙니다.(다음 case를 만나면 자동으로 분기됩니다.)