프로그래밍[Univ]/프로그래밍 언어론

[프로그래밍 언어론] Statement - Level Control Structure Part 2 - Multiple Selection Constructs

Cloud Travel 2011. 11. 6. 20:50
* if문에 의해서 2개를 선택하는 구조가 생성되었다. 더나아가 사람들은 다중선택 구조를 설계하였다.
   대표적인 다중선택 구조는 switch-case문이라고 할 수 있다. 이번엔 이 다중선택 구조에 대해서 알아보자.

* 설계 이슈
 ⓐ 표현식의 구조와 선택구문의 타입은 어떤 것으로 할 것인가?
  > (in C) switch(선택구문){ ... }  
 ⓑ 어떤 case를 선택하게 할 것인가? (single, compound, sequential)
 ⓒ 전체가 하나로 묶여 있는가?
  > 캡슐화가 되어 있는가?
 ⓓ 각 case에 해당하는 제어단위는 어떻게 할 것인가?
  > 해당 case만 실행할 것인가? case이하의 모든 구문(case문은 생략)을 실행할 것인가?
 ⓔ case로 제공되지 않은 표현에 대한 처리는 어떻게 해줄 것인가?
  > (in C) switch문의 default 선택

* 초기의 다중 선택구문
 - (In FORTRAN) arithmetic IF ( three-way selector)
    IF ( arithmetic expression ) Label1, Label2, Label3
    > 어떠한 표현식을 3가지로 구분이 가능할때 해당 라벨로 goto를 실시한다.
    ex) IF ( INUMBER + 10 ) 10, 20, 30 // 어떤 정수형태의 값은 3가지 형태를 취한다. 양수, 음수, 0
          // 0 일때는 goto10,  음수일때는 goto 20, 양수일때는 goto 30
          10: stmts;       // 각각 결과에 따라서 goto해와서 실행했기 때문에 아랫값을 지속적으로 실시
               GOTO 40;  // 따라서, goto문을 이용해서 if문 바깥으로 한번더 점프해야한다.
          20: stmts;   
               GOTO 40
          30: stmts; 
          40: ... // if문의 밖 
 - 설계에서 안좋은 현상들 : 캡슐화 되어있지 않으며, 각각의 segments(case)가 GOTO문을 수반한다.

* 현재의 다중 선택구문 
 ⓐ C / C++ switch 문!
  - 디자인 선택
   > form : switch(<expression>) { {<constant_expression> : <stmt>;}+ [default: <stmt>;] }
   > expression type(선택구문) : 컴퓨터가 판단했을 때, Integer로 인식가능한 것
                                              (integer variable, enum,char,boolean, ...)
   > 구조는 Block({})에 의해서 캡슐화 되어있다.
   > case 이하의 구문을 모두 실행 가능하게 설계를 하였다.(break 구문으로 피할수 있다.)
       : 유연성과 신뢰성을 교환하였다. 유연성을 높이고 신뢰성을 낮춤 - 편리함을 위해서!!
   > default 구문의 제공으로 제공되지 않은 값에 대한 처리를 해주었다. 
   ※ default가 없으면 존재하지 않는 값에 대해서는 그냥 통과한다.
 ⓑ Ada : case 문!
  - "case&when"라는 키워드를 이용하여 다중 선택구문을 구현함.
  ex) case A is
          when 1 => stmts;
          when 2...5 => stmts; // sub-range로 조건 선택 가능!
          when 7|9|11 => stmts; // 여러가지 값을 한줄에 작성이 가능! or연산 가능
          others => stmts; // c의 switch의 default 개념으로 제공되지 않는 값에 대한 처리 실행. 
                                  // C와 반대로 others를 지정하지 않고 when에 해당하지 않는 값이 들어오면 error발생
       end case // case문의 끝을 알려줌. 캡슐화 
  - 디자인 선택
   > form : case (<expression>)  {when <expression> => <stmts>;}+ [others => <stmts>;]  end case
   > expression type(선택구문) : 컴퓨터가 판단할 때, Integer로 인식 가능한 것
   > 구조는 case ... end case 에 의해서 캡슐화 되있다.
   > 해당 경우에 해당하면 그 해당하는 것만 실행을 한다. > 신뢰성향상!
   ※ 이를 하기 위해서 when 뒤에 오는 리터럴값은 유니크해야한다.
   > other 구문의 제공으로 제공되지 않는 값에 대한 처리를 해주었다.
   ※ C와 다르게 other이 없을때 존재하지 않는 값이 들어오면 Error가 발생한다.
 ⓒ two-way selectors(ex) if문)를 이용하여 다중 선택구문을 구현할 수 있다.
  - 대부분의 경우의 다중 선택구문은 Integer값이나 순서타입, 기타등등 정수로 표현되는 것으로 나눈다.
    하지만 if문의 경우는 부일식에 기반하여 이뤄지므로 선택을 하는 것에 더욱 적합하다.
  - 하지만 이러한 경우(two way로 multiple way 표현)에는 깊숙히 중첩되면 판독성이 어려워 진다.
  ex) if ...
         then ...
        else
          if ...
            then ...
          else
            if ...
            then ...
          ........
    ※ 위의 소스는 Ada의 코드이다. 
  - 이렇게 가독성이 떨어지는 것에서 가독성을 올리기 위해서 새로운 특수어가 제공되는 언어가 많다.
      ex) C언어의 else if, Ada의 elsif, Paython의 elif ... 등 (이러한 것을 else-if절 else-if clauses라고 한다.)
    위의 소스를 elsif를 이용하여 다시 작성한다면 판독성이 향상되는 것을 알수 있을 것이다.
    if ...
      then ...
    elsif
      then ...
    elsif
      then ...
     end if