파이썬 if 문

이번 챕터의 주제는 파이썬 if문 입니다. if문은 특정 조건의 참과 거짓 여부에 따라 코드를 다르게 실행하기 위해서 사용합니다. 또한 if 문은 개요에서 언급한 복합문(Compound Statements)으로서 if문 내부에 다른 문을 가지고 있다는 특징이 있습니다.

파이썬 if문의 형태

다른 절차적 언어와 비슷한 형태를 띄고 있습니다. 먼저 if 다음에 조건(test condition)을 수행할 식이 오고, 이 조건이 “참”일 경우 수행할 1개 이상의 문(statements)이 옵니다. 만약 처음 if 에서는 거짓이 되지만 다른 조건을 충족할 때 수행해야 할 경우는 elif 를 사용합니다. 다른 언어에서는 주로 else if 로 사용되죠.  형태는 아래와 같습니다.

if test_condition:
    statements
elif test_condition2:
    statements
else:
    statements

if 는 한 번 밖에 올 수 없지만, elif 는 여러 번 사용 가능합니다. if 나 elif 의 조건을 만족하지 않을 경우 else 절이 실행되는데, else 는 한 번 밖에 사용할 수 없습니다. 여기서 else 는 생략해도 무방하지만 모든 절차적 언어에서 그렇듯이 if문은 꼭 else 를 사용하는 것이 좋습니다. if 혹은 elif의 조건(test condition)이 언제나 참일 수 없기 때문입니다. 따라서 예외상황에 대한 처리 측면에서라도 반드시 else 절을 같이 사용하시기 바랍니다.

가장 기본적인 파이썬 if문 사용법

조건이 하나 있을 경우, 아래와 같이 사용합니다.

a = 10
b = 5
if a > b:
    print "a is bigger than b"
else:
    print "a is not bigger than b"

위 코드를 ex_if.py 로 저장하고 명령창(윈도우에서는 cmd, 리눅스에서는 쉘)에서 아래와 같이 실행합니다.

$ python ex_if.py
a is bigger than b

결과는 예상대로 a가 b보다 크기 때문에 “a is bigger than b” 라고 출력됩니다. 여기서 if 다음의 조건식은 누구나 할 수 있는 비교 연산자 “>” 를 사용했지만, 파이썬에서 조건절로 사용할 수 있는 연산자는 “>” 이외에도 많습니다. 조건절로 사용할 수 있는 식은 아래 따로 언급하도록 하겠습니다.

여러 조건식을 사용할때 – elif

위의 예제에서 한 가지 비교하지 않은 조건이 있는데, 이는 바로 a와 b가 같을 때입니다. 만약 if <조건> 문이 거짓이면 elif 절을 사용해서 다시 한 번 다른 조건으로 비교할 수 있습니다.

a = 5
b = 5
if a > b:
    print "a is bigger than b"
elif a == b: # == 는 동등 비교 연산자
    print "a is equal to b"
else:
    print "a is smaller than b"

이를 ex_if1.py 로 저장하고 실행해보면 아래와 같이 나옵니다.

$ python ex_if1.py
a is equal to b

조건식

if 혹은 elif 에 뒤이어 오는 조건식에 대해서 말해볼까 합니다. 기존 C/C++, Java 및 Javascript 를 다뤄보신 분들이라면 익숙하시리라 생각됩니다. 조건식은 연산 결과가 True 혹은 False 가 나오는 식입니다.

비교연산

비교연산자 >, <, >=, <=, ==, != 와 2개의 피연산자를 사용해서 두 피연산자의 값을 비교하는 식입니다. 피연산자 a와 b 를 예로 들겠습니다.

  • a > b : a가 b 보다 크다.
  • a < b : b 가 a 보다 크다.
  • a >= b : a가 b 보다 크거나 같다.
  • a <= b : b가 a 보다 크거나 같다.
  • a == b : a와 b 가 같다. (주의! = 가 2개 입니다. )
  • a != b : a와 b 가 같지 않다.

위 조건식을 실제 파이썬에서 실행해보겠습니다.

