switch 문

switch 문 개념

switch문 또는 switch …case문은 한마디로 선택적 실행 문입니다.
switch 문의 조건과 일치하는 case의 실행 문장이 선택 되어 실행 됩니다.

switch 문의 구조

switch (조건)
{
case 1:
  실행 문 1 ;
   break ;
case 2:
  실행 문 2 ;
   break ;
case 3:
   실행 문 3;
   break ;
default:
   실행 문 
   break ;
}

switch문의 조건과 실행

조건에는 정수 타입의 상수 , 변수가 올 수 있습니다. 따라서 수식일 경우에는 그 결과 값이 정수인 경우에만 가능합니다.
case 뒤에 오는 기호는 세미 콜론이 아닌 콜론입니다. 주의 해야 합니다.
조건을 충족하는 case의 실행 문이 실행됩니다. 그런데 , 조건을 만족하는 case가 존재하지 않는 다면 ? 그 때는 default 의 실행 문이 실행됩니다.
특정 실행 문이 실행된 후에는 break 문을 통하여 switch 문을 탈출하게 됩니다.
case문은 사용 제한이 없기 때문에 필요에 따라 얼마든지 추가할 수 있습니다.
case 4 , case 5, …. 등등 필요한 만큼 붙일 수 있습니다.

예제 1

#include <stdio.h>

int main(void)
{
	int number;
	printf("1이상 6이하의 정수를 입력 하세요: ");
	scanf("%d", &number);  //입력 함수
	
	switch(number)
	{
	case 1:
		printf("입력 숫자 : 1 \n");
		break;
	case 2:
		printf("입력 숫자 : 2 \n");
		break;
	case 3:
		printf("입력 숫자 : 3 \n");
		break;
	case 4:
		printf("입력 숫자 : 4 \n");
		break;
	case 5:
		printf("입력 숫자 : 5 \n");
		break;
	case 6:
		printf("입력 숫자 : 6 \n");
		break;
	default:
		printf("입력 범위 오류입니다. \n");
	}
	return 0;
}

scanf 함수를 통하여 사용자로부터 정수를 입력 받습니다.
1을 입력 받는다면 “입력 숫자 : 1″이 출력 되고 break 문에 의해 switch 문을 빠져 나갑니다. 4를 입력 받는다면 “입력 숫자 : 4” 가 출력 됩니다.
그러나 , 7이 입력 된다면 이것을 만족 시키는 case 문이 없으므로 default 의 실행 문이 실행되어 “입력 범위 오류입니다.” 가 출력 됩니다.

break 문의 생략

일반적으로 break 문은 반복문을 탈출하기 위한 용도로 사용 됩니다.
switch 문에서도 동일한 목적으로 이용됩니다. 그렇다고 switch 문에 break문이 필수적으로 사용되어야 하는 것은 아닙니다.
일단 break문의 유무에 따른 차이점을 예제를 통해 알아 봅시다.

예제 2

int main(void)
{
 ...
switch(v)   //변수v에 2가 인자로 전달 되었다고 가정합시다.
{
  case 1 : 
    printf("a");
    printf("b");
    break;
  case 2:
    printf("c");
    printf("d");
    break;
  default:
    printf("e");
    break;
 }
 ...
}

위 예제에서 변수 v에 2 가 오면 case 2 의 실행 문이 실행되어 c ,d가 출력 됩니다.
그리고 바로 밑에 있는 break문에 의해 switch 블록에서 벗어 나게 됩니다.
이러한 실행 흐름이 일반적인 switch 문의 진행 절차 입니다.
아래 예제 3를 봅시다.

예제 3 (break문 제거)

int main(void)
{
 ...
switch(v)     //변수v에 2가 인자로 전달 되었다고 가정합시다.
{
  case 1 : 
    printf("a");
    printf("b");
  case 2:
    printf("c");
    printf("d");
  default:
    printf("e");
 }
 ...
}

예제 3 은 예제 2 에서 break 문을 제거한 코드 입니다.
break 문이 없기 때문에 변수 v 에 2가 전달되면 switch 문을 빠져 나오지 않고 그 그 아래에 있는 default 의 실행 문까지 실행하게 됩니다.
따라서 c , d 뿐만 아니라 e 까지 출력하게 됩니다.

break 문이 있는 switch 문이 일반적으로 사용이 많이 됩니다. 그러나 , 일률적으로
break 문이 있어야 “효율적이고 이상적인 코드 이다” 라고 할 수는 없습니다.
아래 예제를 봅시다

예제 4

#include <stdio.h>

int main(void)
{
	char sel;
	printf("K 한국, S 서울,  \n");
	printf("입력: ");		
	scanf("%c", &sel);
	
	switch(sel)
	{
	case 'K': //대문자 K
	case 'k': //소문자 k
		printf("Korea \n");
		break;	
	case 'S': //대문자 S
	case 's': //소문자 s
		printf("Seoul \n");
		break;
	}
	return 0;
}

위 예제 4 는 k 또는 s 문자를 입력 받아 ” Korea” 또는 “Seoul” 을 출력 합니다.
break 문이 없기 때문에 대문자로 입력을 하든 , 소문자로 입력을 하든, k , s 라는 문자만 입력 하면 원하는 출력이 이루어 집니다.
이와 같이 break 문이 필요 없는 경우가 더 쓸모 있다면 break문을 삽입 안 하면 그만 입니다. 자신이 원하는 프로그램의 실행 흐름에 맞추어 break 문의 삽입 여부를 결정하는 것이 가장 좋습니다.

switch 문 과 if..else if …else 문

switch문은 if 문으로 바꿀 수 있습니다.
아래 예제를 봅시다.

예제 5

if(v==1)
  printf("A");
else if(n==2)
  printf("B");
else if (n==3);
  printf("C");
else
  printf("D");

예제 6

switch(v)
{
  case 1 :
   printf("A");
   break ;
  case 2 :
   printf("B");
   break ;
  case 3 :
   printf("C");
   break ;
 default :
   printf("D");
   break ;
}

위의 예제 5 , 예제 6 의 실행 결과는 동일 합니다.
따라서 서로 바꿀 수 있습니다.
경우의 수가 많고 정수 값에 따라 실행을 해야 하는 때에는 switch 문을 사용하는 것이 좋습니다. 그러나 ,그 이외의 경우에는 결국 선택하기 나름인 것 같습니다.