프로그램에서 세 가지 이상의 여러 가지 경우 중에서 한 가지를 선택해야 하는 상황이 발생할 수 있다. 4주차 강의에서 살펴본 if 문은 한 가지 경우를 선택하는 구조를 제공하고, if-else 문은 두 가지 경우 중에서 선택하는 구조를 제공한다. 그렇다면 세 가지 이상의 경우 중에서 선택해야 하는 상황을 어떻게 표현할 수 있는가?

가령, 상태 값을 포함하는 status 변수를 생각해보자. status는 1이나 2의 값을 가질 수 있고, status가 포함하는 값에 따라서 취할 행동이 각각 다르다고 가정한다. 이와 같은 상황을 다음과 같이 다이어그램으로 표현할 수 있다.

   

 

즉, status의 값이 1이면 행동 A를 수행하고, 2이면 행동 B를 수행하고, 그렇지 않으면 행동 C를 수행한다. 위의 상황을 C 문장으로 어떻게 표현할 수 있겠는가?

문제를 단계별로 생각해보자. 먼저, status의 값이 1인지를 판단하는 if-else 문을 다음과 같이 생각한다.

 

status의 값이 1인 경우에 수행할 행동 A를 then-부분에 명세할 수 있다. 다음에, else-부분에 무엇을 명세할 것인가? 우리가 할 일은 다시 status의 값이 2인지를 판단하는 것이다.

이것은 또 다른 if-else 문을 요구한다. 그렇다면, else-부분에 다른 if 문이 올 수 있는가? 그렇다. if 문의 then-부분이나 else-부분에는 C 문장들이 올 수 있는데, if 문이 C 문장에 속하기 때문이다.

즉, if 문의 then-부분이나 else-부분에 또 다른 if 문이 올 수 있는데, 이러한 if 문을 중첩 if 문(nested if statements)이라 한다.

C의 문장은 다양한 구조일 수 있다. 지금까지 배운 C 문장은 선언문, 배정문, if-else 문, if 문일 것이다. 그러나 이 외에도 많은 C 문장이 존재하며, 앞으로 이들을 계속해서 배울 것이다.

따라서 위의 문제에서 else-부분을 또 다른 if-else 문으로 다음과 같이 명세할 수 있다.

 

else-부분에 표현된 if-else 문의 then-부분에 행동 B가 명세되고, else-부분에 행동 C가 명세되는 것을 알 수 있다.

문제를 좀더 구체화시켜보자. 즉, status의 값이 1이면 "Excellent"를 출력하고, 2이면, "Good"을 출력하고, 1이나 2의 값이 아니면 "Normal"을 출력한다고 생각한다. 이를 C의 중첩 if 문을 사용하여 표현하면 다음과 같다.

       
 

     if (status == 1)
          printf("Excellent\n");
     else
          if (status == 2)
               printf("Good\n");
          else
               printf("Normal\n");

 
     

 

C 프로그램에서 들여쓰기나 공백은 무시되므로, 위의 중첩 if 문은 다음과 같이 표현할 수 있다.

       
 

     if (status == 1)
          printf("Excellent\n");
     else if (status == 2)
          printf("Good\n");
     else
          printf("Normal\n");

 
     

위의 구조는 else if가 반복해서 계속 나올 수 있기 때문에 if-else 체인이라 한다. if-else 체인 구조는 세 개 이상 중에서 한 가지의 선택을 표현하는데 매우 유용하게 사용된다.

따라서 C 언어는 if-else 체인을 다음과 같이 일반적인 형식으로 제공한다.

 

          if (조건 식1)
              
 문장1
          else if (조건 식2)
               
문장 2
          else if (조건 식3)
               
문장3
          ....
          else if (조건 식 n)
               
문장n
          else
               
문장n+1

위의 if-else 체인 구조는 선택의 가지 수가 n+1개 존재하는 경우를 나타내며, 다음과 같이 순서도로 보여줄 수 있다.

위의 if-else 체인 구조의 의미는 다음과 같다

 

         조건 식1의 평가 값이 참이면 문장1을 수행한다.
          그렇지 않으면(조건 식1의 평가 값이 거짓이면), 조건 식2를 평가하고,
          그 값이 참이면 문장2를 수행한다.
          그렇지 않으면, 조건 식 3을 평가하고, 그 값이 참이면 문장3을 수행한다.
          ....
          마지막으로, 조건 식n이 참이면 문장n을 수행하고,
          그렇지 않으면 문장 n+1을 수행한다.

위에서 각 문장 수행 후에는 if-else 체인 구조를 빠져나온다.

다음은 if-else 체인 구조에 대한 알고리즘 문장을 보여준다. 이 알고리즘은 if-else 체인 구조에 대한 의미를 형식화시킨 것일 뿐임을 알 수 있다.

 
if-else 체인구조 알고리즘
 
 


          IF (조건 식1이 참이면) THEN
                 문장1을 수행한다.
          ELSE IF (조건 식2가 참이면) THEN
                 문장2를 수행한다.
          ELSE IF (조건 식3이 참이면) THEN
                 문장3을 수행한다.
          ....
          ELSE IF (조건 식n이 참이면) THEN
                 문장n을 수행한다.
          ELSE
                 문장n+1을 수행한다.
          ENDIF
 
 

 
     

 

if-else 체인 구조의 예로서, 다음 문제를 생각해보자.

다음은 위 문제에 대한 알고리즘을 보여준다. status의 값에 따라서 선택할 수 있는 경우의 수가 4가지이므로 if-else 체인 구조의 알고리즘 문장을 사용하여 효과적으로 기술하였음을 알 수 있다.

 
알고리즘 5-1
 
 

         status의 값을 읽어들인다.
          IF (status가 1이면) THEN
                 "Excellent"를 출력한다.
          ELSE IF (status가 2이면) THEN
                 "Good"을 출력한다.
          ELSE IF (status가 3이면) THEN
                 "Normal"을 출력한다.
          ELSE
                 "Fail"을 출력한다.
          ENDIF

 
     

다음은 위 알고리즘에 대한 순서도를 보여준다. 여러분은 앞서 if-else 체인 구조에 대한 순서도를 다루었기 때문에, 아래의 순서도를 잘 이해할 수 있겠다.

 
                                                    <순서도 5-1>


다음은 위의 순서도에서 status의 값에 따라서 if-else 체인 구조의 수행 과정을 보여준다.

다음은 위 문제에 대한 C 프로그램을 보여준다. 다시 한번 문제에 대한 알고리즘으로부터 C 프로그램의 작성과정을 상세히 보여준다.

다음 실습 창을 통해서 위의 프로그램을 입력하고 실행시켜본다.

사용법
1.실습창의 실행 버튼을 클릭하여 프로그램을 실행 합니다.
2.오른쪽 단계별 실행버튼을 클릭해 가며 프로그램을 한단계씩 실행합니다.
3.모든 단계별 실행 종료시 왼쪽의 재실행 버튼을 클릭하여 다양한 변수를 입력하며 프로그램의 단계별 실행 상태를 확인합니다.

 

 

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

 

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