1장에서 살펴본 if-else 체인 구조는 특정 변수에 대해서 고려해야 할 값이 여러 개 있고, 이중에서 한 개를 선택하는 경우를 표현한다. C는 if-else 체인 구조 대신 사용할 수 있는 switch 문을 제공한다.

다음은 switch 문의 일반적인 형식이다.

 

 


       Switch (식)
       {
       case 값 1 :
              행동 1 ;
              break ;
       case 값 2 :
              행동 2 ;
              break ;
       ...
       case 값 n :
              행동 n ;
              break ;
       default :
              행동 n+1 ;
       }


위 switch 문의 의미는 다음과 같다: 먼저, switch 다음에 오는 괄호 안에 표현된 식을 평가하고, 그 값을 첫 번째 case의 값, 값1과 비교한다. 두 값이 일치하면 행동1을 수행하고, break 문을 수행하여 switch 문을 빠져 나온다. 식의 값이 값1과 일치하지 않으면, 두 번째 case의 값, 값2와 비교한다. 두 값이 일치하면 행동2를 수행하고, break 문을 수행하여 switch 문을 빠져 나온다.

이와 같은 방식으로, 식의 값을 첫 번째 case의 값부터 비교하여 일치되는 case 값을 찾을 때까지 내려간다. 식의 값과 일치된 case 값을 만나면, 그 case에 명세된 행동을 수행하고, case 문 끝에 명세된 break 문을 통해서 switch 문을 빠져 나온다. 만약, 식의 값과 일치된 case 값이 존재하지 않을 경우에는 switch 문 끝 부분에 위치한 default에 명시된 행동n+1을 수행하고 switch 문을 빠져 나온다.

다음은 동영상을 통해서 swith 문의 실행 의미를 다시 한번 보여준다.

따라서 switch 문의 실행 의미는 다음과 같이 if-else 체인 구조로 표현될 수 있다.


위의 switch 문과 if-else 체인 구조는 완전히 동일한 의미를 갖는다. 따라서 switch 문 없이도 여러분은 프로그램을 작성할 수 있겠으나, switch 문의 사용을 통해서 프로그램을 보다 알기 쉽고 효과적으로 작성할 수 있다.

다음은 프로그램 5-1에서 if-else 체인 구조로 작성된 선택 구조를 switch 문 버전으로 다시 작성한 것이다.

switch 문의 선택 구조를 위한 알고리즘은 어떻게 기술되는가? 여러분은 이러한 구조의 알고리즘을 적절히 기술할 수 있겠으나, IF 문처럼 다음과 같이 좀더 형식적으로 CASE 구조 형태로 기술할 수 있다.

 
 
 

     CASE
              : 조건 식1: 행동1
              : 조건 식2: 행동2
              ....
              : 조건 식n: 행동n
              : ELSE: 행동n+1
       ENDCASE

 
     

위 알고리즘의 의미는 다음과 같다

 

 

조건 식1의 값이 참이면 행동1을 수행하고, CASE 문을 빠져 나온다. 그렇지 않으면 조건 식2의 값이 참이면 행동2를 수행하고, CASE 문을 빠져 나온다. 이와 같이 차례로 참이 되는 조건 식을 찾아간다. 참이 되는 조건 식을 찾으면 명세된 행동을 수행하고, CASE 문을 빠져 나온다. 모든 조건 식이 참으로 평가되지 않으면 ELSE에 명세된 행동n+1을 수행하고 CASE 문을 빠져 나온다.

 

CASE 구조 알고리즘의 의미는 switch 문의 의미와 거의 일치되게 해석될 수 있음을 알 수 있다. 따라서 이 알고리즘은 다음과 같이 C의 switch 문으로 직접 변환될 수 있다.

다음은 switch 문의 다른 예제이다.

위 문제에 대한 알고리즘을 IF-ELSE의 선택 구조를 사용하여 표현할 수 있겠으나, 다음과 같이 CASE 구조의 선택 구조로 표현한다.

위 문제에 대한 알고리즘을 다음과 같이 case 구조의 선택 구조를 사용하여 표현할 수 있다.

 
알고리즘 5-3
 
 

     
      n에 정수를 읽어 들인다.
       CASE
              : n이 1이면: 를 'A'출력
              : n이 2나 3이면: 'B'를 출력
              : n이 4,5 또는 6이면: 'C'를 출력
              : n이 7이나 8이면: 'D'를 출력
              : n이 9이면: 'F'를 출력
              : ELSE:
                     "wrong number"를 출력
       ENDCASE

 
     

 

