이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.

 

조건문 안에 조건문

메뉴판을 보니, 국밥에도 종류가 있었다. 얼큰한 국밥과 순한 국밥으로, 가격은 똑같이 6000원. 선택지 중 불호가 있지 않은 이상 고민이 생기기 마련. 얼큰한 국밥을 먹을지, 아니면 순한 국밥을 먹을지 고민하기 시작한다.

고민을 거듭한 끝에, 동전 던지기를 해서 앞면이 나오면 얼큰한 국밥을, 뒷면이 나오면 순한 국밥을 먹기로 결정했다.

하지만 위의 고민도 아무 때나 할 수 있는 것이 아니다. 국밥을 사 먹을 돈이 충분해야 한다. 돈도 없는데 저런 고민을 하는 건 김칫국부터 마시는 것과 다를 바가 없다. 따라서, 위의 고민을 하기 전에 돈이 충분하느냐 부터 생각해야 한다.

그러면 다음과 같이 표현할 수 있을 것이다.

“국밥을 사 먹을 돈이 충분할 때, 동전을 던져서 앞이 나오면 얼큰한 국밥을 사먹고, 그렇지 않다면 순한 국밥을 사 먹는다.”

먼저 확인해야 하는 조건은 국밥을 사 먹을 돈이 충분한가이다. 돈이 없으면 동전 던지기를 할 이유가 없다. 동전을 던져서 앞/뒷면을 골라봤자 라면을 먹거나 굶어야 하는 상황이기 때문이다.

돈 조건을 만족했다면 그 다음으로 확인해야 하는 조건은 동전이 앞면인가이다. 앞면이면 얼큰한 국밥을 먹는 코드를 실행하고, 그렇지 않으면(즉, 뒷면이면) 순한 국밥을 먹는 코드를 실행하면 된다. 그러면 이런 코드는 어떻게 작성하면 될까?

조건문 안에 또 다른 조건문을 넣을 수도 있다.

if condition1 :
    if condition2 :
        code1
    else :
        code2
else :
    code3

위와 같이 코드를 작성했을 경우, 가능한 경우의 수는 3가지가 된다.

  • condition1을 만족하지 않으면 code3을 실행한다.
  • condition1을 만족하고, condition2를 만족하면 code1을 실행한다.
  • condition1을 만족하고, condition2를 만족하지 않으면 code2를 실행한다.

그리고 또 한가지 주목해야 할 것이 있다. 들여쓰기을 잘 보라. if-else가 어떻게 엮이는지 확인하려면 들여쓰기를 확인해야 한다.

들여쓰기를 하지 않은 if-else가 하나로 묶이는 것을 볼 수 있다.
들여쓰기를 한 번한(= 공백문자 4개를 넣은) if-else가 하나로 묶이는 것을 볼 수 있다.

if condition1:
    if condition2:
        code1
else :
    code2
if condition1:
    if condition2:
        code1
    else :
        code2

들여쓰기를 다르게 했을 뿐인데도 두 코드의 동작의 차이가 발생한다.

첫 번째 코드는 condition1이 거짓이면 code2를 실행하고, condition1과 condition2가 참이면 code1을 실행하는데, 두 번째 코드는 condition1과 condition2가 참이여야 code1을 실행하고, condition1이 참이고 condition2가 거짓이어야 code2를 실행한다.
if-else(또는 elif)를 정확하게 묶어두기 위해서는 들여쓰기를 정확하게 해야 한다는 사실을 기억해두자.

그러면 이를 바탕으로 얼큰한 국밥과 순한 국밥을 고르는 과정을 추가해보자. 동전 앞면인지에 대한 여부는 isCoinHead라는 이름을 가진 변수에다 저장해두자. “동전이 앞면인가?” 라는 의미이므로 참/거짓을 다루는 데이터 형인 불 타입 데이터를 집어넣도록 하자.

gukbapChoice.py

money = 5000
gukbapPrice = 6000
ramenPrice = 3000
isCoinHead = True

if money >= gukbapPrice :
    if isCoinHead :
        print('얼큰한 국밥 냠냠')
    else :
        print('순한 국밥 냠냠')
elif money >= ramenPrice :
    print('라면 냠냠')
else :
    print('쩝...')

 

두 개 이상의 조건 테스트 하기

안타깝게도 국밥을 먹을 돈이 부족해서 동전던지기고 뭐고 라면이나 먹으려고 한다. 그런데 메뉴에 무언가 이상한게 쓰여있다.