>>> a = 5
>>> b = 3
>>> a > b # 5 > 3 은 참이니 True
True
>>> a < b # 5 < 3 은 거짓이니 False
False
>>> a >= b # 5>= 3 은 참이니 True
True
>>> a <= b # 5 <= 3 은 거짓이니 False
False
>>> a == b # 5와 3이 같지 않으니 False
False
>>> a != b # "5와 3이 같지 않음" 은 참이니 True
True

Truth Value Testing

파이썬은 모든 것이 객체로 이루어져 있고, 모든 객체에 대해서 참/거짓 값을 시험 해 볼 수 있습니다. 아래 값을 조건식에 넣으면 파이썬에서는 이를 False 로 간주합니다.

  • None
  • False
  • 0의 값을 가지는 어떠한 정수형. (0, 0.0, 0j)
  • 빈 시퀀스 자료형 (”, (), [])
  • 빈 딕셔너리

실제 코드로 확인해 보겠습니다.

>>> bool(None)
False
>>> bool(0)
False
>>> bool(1) # 0이 아니기 때문에 True
True
>>> bool('')
False
>>> bool('light saber')
True

이외의 값은 모두 True 로 취급합니다.

Boolean 연산 – and, or, not

and, or, not 은 Boolean 연산자인데, 두 피연산자 간의 논리 and, or, not 연산을 담당합니다.  먼저 and 연산부터 살펴보겠습니다.

x and y

and 연산은 and 연산자와 두 피연산자로 이루어진 식인데, 두 피연산자가 모두 참일 경우 참입니다. 다만, 이 연산에서 주의할 점은 short-circuit 입니다. 한국어로 뭐라 번역을 해야할지 모르겠지만 전자 용어로는 단락이죠. and 의 첫 번째 피연산자 x가 거짓이면 뒤의 y는 조건을 판단하지 않고 False 를 리턴합니다. and 는 두 피연산자가 모두 참이어야 True를 리턴하기 때문에 이미 거짓이 나오면 그 뒤의 피연산자를 판단하지 않습니다. 이를 short-circuit 이라 합니다.

x or y

or 연산자는 두 피연산자 중 하나라도 참이면 참입니다. 이 연산 역시 short-circuit 이 있습니다. or의 첫 번째 피연산자 x 가 참이면 뒤의 y 는 판단하지 않고 True를 리턴합니다.

not x

not 연산자는 하나의 피연산자를 사용하며, 피연산자가 참일 경우 거짓을, 거짓일 경우 참을 리턴합니다. 해당 연산자는 다른 연산자보다 우선 순위가 낮아서 not a == b는 not (a == b)로 실행됩니다. 따라서 a == not b 같은 연산은 문법 오류를 발생하니 주의하여 사용하시기 바랍니다.

short-circuit 의 주의사항

예를 들어 아래의 문이 있다고 가정합니다.

if foo() and bar():
....

만약 foo()가 거짓을 리턴하면 bar()는 실행 자체가 안되기 때문에 프로그래머가 처음 생각했던 결과와 다를 수 있습니다. Boolean 연산 시에는 이 점 주의하시기 바랍니다.

if 중첩

파이썬에서는 if문 내부에 또 if 문을 사용할 수 있습니다. 아래와 같은 조건이 있다고 하겠습니다.

만약 계산 결과가 100 미만이면 “less than 100” 을 콘솔에 출력하고 끝내라. 계산 결과가 100 이상인데 홀수라면 “odd”를, 짝수면 “even”을 출력하라.

이를 코드로 옮기면

x = get_result()  # 임의의 값을 가져온다고 가정
if x < 100:
print "less than 100"
else:
# %는 2의 나머지 연산입니다. %2 의 결과가 0 이면 짝수죠. 연산에 대해서는 추후 언급하겠습니다.
if (x % 2) == 0:
print "even"
else:
print "odd"

이론상으로는 제한없이 if 내부에 또 다른 if문을 사용할 수 있습니다만, 보통 3번 이상 중첩되지 않도록 코드를 작성하시기 바랍니다. 중첩이 여러 번 되면 가독성도 떨어지고 유지보수가 힘듭니다.

참고자료

  1. Python 공식문서

Leave a Reply

Leave a Reply

Your email address will not be published. Required fields are marked *