12.2 if 조건문과 들여쓰기

지금까지 들여쓰기는 크게 신경을 쓰지 않았죠? 파이썬은 들여쓰기도 문법으로 정해져 있으며 if 조건문도 들여쓰기가 중요합니다.

다음 내용을 IDLE의 소스 코드 편집 창에 입력한 뒤 실행해보세요.

if_indent_error.py

x = 10
 
if x == 10:
     print('x에 들어있는 숫자는')
         print('10입니다.')     # unexpected indent 에러 발생
#↑   ↖ 들여쓰기 8칸
# 들여쓰기 4칸

실행을 해보면 두 번째 print부분에서 unexpected indent 에러가 발생합니다.

이제 올바른 코드로 고쳐 볼까요? 다음과 같이 두 번째 print도 들여쓰기 4칸으로 만들어줍니다.

if_indent.py

x = 10
 
if x == 10:
     print('x에 들어있는 숫자는')
     print('10입니다.')
#↑ 들여쓰기 4칸

실행 결과

x에 들어있는 숫자는
10입니다.

이제 실행이 잘 됩니다. 즉, if 다음에 오는 코드들은 반드시 들여쓰기 깊이가 같아야 합니다.

만약 첫 번째 print만 들여쓰기를 하고, 두 번째 print는 들여쓰기를 하지 않으면 의도치 않은 동작이 됩니다.

if_wrong_indent_true.py

x = 10
 
if x == 10:
     print('x에 들어있는 숫자는' # ← 들여쓰기 4칸
print ('10입니다.')
#↑ 들여쓰기 없음

실행 결과

x에 들어있는 숫자는
10입니다.

print 두 개가 모두 실행되었습니다. 하지만 다음과 같이 x가 5라면 어떻게 될까요?

if_wrong_indent_false.py

x = 5          # x에 5를 할당
 
if x == 10:    # x가 5라서 조건식이 만족하지 않음
     print('x에 들어있는 숫자는') # ← 들여쓰기 4칸
print ('10입니다.')
#↑ 들여쓰기가 없어서 if와는 상관없는 코드가 됨

실행 결과

10입니다.

x가 5라서 if의 조건식이 만족하지 않으므로 다음에 오는 print('x에 들어있는 숫자는')는 실행이 되지 않습니다. 그런데 print('10입니다.')는 실행이 되었죠? 왜냐하면 들여쓰기가 없어서 if와는 상관없는 코드가 되었기 때문입니다.

즉, if 다음 줄에 들여쓰기가 된 코드는 if의 영향을 받아서 조건식에 따라 실행이 결정되지만 들여쓰기가 되지 않은 코드는 항상 실행됩니다. 들여쓰기 하나 때문에 의도치 않은 동작이 되었는데(x가 5일때는 '10입니다.'가 출력되지 않아야 하는데 출력됨) 이런 코드는 일단 실행이 되기 때문에 초보자들은 잘못된 부분을 찾기가 쉽지 않습니다. 자신이 의도한 부분과 코드의 들여쓰기가 일치하는지 항상 확인해주세요.

다음과 같이 print를 한 줄 띄워보면 왜 그런지 알 수 있습니다.

x = 5
 
if x == 10:    # x가 5라서 조건식이 만족하지 않음
    print('x에 들어있는 숫자는')
 
print('10입니다.')    # 위의 if와는 상관없는 코드

파이썬에서 :가 나오면 그 다음 줄부터는 무조건 들여쓰기를 한다는 점만 기억하면 됩니다.

참고 | if와 들여쓰기 칸 수

if에서 처음부터 들여쓰기를 4칸으로 했다면 계속 4칸으로 유지하고, 2칸으로 했다면 계속 2칸으로 유지합니다. 어떨 땐 4칸 어떨 땐 2칸 이렇게는 안 됩니다.

x = 10
 
if x == 10:
   print('x에 들어있는 숫자는')
   print('10입니다.')
#↖ 들여쓰기 2칸

들여쓰기를 공백 4칸에서 2칸으로 수정해서 실행해보면 에러 없이 잘 실행됩니다. 들여쓰기 칸 수 자체는 문법으로 정해져 있지 않으며 오직 들여쓰기 깊이로만 판단합니다. 하지만 파이썬 코딩 스타일 가이드(PEP 8)에서는 공백 4칸으로 규정하고 있으므로 4칸을 권장합니다.