본문 바로가기
파이썬(Python)/파이썬(Python) 문법

파이썬에서의 제어문 if문

by 공.대.남 2018. 8. 6.
반응형

if문은 왜 필요할까?

다음과 같은 상상을 해보자.

"돈이 있으면 택시를 타고, 돈이 없으면 걸어 간다."

우리 모두에게 언제든지 일어날 수 있는 상황 중 하나이다. 프로그래밍도 사람이 하는 것이므로 위의 문장처럼 주어진 조건을 판단한 후 그 상황에 맞게 처리해야 할 경우가 생긴다. 이렇듯 프로그래밍에서 조건을 판단하여 해당 조건에 맞는 상황을 수행하는 데 쓰이는 것이 바로 if 문이다.

위와 같은 상황을 파이썬에서는 다음과 같이 표현할 수 있다.

>>> money = 1
>>> if money:
...     print("택시를 타고 가라")
... else:
...     print("걸어 가라")
...
택시를 타고 가라

money에 입력된 1은 참이다. 따라서 if문 다음의 문장이 수행되어 '택시를 타고 가라'가 출력된다.

if문의 기본 구조

다음은 if와 else를 이용한 조건문의 기본 구조이다.

if 조건문:
    수행할 문장1
    수행할 문장2
    ...
else:
    수행할 문장A
    수행할 문장B
    ...

조건문을 테스트해서 참이면 if문 바로 다음의 문장(if 블록)들을 수행하고, 조건문이 거짓이면 else문 다음 의 문장(else 블록)들을 수행하게 된다. 그러므로 else문은 if문 없이 독립적으로 사용할 수 없다.

들여쓰기

if문을 만들 때는 if 조건문: 바로 아래 문장부터 if문에 속하는 모든 문장에 들여쓰기(indentation)를 해주어야 한다. 다음과 같이 조건문이 참일 경우 "수행할 문장1"을 들여쓰기 했고 "수행할 문장2"와 "수행할 문장3"도 들여쓰기를 해주었다. 다른 프로그래밍 언어를 사용했던 사람들은 파이썬에서 "수행할 문장"들을 들여쓰기 하는 것을 무시하는 경우가 많으니 더 주의해야 한다.

if 조건문:
    수행할 문장1
    수행할 문장2
    수행할 문장3

다음과 같이 작성하면 오류가 발생한다. "수행할 문장2"를 들여쓰기 하지 않았기 때문이다.

if 조건문:
    수행할 문장1
수행할 문장2
    수행할 문장3

다음 예제를 살펴보면 무슨 말인지 이해할 수 있을 것이다.

>>> money = 1
>>> if money:
...     print("택시를")
... print("타고")
  File "<stdin>", line 3
    print("타고")
        ^
SyntaxError: invalid syntax

다음과 같은 경우에도 에러가 발생한다. "수행할 문장3"을 들여쓰기 했지만 "수행할 문장1"이나 "수행할 문장2"와 들여 쓰기의 깊이가 다르다. 즉, 들여쓰기는 언제나 같은 깊이로 해야 한다.

if 조건문:
    수행할 문장1
    수행할 문장2
        수행할 문장3

다음의 예를 보면 들여쓰기 오류(IndentationError)가 발생한 것을 알 수 있다.

>>> money = 1
>>> if money:
...     print("택시를")
...     print("타고")
...         print("가자")
  File "<stdin>", line 4
    print("가자")
    ^
IndentationError: unexpected indent

※ 요즘 파이썬 커뮤니티에서는 들여쓰기를 할 때 공백(Spacebar) 4개를 사용하는 것을 권장한다.

[조건문 다음에 콜론(:)을 잊지 말자!]

if 조건문 뒤에는 반드시 콜론(:)이 붙는다. 어떤 특별한 의미가 있다기보다는 파이썬의 문법 구조이다. 왜 하필 콜론(:)인지 궁금하다면 파이썬을 만든 귀도에게 직접 물어보아야 할 것이다. 앞으로 배우게 될 while이나 for, def, class문에도 역시 문장의 끝에 콜론(:)이 항상 들어간다. 초보자들은 이 콜론(:)을 빠뜨리는 경우가 많으니 특히 주의하자.

파이썬이 다른 언어보다 보기 쉽고 소스 코드가 간결한 이유는 바로 콜론(:)을 사용하여 들여쓰기(indentation)를 하도록 만들었기 때문이다. 하지만 이는 숙련된 프로그래머들이 파이썬을 처음 접할 때 제일 혼란스러워하는 부분이기도 하다. 다른 언어에서는 if문을 { } 기호로 감싸지만 파이썬에서는 들여쓰기로 해결한다는 점을 기억하자.

