파이썬 기초 강좌 #13 if 조건문 (if statement)

11 분 소요

이번 강좌에서는 파이썬의 제어문 중에서 가장 기본이 되는 if 조건문에 대해서 공부해보겠습니다.

If 조건문의 기본 구조는 if 블록, elif 블록, else 블록으로 이루어져 있습니다. 각각의 블록은 테스트 익스프레션 부분과 테스트를 통과하면 실행이 되는 body 부분으로 이루어집니다. 테스트의 결과 값이 True일 경우 바디 부분의 코드가 실행되고 False일 경우에 다음 elif 블록의 테스트를 실행하고, 모든 테스트의 결과가 False이면 else 블록 바디의 코드가 실행됩니다.

if 제어문의 플로우차트
if 제어문의 플로우차트

if 조건문을 실제 코드상에서 보통 아래와 같은 구조를 가집니다.

if a == b: print('첫번째 조건이 참 입니다') elif a == c: print('두번째 조건이 참 입니다') else: print('위의 어떤 조건도 참이 아닙니다') 더 많은 조건을 추가하고 싶으시면 아래와 같이 elif 블록을 추가하시면 됩니다.

if a == b:
    print('첫 번째 조건이 참 입니다')
elif a == c:
    print('두 번째 조건이 참 입니다')
elif a == d:
    print('세 번째 조건이 참 입니다')
elif a == e:
    print('네 번째 조건이 참 입니다')
elif a == f:
    print('다섯 번째 조건이 참 입니다')
else:
    print('어떤 조건도 참이 아닙니다')

If 조건문을 사용하여 a와 b 변수에 저장된 두 숫자를 비교해보겠습니다.

>>> a = 1
>>> b = 2

두 숫자를 비교했을 때 경우의 수는 3가지가 나옵니다.

a > b
a == b
a < b

다음과 같은 if 조건문으로 모든 경우의 수를 처리할 수 있습니다.

>>> if a > b:
...     print('a > b')
... elif a == b:
...     print('a == b')
... else:
...     print('a < b')
...
a < b

Else 블록이 실행되어 a 가 b 보다 작다는 정상 결과가 나왔습니다.

가끔 if 문을 잘 못 사용하시는 분들을 보게되는데요, 다음과 같은 사용 방법은 잘 못된 사용방법입니다.

>>> if a > b:
...     print('a > b')
...
>>> if a == b:
...     print('a == b')
...
>>> if a < b:
...     print('a < b')
...
a < b

결과는 위의 코드를 실행했을 때와 같은 값을 출력하였지만 이 코드에는 문제가 있습니다. Elif 문을 사용하면 하나의 조건을 만족 시키면 그 아래의 테스트는 실행하지 않습니다. 하지만 위의 안좋은 예처럼 if문을 사용하면 원하는 답을 찾아도, 그 아래의 불필요한 테스트까지 실행하게 됩니다. 이런 잘 못된 사용 방법은 경우에 따라서는 심각한 리소스 낭비와 프로그램의 퍼포먼스 저하로 이어집니다.

다음은 경우의 수가 3개보다 많을 경우 if 조건문을 어떻게 사용하는지 알아보도록 하겠습니다. 만약 5가지 과일의 이름 중에서 사용자에게 직접 입력을 받아 과일 이름을 맞추는 프로그램을 만든다고 가정해보죠. 이때 경우의 수는 과일의 수 5개와 틀린 과일 이름을 입력했을 때의 경우 1개를 합쳐서 총 여섯개의 경우의 수가 나옵니다. 이럴 경우에는 여러개의 elif 문을 사용해야 합니다.

>>> answer = '딸기'
>>>
>>> if answer == '바나나':
...     print('바나나는 정답입니다.')
... elif answer == '딸기':
...     print('딸기는 정답입니다.')
... elif answer == '사과':
...     print('사과는 정답입니다.')
... elif answer == '오렌지':
...     print('오렌지는 정답입니다.')
... elif answer == '수박':
...     print('수박은 정답입니다.')
... else:
...     print('{}는 정답이 아닙니다'.format(answer))
...
딸기는 정답입니다.

다음과 같이 과일 이름을 리스트에 저장을 하고, 과일 리스트의 아이템을 확인을 하는 구문으로 더 간략한 코드를 만들 수 있습니다.

>>> fruits = ['바나나', '딸기', '사과', '오렌지', '수박']
>>>
>>> if answer in fruits:
...     print('{}는 정답입니다'.format(answer))
... else:
...     print('{}는 정답이 아닙니다'.format(answer))
...
딸기는 정답입니다

If 조건문을 사용하다 보면 두 가지 이상의 조건을 테스트해야 할 경우가 있습니다. 이런 경우에는 중첩 if 문을 사용하시면 됩니다.

문제: 아래의 조건을 둘 다 만족하는 숫자를 찾으세요.

조건 1: x > 0 조건 2: x < 3 다는 작은 양수를 찾는 문제가 있다면, 조건1인 양수라는 조건과 조건 2인 3 보다 작은 숫자라는 조건을 모두 만족시키는 답을 찾아야합니다. 이 문제를 해결하기 위해서는 다음과 같은 중첩 if문을 만드시면 됩니다.

