[Python101] 006 로직(1) – 조건과 조건문

사실, “자료의 유형”에 대해 먼저 다루어야 하는 게 아닌가 싶기도 하지만 그보다든 더 ‘일반적인’ 내용을 다루는 게 맞겠다는 생각에 로직을 먼저 설명하기로 결정했다. 자료의 유형은 사실 대부분의 프로그래밍 서적에서 맨 먼저 다루는 형태인데, 파이썬에서는 일부 매우 중요한 자료형을 제외하고는 ‘개념’만 이해하면 될 정도로 기본적인 내용은 단순하기 때문에 이 부분들은 차근차근히 알아 나가면 될 것 같아서 먼저 로직에 대해 설명해보기로 하겠다.

프로그램은 사람이 정의해준 절차에 따라 컴퓨터가 연속적으로 일을 처리해 나가도록 하는 일종의 “작업 지시서”이다. 당연하게도 파이썬은 소스코드에 명시한대로 일을 처리해 나간다. 하지만 항상 모든 프로그램이 “정해진 일을 순서대로 처리하기만”하는 것은 아니다. 특정한 조건에 따라서 조금씩 다르게 일을 처리해야 하는 경우가 있다. 또한 반복적인 처리를 언제까지 혹은 몇 번이나 반복해야 하는지를 매번 판단해야 하는 상황이 있을 수 있다.

즉 프로그램의 흐름(flow)은 항상 직선으로 나아가는 것이 아니라 많은 상황이나 조건에 따라서 갈림길 중 하나를 택해서 진행되거나, 같은 코스를 수차례 뱅글뱅글 돌게되는 상황이 있을 수 있는 것이다. 이러한 프로그램의 흐름을 결정하는 원리를 “로직”이라고 부른다. 그리고 이 “로직”은 기본적으로 “논리적 판단”을 따르게 된다.

논리적 판단, 참과 거짓

이 때 말하는 논리적 판단이란 아주 간단히 “참”이냐 “거짓”이냐 그 자체이다. 컴퓨터는 이 두가지 경우만은 판단할 수 있다. 모든 것이 딱 부러지게 참 아니면 거짓이되는 것이다. 파이썬에서 참은 True 거짓은 False라고 정의되어 있다. 그리고 이런 참, 거짓을 계산(?)하기 위해서 비교 연산과 논리 연산이라는 것을 하게 된다.

True 와 False 는 참고로 파이썬에는 0, 1 처럼 미리 약속되어 있는 값이다. False는 0 또는 None 과 유사한 개념으로 이해하면 된다. True는 1 혹은 0이 아닌 어떤 것이 될 수 있다.

비교 연산

참이다 거짓이다라는 것은 수학 시간에 배우는 명제의 참과 거짓과는 닮았으면서도 비슷하다. 논리적으로 참과 거짓을 결합하여 계산하는 방식은 수학의 그것을 닮았지만, 컴퓨터는 사람의 언어로 만들어진 명제를 이해하지 못한다. 다만 “3은 2보다 크다”라는 명제를 “3 > 2″라는 수식으로 써 줄 때 이를 계산하여 그것이 참인지 거짓인지를 판별할 수 있는 것이다. 결국 어떤 값이 어떤 값과 같다 / 크다 / 작다를 판별하는 것만이 판단의 기준이 된다.

이러한 판단을 위해서 비교 연산자라는 것을 사용한다. 비교 연산자에는 다음과 같은 것들이 있다.

  • == : 등호(=)를 2개 연속으로 사용하여 A == B 와 같은 형식으로 사용한다. 실제로 A 와 B가 동일한 값이라면 이 식은 참(True)이 된다.
  • >, >= : 크다와 크거나 같다를 의미한다. A >= B 는 A>B 이거나 A==B이면 참이 된다.
  • <,<= :  작다와 작거나 같다를 의미한다.
  • != : 같지 않다는 의미이다.

대화형 쉘에서 다음 수식들을 평가해 도록 하자. 수식을 입력하고 엔터를 치면 True 혹은 False로 결과값이 출력된다. 수식을 실제로 실행하여 평가하기 전에 결과가 True 인지 False인지 먼저 생각해보고, 실행한 결과가 자신의 생각과 맞는지 확인해보자.

  • 1 == 13
  • 13 == “13”
  • 4 > 5
  • -2 <= -2
  • 2 == 2
  • -4 * 0 >= 0
  • ‘Hello’ == “Hello”

논리연산자

비교 연산자는 쉽다. 하지만 현실은 그리 녹록하지 않다. 단순비교를 넘어서 많은 경우에 2개 혹은 3개 가량의 조건을 동시에 고려해야 하는 경우가 많다. 논리 연산자는 여러 개의 조건을 동시에 평가하는데 사용한다. 예를 들자면 가스 밸브의 압력이 10~20 사이일 때가 정상이라고 할 때 가스 밸브의 압력이 정상인지를 판단하기 위해서는 다음의 두 조건을 동시에 만족해야 한다.

  1. 밸브압력 >= 10
  2. 밸브압력 <= 20

이 두 개의 조건을 하나로 묶어주는 것이 논리 연산자이다. 논리 연산자는 역시 의외로 간단하다.

  • AND : A AND B – A도 참, B도 참인 경우에만 참이된다. A가 참, B가 거짓인 경우에는 A AND B는 거짓이다. 즉 2개의 조건이 모두 참인 경우만 참이 된다.
  • OR : A OR B – A, B 둘 중의 하나만 참이면 참이다. OR은 “~ 혹은 ~”의 뜻이므로 글자 그대로 생각하면 된다.
  • NOT A : A의 논리값을 뒤집는다. A가 참이면 NOT A는 거짓, A가 거짓이면 NOT A는 참이된다.