조건문이란 무엇인가?

if 조건문에서 "조건문"이란 참과 거짓을 판단하는 문장을 말한다. 자료형의 참과 거짓에 대해서 몇 가지만 다시 살펴보면 다음과 같은 것들이 있다.

자료형거짓
숫자0이 아닌 숫자0
문자열"abc"""
리스트[1,2,3][]
튜플(1,2,3)()
딕셔너리{"a":"b"}{}

따라서 이전에 살펴보았던 택시 예제에서 조건문은 money가 된다.

>>> money = 1
>>> if money:

money는 1이기 때문에 참이 되어 if문 다음의 문장을 수행하게 된다.

비교연산자

조건이 참인지 거짓인지 판단할 때 자료형보다는 비교연산자(<>==!=>=<=)를 쓰는 경우가 훨씬 많다.

다음 표는 비교연산자를 잘 설명해 준다.

비교연산자설명
x < yx가 y보다 작다
x > yx가 y보다 크다
x == yx와 y가 같다
x != yx와 y가 같지 않다
x >= yx가 y보다 크거나 같다
x <= yx가 y보다 작거나 같다

이제 위의 연산자들을 어떻게 사용하는지 알아보자.

>>> x = 3
>>> y = 2
>>> x > y
True
>>>

x에 3을, y에 2를 대입한 다음에 x > y라는 조건문을 수행하면 True를 리턴한다. x > y라는 조건문이 참이기 때문이다.

>>> x < y
False

위의 조건문은 거짓이기 때문에 False를 리턴한다.

>>> x == y
False

x와 y는 같지 않다. 따라서 위의 조건문은 거짓이다.

>>> x != y
True

x와 y는 같지 않다. 따라서 위의 조건문은 참이다.

앞에서 살펴본 택시 예제를 다음처럼 바꾸려면 어떻게 해야 할까?

"만약 3000원 이상의 돈을 가지고 있으면 택시를 타고 그렇지 않으면 걸어 가라"

위의 상황은 다음처럼 프로그래밍할 수 있다.

>>> money = 2000
>>> if money >= 3000:
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
걸어가라
>>>

money >= 3000이라는 조건문이 거짓이 되기 때문에 else문 다음의 문장을 수행하게 된다.

and, or, not

조건을 판단하기 위해 사용하는 다른 연산자로는 and, or, not이 있다. 각각의 연산자는 다음처럼 동작한다.

연산자설명
x or yx와 y 둘중에 하나만 참이면 참이다
x and yx와 y 모두 참이어야 참이다
not xx가 거짓이면 참이다

다음의 예를 통해 or 연산자의 사용법을 알아보자.

"돈이 3000원 이상 있거나 카드가 있다면 택시를 타고 그렇지 않으면 걸어 가라"

>>> money = 2000
>>> card = 1
>>> if money >= 3000 or card:
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
택시를 타고 가라
>>>

money는 2000이지만 card가 1이기 때문에 money >= 3000 or card라는 조건문이 참이 된다. 따라서 if문 다음의 "택시를 타고 가라"라는 문장이 수행된다.

x in s

x not in s

더 나아가 파이썬은 다른 프로그래밍 언어에서 쉽게 볼 수 없는 재미있는 조건문들을 제공한다. 바로 다음과 같은 것들이다.

innot in
x in 리스트x not in 리스트
x in 튜플x not in 튜플
x in 문자열x not in 문자열

in이라는 영어 단어의 뜻이 "~안에"라는 것을 생각해 보면 다음 예들이 쉽게 이해될 것이다.

>>> 1 in [1, 2, 3]
True
>>> 1 not in [1, 2, 3]
False

다음은 튜플과 문자열에 적용한 예이다. 

>>> 'a' in ('a', 'b', 'c')
True
>>> 'j' not in 'python'
True

이번에는 우리가 계속 사용해 온 택시 예제에 in을 적용해 보자.

"만약 주머니에 돈이 있으면 택시를 타고, 없으면 걸어 가라"

>>> pocket = ['paper', 'cellphone', 'money']
>>> if 'money' in pocket:
...     print("택시를 타고 가라")
... else:
...     print("걸어가라")
...
택시를 타고 가라
>>>

['paper', 'cellphone', 'money']라는 리스트 안에 'money'가 있으므로 'money' in pocket은 참이 된다. 따라서 if문 다음의 문장이 수행된다.

[조건문에서 아무 일도 하지 않게 설정하고 싶다면?]

가끔 조건문의 참, 거짓에 따라 실행할 행동을 정의할 때, 아무런 일도 하지 않도록 설정하고 싶을 때가 있다. 다음의 예를 보자.

