본문 바로가기
쿤즈 Dev/C

[C언어] 조건문을 사용해서 분기시켜보자(2) - switch case 조건문!

by :)Koon 2020. 8. 14.

지난 포스팅에서는 조건문 if 를 사용해서 분기시키는 방법을 알아 보았습니다. 그리고 조건문 if 를 하나가 아닌 여러개로 분기시킬때 사용하기 위해서 if ... else ... 또는 if ... else if ... 와 같은 방법으로 2개 이상의 분기문도 만들어 보았습니다.

 

2020/08/10 - [쿤즈 Dev/C] - [C언어] 조건문을 사용해서 분기시켜보자(1) - if 조건문!

 

 

이번 포스팅에서는 지난번과 같이 조건문이지만 조금 다른게 사용하는 switch ... case ... 문법에 관련해서 알아보겠습니다. 조건문 if 와 switch 문은 각각의 장단점이 있기때문에 프로그래머가 상황에 맞게 사용하는 것이 특징입니다.


조건문 switch case 구문을 알아보자

조건문 switch case 는 switch 조건에 따라서 다양한 case 를 만든다고 생각하시면 됩니다. 따라서 switch 만 단독적으로 사용할 수는 없습니다. 반드시 case 문이 뒤에 따라와야만 합니다. 그리고 여기에서 추가적으로 알아두어야 할 키워드가 있습니다. 바로 break 입니다.

 

break 는 말 그대로 여기서 멈춰라 라는 의미입니다. 문법은 아래와 같이 사용합니다.

switch ( 조건식 )
{
   case 상수1:
      ...
      break;
   case 상수2:
      ...
      break;
   ...
   default:
      ...
}

조건식에는 결과가 상수로 떨어지는 값 또는 문자가 들어갈 수 있습니다. switch 에서 조건식을 만들고 그 조건식이 각각의 case 문에 있는 값과 비교하여 값이 일치할 경우에는 내부에 블록을 실행하고 일치하지 않을 경우는 내부 블록을 건너뛰게 됩니다.

 

 

이때 break 키워드를 사용하지 않았을 경우 case 가 성립한 블록을 처리한 후에 다음 case 까지 진행 할 수 있습니다. 두 경우 모두 실행하게 만들경우에는 상관 없지만 하나의 case 만을 실행하 경우에는 반드시 break 키워드를 사용해 주어야 합니다. 예제를 통해서 알아보겠습니다.


소스코드1 swtich.c

#include <stdio.h>

int main(int argc, const char* argv[]) {
    int score;

    printf("점수 입력 : ");
    scanf_s("%d", &score);

    switch (score / 10) {
    case 10:
    case 9:
        printf("성적 : A\n");
        break;
    case 8:
        printf("성적 : B\n");
        break;
    case 7:
        printf("성적 : C\n");
        break;
    case 6:
        printf("성적 : D\n");
        break;
    default:
        printf("성적 : F\n");
        break;
    }

    return 0;
}

결과1

점수 입력 : 93
성적 : A

점수를 입력받기 위해서 정수형 데이터타입(int) 인 변수 score 를 선언했습니다. 그리고 scanf_s() 함수를 이용해서 값을 표준입력장치(키보드) 로부터 입력받도록 했습니다. scanf() 함수를 사용할 수도 있지만 다음과 같은 에러메세지가 발생합니다.

This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

버퍼오퍼블로우라는 공격으로부터 안전하지 못한 이 함수 대시에 scanf_s 라는 함수로 대체하였습니다. 함수를 그대로 사용하고 싶으시다면 가장 상단에 #define _CRT_SECURE_NO_WARNINGS 한줄을 추가해 주시면 됩니다.

 

키보드로 93 이라는 값을 입력했고 이 값은 score 값에 저장됩니다. 이후 swtich 문을 만나서 score / 10 이라는 조건식을 만납니다. 이 식에서 소수점은 나올수 없습니다. 이유는 정수 / 정수 이기 때문에 반드시 값은 정수입니다. 93 / 10 의 경우 9.3 이지만 정수형 데이터만을 가져오기 때문에 9가 되는 것입니다.

 

case 문을 만나면서 10과 9일때 내부 코드들을 실행하고 마지막에 break 문을 만나면서 swtich 블록을 빠져나오게 되는 프로그램입니다.


만약에 break 문이 없다면 어떻게 될까요?

위에서 언급했듯이 break 문이 없다면 case 문 하나에서 종료되지 않고 다음 모든 case 를 실행하게 됩니다. 다시 한번 소스코드를 보겠습니다.

 


소스코드2 removebreak.c

#include <stdio.h>

int main(int argc, const char* argv[]) {
    int score;

    printf("점수 입력 : ");
    scanf_s("%d", &score);

    switch (score / 10) {
    case 10:
    case 9:
        printf("성적 : A\n");
        //break;
    case 8:
        printf("성적 : B\n");
        //break;
    case 7:
        printf("성적 : C\n");
        //break;
    case 6:
        printf("성적 : D\n");
        //break;
    default:
        printf("성적 : F\n");
        //break;
    }

    return 0;
}

결과2

점수 입력 : 99
성적 : A
성적 : B
성적 : C
성적 : D
성적 : F

이 경우에는 99 라는 정수형 데이터를 입력받아서 switch 문에서 계산한 이후에 case 를 만납니다. case 9 라는 조건에 맞기 때문에 내부 코드를 실행하지만 break 가 없기 때문에 다음 case 문을 모두 실행합니다. break 를 만날때까지말이죠. break 가 끝까지 없다면 모든 코드를 실행하고 switch 문을 빠져나오게 됩니다.

 

따라서 break 를 적절하게 사용해야 합니다. 그렇지 않으면 의도된 결과를 받아보실 수 없기 때문입니다.


지난 포스팅인 조건문 if 에 이어서 이번에는 switch 문에 대해서 알아보았습니다. 비교적 조건문은 간단합니다. 이를 이용하는 실제 프로그래밍들이 엄청 많습니다. 대부분의 프로그래밍은 가장 기본적인 부분을 가지고 응용하기 때문에 개발을 하기 위해서는 기본 구문을 잘 익혀두는것이 중요합니다.

댓글