그리고 비교 연산자와 논리 연산자들을 결합하여 보통 우리는 “조건”을 만들어 낼 수 있다. 하나의 조건은 비교 연산을 통해 참/거짓으로 구분되는 식이며, 여러 개의 조건은 다시 논리 연산자를 통해 하나의 조건으로 합성될 수 있다.

위에서 언급한 가스 밸브의 경우, 조건식은 다음과 같이 만들어진다.

{밸브 압력} >= 10 and {밸브 압력} <= 20

밸브의 압력이 10~20 사이의 값일 때만 두 식을 모두 만족하게 되는 것이다.

자 이제 다시 다음 20개의 식의 결과가 True 인지 False 인지 각각 생각해보고 대화형 쉘에서 실행하여 그 결과를 확인해 보라.

  1. True and True
  2. False and True
  3. 1 == 1 and 2 == 1
  4. “test” == “test”
  5. 1 == 1 or 2 != 1
  6. True and 1 == 1
  7. False and 0 != 0
  8. True or 1 == 1
  9. “test” == “testing”
  10. 1 != 0 and 2 == 1
  11. “test” != “testing”
  12. “test” == 1
  13. not (True and False)
  14. not (1==1 and 0 != 1)
  15. not (10==1 or 1000 == 1000)
  16. not (1 != 10 or 3 == 4)
  17. not (“testing” == “testing” and “Zed” == “Cool Guy”)
  18. 1 == 1 and not (“testing” == 1 or 1 == 0)
  19. “chunky” == “bacon” and not (3 == 4 or 3 == 3)
  20. 3 == 3 and not (“testing” == “testing” or “Python” == “Fun”)

조건문

조건식에 대해서 기본적인 내용을 (사실 저게 전부임) 알아보았으니, 조건에 따른 분기를 어떻게 만드는지 살펴보도록 하겠다.

거의 모든 프로그래밍 언어는 조건문을 처리할 수 있는 문법을 가지고 있고, 대부분의 언어가 if….를 사용한다. 파이썬도 마찬가지로 if 문을 사용한다. 파이썬의 if 문의 사용 방법은 다음과 같다.

if 조건 :
    조건이 참일 때 실행할 문장 #그리고 앞에는 들여쓰기를 한다.

if 다음에 조건 식을 쓴 다음 콜론(:)으로 끝난다. 그런다음, 조건이 참일 때 동작할 문장들을 들여쓰기 해서 써 준다. if 구문의 완료 지점은 들여쓰기를 하지 않는 라인을 만날 때 까지이다.

위의 if 문을 사용하면 조건이 참일 때에만 특정한 명령들을 실행할 수 있게 된다. 만약, 조건이 참일 때는 A라는 동작을 하고 조건이 거짓일 때는 B라는 동작을 수행하도록 하려면 어떻게 할까? 이 때는 else 문을 쓴다.

if 조건:
    조건이 참일 때 실행할 명령 ...
else:
    조건이 거짓일 때 실행할 명령 ....

그리고 많은 경우에는 조건 1, 조건 2, 조건 3… 등 각각의 경우에 따라 다른 동작을 하고 싶을 때도 있을 것이다. (예를 들어 점수의 영역에 따라 수우미양가를 매길 때처럼) 이 때는 다음과 같이 elif를 사용하여 제2, 제3의 조건을 붙여 나갈 수 있다.

if 조건1:
    조건 1이 참일 때 실행할 명령
elif 조건2:
    조건 1이 거짓일 때, 다시 조건 2를 검사하여 조건2가 참일 때 실행
elif 조건3:
    다시 조건 3일 때 명령
...
else:
    위의 모든 조건이 거짓일 때 실행하는 명령

만약 어떤 점수에 따라 학점을 A,B,C,D,F 로 나눠주는 코드를 작성한다면 다음과 같이 될 것이다.

#ex12.py
#-*-coding:utf-8

def checkGrade(point):
  if point >= 90:
    return "A"
  elif point >= 80:
    return "B"
  elif point >=70:
    return "C"
  elif point >=50:
    return "D"
  else:
    return "F"

myPoint = 85

print "My Point is %d, so my grade is %s" %(myPoint, checkGrade(myPoint))

ex12.py는 지금까지 배운 내용들은 나름 잘 요약하고 있는 예제라 할 수 있겠다. 먼저 점수에 따라 학점을 판별하는 처리는 checkGrade()라는 함수를 만들어서 처리한다.

이 함수는 조건문을 계속 사용하여 90점 이상인 경우에는  A, 80점 이상인 경우에는 B…와 같은 식으로 등급을 문자열로 반환해준다. 함수가 return 문을 만나면 결과값을 반환하고 더 이상 실행되지 않는다.

그리고 myPoint에 점수를 대입한 뒤, 점수와 그 처리 결과를 하나의 문장에서 print 하도록 했다.

조건문은 단순히 조건식을 평가하여 참/거짓의 여부에 따라 갈림길의 방향을 선택하는 장치라고 볼 수 있으며, 다양한 상황을 유연하여 처리할 수 있게끔하는 기본적인 프로그램의 논리 처리이다. 프로그램은 이 조건문과 다음에 배울 반복문을 통해 사람이 일일이 간섭하지 않고 (내지는 사람에게 매번 귀찮게 물어보지 않고) 알아서 많은 처리를 빠르게 할 수 있게 된다.

다음 순서는 반복문에 대해 배워보도록 하겠다. 그리고 반복과 조건을 결합하여 할 수 있는 몇 가지 재밌는(?) 실험들을 조금 해 볼 것이다.