"주머니에 돈이 있으면 가만히 있고 주머니에 돈이 없으면 카드를 꺼내라"

이럴 때 사용하는 것이 바로 pass이다. 위의 예를 pass를 적용해서 구현해 보자.

>>> pocket = ['paper', 'money', 'cellphone']
>>> if 'money' in pocket:
...     pass 
... else:
...     print("카드를 꺼내라")
...

pocket이라는 리스트 안에 money라는 문자열이 있기 때문에 if문 다음 문장인 pass가 수행되고 아무런 결과값도 보여 주지 않는다.

다양한 조건을 판단하는 elif

if와 else만으로는 다양한 조건을 판단하기 어렵다. 다음과 같은 예를 보더라도 if와 else만으로는 조건을 판단하는 데 어려움을 겪게 된다.

"주머니에 돈이 있으면 택시를 타고, 주머니에 돈은 없지만 카드가 있으면 택시를 타고, 돈도 없고 카드도 없으면 걸어 가라"

위의 문장을 보면 조건을 판단하는 부분이 두 군데가 있다. 먼저 주머니에 돈이 있는지를 판단해야 하고 주머니에 돈이 없으면 다시 카드가 있는지 판단해야 한다.

if와 else만으로 위의 문장을 표현하려면 다음과 같이 할 수 있다.

>>> pocket = ['paper', 'handphone']
>>> card = 1
>>> if 'money' in pocket:
...     print("택시를 타고가라")
... else:
...     if card:
...         print("택시를 타고가라")
...     else:
...         print("걸어가라")
...
택시를 타고가라
>>>

언뜻 보기에도 이해하기 어렵고 산만한 느낌이 든다. 이런 복잡함을 해결하기 위해 파이썬에서는 다중 조건 판단을 가능하게 하는 elif라는 것을 사용한다.

위의 예를 elif를 사용하면 다음과 같이 바꿀 수 있다.

>>> pocket = ['paper', 'cellphone']
>>> card = 1
>>> if 'money' in pocket:
...      print("택시를 타고가라")
... elif card: 
...      print("택시를 타고가라")
... else:
...      print("걸어가라")
...
택시를 타고가라

즉, elif는 이전 조건문이 거짓일 때 수행된다. if, elif, else를 모두 사용할 때 기본 구조는 다음과 같다.

If <조건문>:
    <수행할 문장1> 
    <수행할 문장2>
    ...
elif <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    ...
elif <조건문>:
    <수행할 문장1>
    <수행할 문장2>
    ...
...
else:
   <수행할 문장1>
   <수행할 문장2>
   ... 

위에서 볼 수 있듯이 elif는 개수에 제한 없이 사용할 수 있다.

[if문을 한 줄로 작성하기]

앞의 pass를 사용한 예를 보면 if문 다음에 수행할 문장이 한 줄이고, else문 다음에 수행할 문장도 한 줄밖에 되지 않는다.

>>> if 'money' in pocket:
...     pass 
... else:
...     print("카드를 꺼내라")
...

이렇게 수행할 문장이 한 줄일 때 조금 더 간략하게 코드를 작성하는 방법이 있다.

>>> pocket = ['paper', 'money', 'cellphone']
>>> if 'money' in pocket: pass
... else: print("카드를 꺼내라")
...

if문 다음의 수행할 문장을 콜론(:) 뒤에 바로 적어 주었다. else문 역시 마찬가지이다. 때때로 이렇게 작성하 는 것이 보기 편할 수 있다.

조건부 표현식

다음과 같은 코드를 보자.

if score >= 60:
    message = "success"
else:
    message = "failure"

위 코드는 score가 60 이상일 경우 message에 "success"를 아닐 경우에는 "failure"를 대입하는 코드이다.

파이썬의 조건부 표현식(conditional expression)을 이용하면 위 코드를 다음과 같이 간단히 표현할 수 있다.

message = "success" if score >= 60 else "failure"

조건부 표현식은 다음과 같이 정의된다.

조건문이_참인_경우 if 조건문 else 조건문이_거짓인_경우

조건부 표현식은 가독성에 유리하고 한 라인으로 작성할 수 있어 활용성이 좋다.

728x90
반응형

'파이썬(Python) > 파이썬(Python) 문법' 카테고리의 다른 글

파이썬에서의 제어문 for문  (0) 2018.08.06
파이썬에서의 제어문 while문  (0) 2018.08.06
파이썬 변수저장  (0) 2018.07.11
파이썬 불(bool)  (0) 2018.07.11
파이썬 집합  (0) 2018.07.11

댓글