위의 알고리즘은 다음과 같이 switch 문을 사용하여 C 프로그램으로 작성될 수 있다.

       


       int n;
       scanf("%d", &n); 
       switch(n)
       {
              case 1 :
                     printf("%c\n", 'A');
                     break;
              case 2 :
                     printf("%c\n", 'B');
                     break;
              case 3 :
                     printf("%c\n", 'B');
                     break;
              case 4 :
                     printf("%c\n", 'C');
                     break;
              case 5 :
                     printf("%c\n", 'C');
                     break;
              case 6 :
                     printf("%c\n", 'C');
                     break;
              case 7 :
                     printf("%c\n", 'D');
                     break;
              case 8 :
                     printf("%c\n", 'D');
                     break;
              case 9 :
                     printf("%c\n", 'F');
                     break;
              default :
                     printf( "Wrong Number\n");
       }

 
     

 

위의 프로그램에서 n의 값이 2, 3인 경우에 수행하는 행동이 동일하고, 4, 5, 6인 경우에 수행하는 행동이 동일하고, 7, 8인 경우에 수행하는 행동이 동일함을 알 수 있다.

이와 같이 case의 행동들이 동일한 경우가 존재할 때, 다음과 같이 행동이 동일한 여러 case들을 붙여서 더욱 간단하게 프로그램을 작성할 수 있다. 프로그램 5-3과 5-3-1은 그 의미가 동일하다.

       


       int n;
       scanf("%d", &n); 
       switch(n)
       {
              case 1 :
                     printf("%c\n", 'A');
                     break;
              case 2 :
              case 3 :
                     printf("%c\n", 'B');
                     break;
              case 4 :
              case 5 :
              case 6 :
                     printf("%c\n", 'C');
                     break;
              case 7 :
              case 8 :
                     printf("%c\n", 'D');
                     break;
              case 9 :
                     printf("%c\n", 'F');
                     break;
              default :
                     printf( "Wrong Number\n");
       }

 
     


switch 문에서 default 문은 생략될 수 있다. 프로그램 5-3-1에서 default 문을 제거한 다음 프로그램 버전은 올바르다. 이 경우에, n의 값이 11이면 아무 것도 출력되지 않을 것이다.

       


       int n;
       scanf("%d", &n); 
       switch(n)
       {
              case 1 :
                     printf("%c\n", 'A');
                     break;
              case 2 :
              case 3 :
                     printf("%c\n", 'B');
                     break;
              case 4 :
              case 5 :
              case 6 :
                     printf("%c\n", 'C');
                     break;
              case 7 :
              case 8 :
                     printf("%c\n", 'D');
                     break;
              case 9 :
                     printf("%c\n", 'F');
                     break;
       }

 
     

다음은 문제 5-3을 if-else 체인 구조를 사용하여 알고리즘을 작성하고, 이를 C 프로그램으로 작성한 것을 보여준다.


프로그램 5-3-1과 5-3-3를 비교해 보라. 어느 버전 프로그램이 선호되는가? 프로그램을 이해하기에는 if-else 구조를 사용한 5-3-3의 버전이 더 좋은 것 같고, 5-3-1 버전이 프로그램을 작성하기에는 더 좋은 것 같다. 이러한 판단은 확실하지 않으나, 다음 장에서 다루겠지만 switch 문이 if-else 체인 구조보다는 오류를 초래할 가능성이 더 많다는 것은 확실하다.

어느 버전을 선호하느냐는 문제에 따라 다르나, 일반적으로 선택의 가지 수가 많은 경우에 switch 문이 선호된다.

프로그램 5-3-1 ~ 5-3-3을 Visual Studio C++ 환경에서 입력하고, 컴파일하고, 실행시켜 보라.
프로그램간의 차이를 주의 깊게 살펴 보라.

 


top으로... 다음페이지로.. 이전페이지로.. home으로..

top으로... 다음페이지로.. 이전페이지로.. home으로..

top으로... 다음페이지로.. 이전페이지로.. home으로..

 

top으로... 다음페이지로.. 이전페이지로.. home으로..