결정, 결정

우리는 무엇을 다룰 것인가?
  • 세 번째의 프로그래밍 구조 - 분 기
  • 단일 분기와 다중 분기
  • 불리언 표현식 사용하기

세번째의 우리의 기초적인 빌딩블록은 분기하기 혹은 조건 서술문 conditional statements이다. 이것들은 우리의 프로그램 안에서 어떤 조건에 따라서 코드의 몇 개의 가능한 연속중에서 하나를 실행하는 능력을 간단하게 기술하는 용어이다.

어셈블러 프로그램의 초창기로 돌아가서 가장 간단한 분기는 JUMP명령어로서 거기에서 프로그램은 보통 그 전 명령어의 결과가 0이라면, 문자 그대로 특정한 메모리 주소로 점프한다 - 놀랍도록 복잡한 프로그램이 다른 형태의 조건이 실제적으로 가능하지 않음에도 불구하고 작성되어졌다 - 프로그래밍을 위한 최소한의 필요조건에 관한 다잌스트라의 언급의 정당성을 입증한다. 상위 수준 언어가 나타나자 JUMP명령어의 새로운 버전이 나타나 GOTO라고 불리워졌다. 사실 베이직은 여전히 GOTO 를 제공하고 있으며 여러분은 다음의 코드의 조각을 타이프해 봄으로써 그것을 시험해 볼 수 있다:

10 PRINT "Starting at line 10"
20 J = 5
30 IF J < 10 GOTO 50
40 Print "This line is not printed"
50 STOP

이렇게 짧은 프로그램에서조차도 무슨일이 진행되고 있은지 이해하기 위해서는 얼마나 시간이 걸리는지를 주목하라. 그 코드에는 구조가 전혀 없으며, 여러분은 문자그대로 그것을 읽으면서 이해해야 한다. 그러한 이유로 대부분의 현대의 프로그래밍 언어는 직접적인 JUMP나 혹은 GOTO문을 가지고 있지 않거나 그렇지 않으면 여러분이 그것을 사용하지 않도록 권장한다.

if 서술문

가장 직관적으로 명백한 조건 서술문은 if, then, else 구조이다. 만약 if 어떤 불리언 조건이 참이라면 그러면 then 한 블록의 서술문이 실행되고 그렇지 않으면(또는 else) 다른 블록이 실행된다는 점에서 그것은 영어의 논리를 따른다.

그것은 베이직에서 이렇게 보인다:

PRINT "Starting Here"
J = 5
IF J > 10 THEN
    PRINT "This is never printed"
ELSE
    STOP
END IF

다행스럽게도 이것은 이전의 GOTO예제보다는 읽고 이해하기에 더 쉽다. 물론 그것이 참 혹은 거짓으로 평가되는한 즉 불리언 값인 한, 우리가 원하는 어떠한 검증조건이라도 우리는 if 의 뒤에 놓을 수가 있다.

파이썬도 대단히 비슷하다:

import sys  # only to let us exit
print "Starting here"
j = 5
if j > 10:
    print "This is never printed"
else:
    sys.exit()

이것은 거의 동일하다, 그렇지 않은가?

여러분은 다른 하나에 또 다른 하나를 다음과 같이 내포시킴으로써nesting, 계속하여 이러한 if/then/else 서술문을 함께 연결할 수 있다:

# Assume width created previously...
if width == 100:
   area = 0
else:
   if width == 200:
      length = length * 2
   else:
      if width == 500:
           width = width/10
      else:
           print "width is an unexpected value!"

주 의:우리는 == 을 사용하여 각각의 if 서술문의 동등성을 검증하였다. 반면에 우리는 = 을 사용하여 변수에 값을 할당하였다. 여러분이 == 를 사용하려고 할 때 = 를 사용하는 것은 파이썬 프로그래밍에서 가장 흔한 실수중의 하나이다, 다행스럽게도 파이썬은 여러분에게 그것은 구문에러라고 경고해 준다. 그러나 여러분은 세심하게 살펴서 그 문제를 인식할 필요가 있다.

불리언 표현식

여러분은 '원 재료'의 섹션에서 우리가 불리언Boolean 형의 데이타를 언급했다는 것을 기억할 지 모르겠다 그것은 단지 두 개의 값만을 가진다고 우리는 말했다:true 혹은 false. 우리는 거의 불리언 변수를 만들지는 않는다 그러나 때로는 임시적인 불리언 값을 만들어 표현식expressions을 사용한다. 표현식은 값을 산출하기 위하여 연산자에 의하여 결합된 값과 변수의 조합이다. 다음의 예제에서:

if x < 5:
  print x

x < 5는 표현식이다. 표현식이 결국엔 하나의 값으로 평가되는한 표현식은 임의적으로 복잡할 수 있다. 분기의 경우에 그 값은 반드시 참true 이거나 false이어야만 한다. 그렇지만, 이러한 2개의 값을 정의 하는 것은 언어에 따라 변한다. 많은 언어에서 거짓은 0 혹은 존재하지 않는 값(가끔NULL, Nil 혹은 None이라고 불리운다)과 같다. 그런식으로 빈 리스트 혹은 문자열은 불리언적인 문맥에서 거짓으로 평가된다. 이것은 우리가 while회돌이를 사용하여 문자열이 빌 때까지 혹은 예제와 같이 리스트를 처리할 수 있다는 것을 뜻한다. 파이썬, 큐베이직 그리고 티클 모두는 이런식으로 불리언 값에 접근한다.

Tcl의 분기

티클의 if 서술문은 대단히 비슷하여, 다음과 같다:

if {$x < 5} {
   puts $x
}elseif {$x == 5} {
   puts "its 5!"
}else{
   puts "greater than 5"
   }

이것은 직설적이며, 물론 elseifelse 부분은 선택적이다. 그러나 여러분은 아마도 그것을 예상했을 것이다.

Case 서술문

일련의 내포된 if/else/if/else... 은 일반적인 구조여서 많은 언어들이 특별한 분기의 형태를 그것을 위하여 제공한다. 이것은 때때로 Case 혹은 Switch 서술문으로 언급되곤 하는데 티클 버전으로는 다음과 같다:

switch $width {
    100 { set area 0}
    200 { set length [expr {$length * 2}] }
    500 { set width [expr {$width / 2}] }
    }

베이직도 파이썬도 그러한 구조를 제공하지는 않지만 더 쉬운 if/elseif/else 형식을 제공함으로서 타협점을 제시한다:

if width < 100:
   area = 0
elif width < 200:
   length = length * 2
elif width < 500:
   width = width/10
else:
   print "width is too big!"

elif의 사용법과 (파이썬에서는 엄청 중요한) 들여쓰기가 변하지 않았다는 사실을 주목하라. 또한 이 프로그램에 대한 두 개의 파이썬 버전 모두 동등하게 유효하며, 단지 두 번째는 점검부가 많다면 읽기에 더 쉬울 뿐이라는 것을 지적할 만한 가치가 있다.

BASIC은 약간은 성가신 ElseIf...THEN버전을 제공하는데 그것은 정확히 파이썬의 elif와 같은 방식으로 사용된다.

기억해야 할 요점
  • if/else를 사용하여 분기하라
  • else 는 선택적이다
  • 다중 결정은 CASE 혹은 if/elif 구조로 나타내어질 수 있다
  • 불리언 표현식은 true 또는 false 를 반환한다.

Previous  Next  Contents


이 페이지에 대하여 질문 혹은 제안사항이 있으면 다음주소로 나에게 전자메일을 보내라: agauld@crosswinds.net