“라면은 오후부터 주문하실 수 있습니다”

만약 지금이 오전이라면 돈이 있어도 라면을 주문할 수 없으므로 입맛이나 다셔야 한다는 것을 의미한다. 그러면 이를 코드로 표현하려면 어떻게 해야할까? 방금 배웠던 걸 쓰면 어떻게든 되지 않을까?

지금이 오후인지를 확인하는 변수를 isAfternoon이라고 하자. 이 변수에는 불 데이터인 True/False가 들어가있다고 가정하자.

elif money >= ramenPrice:
    if isAfternoon :
        print('라면 냠냠')

어떻게 보면 맞는 코드 같다. 하지만 여기서 조건이 더 붙어버리면 코드가 이렇게 되어 버릴 것이다.

elif condition1:
    if condition2:
        if condition3:
            if condition4:
                ...

계속해서 if문을 추가하다간 끝도 없어지는 것은 물론, 보기에도 굉장이 좋지 않다.

특히 국밥 코드에서는 의도치 않은 동작이 발생하게 된다. 아무것도 먹지 못하면 입맛을 다시는 코드인 print('쩝...')을 실행해야 하는데, 만약 돈은 충분한데 isAfternoon이 False라면, print('쩝...')은 실행하지 않고 넘어가게 될 것이다. else 안의 코드는 elif의 조건인 라면사먹을 돈이 있는가? 도 만족시키지 않아야 실행되기 때문이다.

그러면 여러 개의 조건을 한 번에 확인하는 방법은 무엇이 있을까?
이전에 배웠던 논리 연산자를 사용하면 된다.

라면을 먹을 수 있는 조건은 무엇인가?
라면을 먹을 수 있는 돈이 충분해야 한다.
오후가 되어야 한다.
위의 두 조건 중 하나라도 만족시키지 못한다면 라면을 먹을 수 없다.

논리연산자 and, or, not 중에서 두 조건이 만족되어야 참을 돌려주는 연산자는 무엇인가? and이다. 따라서 and 연산자를 사용한다면 하나의 조건으로 묶을 수 있다.

elif money >= ramenPrice and isAfternoon :
    print('라면 냠냠')

그러면 코드를 고쳐보자. 국밥 코드 최종본이다.

gukbapFinal.py

money = 5000
gukbapPrice = 6000
ramenPrice = 3000
isCoinHead = True
isAfternoon = True

if money >= gukbapPrice :
    if isCoinHead :
        print('얼큰한 국밥 냠냠')
    else :
        print('순한 국밥 냠냠')
elif money >= ramenPrice and isAfternoon:
    print('라면 냠냠')
else :
    print('쩝...')

변수의 값들을 수정해가면서 어떻게 출력이 되는지 확인해보자.

 

조건에 불 이외의 데이터가 들어온다면?

if의 조건은 불 데이터를 받는다고 했었다. 그러면 불 이외의 데이터를 집어넣으면 오류일까? 한 번 집어넣어보자.

if 1:
    print('hi')

이 코드를 실행하면 ‘hi’가 출력되는 것을 할 수 있다. 1은 참을 의미하는 것일까? 다른 것들을 넣으면 어떻게 될까?

if 7:
    print('hi1')
if 'hi':
    print('hi2')
if 0:
    print('hi3')

그리고 이 코드를 실행하면 ‘hi1’과 ‘hi2’까지만 출력되는 것을 확인할 수 있다. 정수형 데이터 7이나 문자열 데이터 'hi'를 넣으니까 출력이 되는데, 정수형 데이터 0을 집어넣으니 출력되지 않는다.

Python은 꼭 불 데이터가 아니더라도 참/거짓을 판단할 수도 있다. 만약 조건문에 다음 요소가 들어간다면, 거짓으로 간주한다.

타입
정수 0
부동소수점수 0.0
문자열 ’’
리스트 []
튜플 ()

위의 값들을 살펴보면, 0이거나 아무것도 없는 상태를 거짓으로 간주한다라는 사실을 알 수 있다.
위의 값들 말고는 모두 참으로 간주한다. 2도 참이고 4도 참이고 1.3도 참이고 ‘a’도 참이고 [1]도 참이고 (2,3,4)도 참이다.

아직 소개하지 않은 데이터 형은 생략하긴 했지만, 아무것도 없는 상태를 거짓으로 간주한다는 규칙은 똑같으므로 굳이 추가설명은 하지 않고 넘어가도록 한다.

 

Categories:

Updated:

Comments