answer = int(input('숫자를 입력하세요: '))
 
if answer > 0:
    if answer < 3:
        print('{}는 정답입니다'.format(answer))
    else:
        print('{}는 정답이 아닙니다'.format(answer))
else:
    print('{}는 정답이 아닙니다'.format(answer))

중첩된 조건문은 다음과 같이 and 키워드를 사용하여 하나의 복합 조건문으로 만들수도 있습니다.

answer = int(input('숫자를 입력하세요: '))
 
if answer > 0 and answer < 3:
    print('{}는 정답입니다'.format(answer))
else:
    print('{}는 정답이 아닙니다'.format(answer))

이번에는 or 키워드를 사용하여 두개의 if문을 하나로 만드는 방법을 보여드리겠습니다.

문제: 아래의 조건 중, 하나 이상의 조건을 만족하는 숫자를 찾으세요.

조건 1: x < 3 조건 2: x > 6 이번 문제의 조건은 3보다 작거나 6보다 큰 수를 찾아야 합니다. 위의 예제처럼 중첩 if 문을 사용하시면 됩니다.

answer = int(input('숫자를 입력하세요: '))
 
if answer < 3:
    print('{}는 정답입니다'.format(answer))
else:
    if answer > 6:
        print('{}는 정답입니다'.format(answer))
    else:
        print('{}는 정답이 아닙니다'.format(answer))

또 다른 방법은 새로운 변수를 정의하고 둘 조건 중 하나를 만족시키면 새로 정의한 변수의 값을 True로 변경하는 방법입니다.

answer = int(input('숫자를 입력하세요: '))
flag = None
 
if answer < 3:
    flag = True
 
if answer > 6:
    flag = True
 
if flag:
    print('{}는 정답입니다'.format(answer))
else:
    print('{}는 정답이 아닙니다'.format(answer))

위의 코드는 or 키워드를 사용하여 다음과 같은 간단한 코드로 만들 수 있습니다.

answer = int(input('숫자를 입력하세요: '))
 
if answer < 3 or answer > 6:
    print('{}는 정답입니다'.format(answer))
else:
    print('{}는 정답이 아닙니다'.format(answer))

💡 오늘의 팁

중첩 if문이 너무 많아지면 코드가 복잡해져 가독성이 떨어지므로 하나의 복합 조건문으로 줄이는 것이 좋습니다.

if 조건문의 테스트는 모든 조건을 boolean 오브젝트로 변환하여 True인지 False인지 판단을 합니다. 파이썬에서는 boolean 오브젝트로 변환했을 때 False 값이 되는 오브젝트가 몇가지 있습니다.

아래의 오브젝트는 If 문에서 boolean 오브젝트로 변환하였을 때 False로 취급됩니다.

  • False
  • None
  • Integer 0
  • 빈 string
  • 빈 list
  • 빈 tuple
  • 빈 dictionary 위의 오브젝트를 bool 함수를 사용하여 boolean 오브젝트로 변환해보겠습니다.
>>> bool(False)
False
>>> bool(None)
False
>>> bool(0)
False
>>> bool('')
False
>>> bool([])
False
>>> bool(())
False
>>> bool({})
False

그럼 실제로 if 문안에서 이 값이 거짓을 뜻하는지 확인해 보겠습니다.

>>> if condition == True:
...     print('참 입니다')
... else:
...     print('거짓 입니다')
...
거짓 입니다

알기 쉽게 condition이 True와 같다면 이라는 조건을 사용했지만 이 부분은 아래와 같이 생략할 수 있습니다.

>>> condition = {}
>>>
>>> if condition:  # True를 생략 가능
...     print('참 입니다')
... else:
...     print('거짓 입니다')
...
거짓 입니다

이것을 활용하여 어떤 값이 0이 아닐 경우의 조건은 다음과 같은 조건문으로 치환이 가능합니다.

x = 1
 
if x != 0:
    print('x는 0이 아닙니다')
 
if x:
    print('x는 0이 아닙니다')

아래와 같이 not 오퍼레이터를 사용하여 True 값을 False로 바꿀 수도 있습니다.

x = 0
 
if x == 0:
    print('x는 0입니다')
 
if not x:
    print('x는 0입니다')

또한 리스트의 길이가 0보다 클때와 같은 조건은 리스트가 아이템을 하나도 가지고 있지 않으면 False 이고, 아이템을 하나라도 가지고 있으면 True이니, 다음처럼 조금 더 간단한 코드로 치환 할 수 있습니다.

my_list = [1, 2, 3]
 
if len(my_list) > 0:
    print('my_list 는 하나 이상의 아이템을 가지고 있습니다')
 
if my_list:
    print('my_list 는 하나 이상의 아이템을 가지고 있습니다')

if 조건문의 사용은 어렵지는 않지만, 잘 못 사용하면 프로그램 전체 구조를 망치고 프로그램의 퍼포먼스를 저하할 수도 있으니 잘 익혀두시기 바랍니다.

다음 강좌에서는 while 반복문에 대해서 공부해보도록 하겠습니다.