Chapter03 조건문 (3-2 if~else와 elif 구문)

lasso·2021년 5월 10일
0

3-2 if~else와 elif 구문

else 구문 elif 구문 False 값 pass

if 조건문은 뒤에 else 구문을 붙여서 사용할 수 있습니다. 이처럼 if 구문 뒤에 else 구문을 붙인 것을 'if else 조건문'이라고 부르기도 합니다. 그럼 어떠한 경우에 사용하는 조건문인지 알아보도록 하겠습니다.

시작하기 전에

세상에는 두 가지로만 구분되는 것들이 많습니다. 예를 들어 오전이 아니면 반드시 오후입니다. 프로그래밍에서도 이런 상황이 많습니다. 다음 코드의 조건문을 살펴보겠습니다.

# 입력을 받습니다
number = input("정수 입력 > ")
number = int(number)

# 짝수 조건
if number % 2 == 0
    print("짝수입니다")
    
# 홀수 조건
if number % 2 == 1
    print("홀수입니다")

3-1에서 했던 나머지 연산자를 활용해 홀수와 짝수를 구분하는 예제인데, if 조건문을 두 번이나 사용해서 조건문을 비교했습니다. 하지만 홀수가 아니면 반드시 짝수이고, 홀수라면 반드시 짝수가 아닙니다. 이런 정반대 되는 상황에서 두 번이나 조건을 비교해야 하는 것은 낭비라고 할 수 있습니다.


else 조건문의 활용

그래서 프로그래밍 언어는 else 구문이라는 기능을 제공합니다. else 구문은 if 조건문 뒤에 사용하며, if 조건문의 조건이 거짓일 때 실행되는 부분입니다.

if 조건 : 
☐☐☐☐ 조건이 참일 때 실행할 문장
else :
☐☐☐☐ 조건이 거짓일 때 실행할 문장

앞 절의 condition03.py 예제에 else 구문을 넣어 홀수와 짝수를 비교하면 다음과 같이 코드를 구성할 수 있습니다.

👉 if 조건문에 else 구문을 추가해서 홀짝 구분

# 입력을 받습니다
number = input("정수 입력 > ")
number = int(number)

# 조건문을 사용합니다.
if number % 2 == 0 :    # 조건이 참일 때, 즉 짝수 조건
    print("짝수입니다")
else :                  # 조건이 거짓일 때, 즉 홀수 조건
    print("홀수입니다")
    
# 실행 결과
정수 입력 > 13
홀수입니다

조건문이 오로지 두 가지로만 구분될 때 if else 구문을 사용하면 조건 비교를 한 번만 하므로 이전의 코드보다 두 배 효율적이라고 할 수 있습니다. 사실 간단한 프로그램에서는 이런 차이가 크지 않지만, 조건 비교를 100만 번, 100억 번 정도 한다고 가정하면 시간 차이가 크게 발생합니다.


elif 구문

그런데 딱 두가지만으로 구분되지 않는 것도 있습니다. 예를 들어 계절만 해도 네 개가 있으며, 요일만 해도 일곱 개가 있습니다. 따라서 세 개 이상의 조건을 연결해서 사용하는 방법이 필요합니다. 그것이 바로 elif 구문입니다.

elif 구문은 if 조건문과 else 구문 사이에 입력하며, 다음과 같은 형태로 사용합니다.

if 조건A :
☐☐☐☐ 조건A가 참일 때 실행할 문장
elif 조건B :
☐☐☐☐ 조건B가 참일 때 실행할 문장
elif 조건C가 참일 때 실행할 문장
...
else :
☐☐☐☐ 모든 조건이 거짓일 때 문장

그럼 현재 월을 구하고 이를 기반으로 계절을 구하는 코드를 작성해 보겠습니다.

👉 계절 구하기

소스코드 condition05.py

# 날짜/시간 관련된 기능을 가져옵니다.
import datetime

# 현재 날짜/시간을 구하고
# 쉽게 사용할 수 있게 월을 변수에 저장합니다.
now = datetime.datetime.now()
month = now.month

# 조건문으로 계절을 확인합니다.
if 3 <= month <= 5 :
    print("봄입니다")
elif 6 <= month <= 8 :
    print("여름입니다")
elif 9 <= month <= 11 :
    print("가을입니다")
else :
    print("겨울입니다")
    
# 실행 결과
봄입니다

코드를 작성한 시기가 봄이므로 시기는 봄으로 출력됩니다.
만약 7월이었다면 10행에서 거짓으로 판정되어 12행으로 이동해 조건문을 비교한 후 "여름입니다"를 출력하고 코드 실행을 끝냈겠죠? 겨울은 1, 2월로 월이 떨어져 있습니다. 따라서 마지막으로 몰아 else 구문에 넣어 코드를 간단하게 만들었습니다.


if 조건문 효율적으로 사용하기

지금까지 조건문에 대한 아주 기본적인 문법을 살펴보았습니다. 이제부터는 조건문의 활용과 관련된 내용을 더 살펴보겠습니다.

인터넷을 돌아다니다 발견한 짤입니다. 학점과 학점에 대한 학생 평가인데, 재미 삼아 이를 조건문으로 구현해서 출력해 보겠습니다. 예제로 구현할 조건은 다음과 같습니다.

조건설명(학생 평가)
4.5
4.2~4.5교수님의 사랑
3.5~4.2현 체제의 수호자
2.8~3.5일반인
2.3~2.8일탈을 꿈꾸는 소시민
1.75~2.3오락 문화의 선구자
1.0~1.75불가촉천민
0.5~1.0자벌레
0~0.5플랑크톤
0시대를 앞서가는 혁명의 씨앗

일단 소수점을 사용하므로 입력을 숫자로 변환할 때 float() 함수를 사용해야 합니다. 이를 주의해서 코드를 작성하면 다음과 같이 구현할 수 있습니다.

👉 조건문 구현하기(1)

소스코드 condition06.py

# 변수를 선언합니다.
score = float(input("학점 입력 > "))

# 조건문을 적용합니다.
if score == 4.5 :
    print("신")
elif 4.2 <= score < 4.5 :
    print("교수님의 사랑")
elif 3.5 <= score < 4.2 :
    print("현 체제의 수호자")
elif 2.8 <= score < 3.5 :
    print("일반인")
elif 2.3 <= score < 2.8 :
    print("일탈을 꿈꾸는 소시민")
elif 1.75 <= score < 2.3 :
    print("오락 문화의 선구자")
elif 1.0 <= score < 1.75 : 
    print("불가촉천민")
elif 0.5 <= score < 1.0 :
    print("자벌레")
elif 0 < score < 0.5 :
    print("플랑크톤")
else :
    print("시대를 앞서가는 혁명의 씨앗")

# 실행 결과
학점 입력 > 3.53
현 체제의 수호자

그런데 이는 초보자일 때 가장 많이 하는 형태의 비효율적인 조건문이라고 할 수 있습니다. if 조건문은 위에서 아래로 흐르며, else 구문과 elif 구문은 이전의 조건이 맞지 않을 때 넘어오는 부분입니다. 따라서 위에서 이미 제외된 조건을 한번 더 검사할 필요는 없습니다.
앞의 코드를 좀 더 효율적으로 구성하면 다음과 같이 구현할 수 있습니다.

👉 조건문 구현하기(2)

소스코드 condition07.py

# 변수를 선언합니다.
score = float(input("학점 입력 > "))

# 조건문을 적용합니다.
if score == 4.5 :
    print("신")
elif 4.2 <= score :
    print("교수님의 사랑")
elif 3.5 <= score :
    print("현 체제의 수호자")
elif 2.8 <= score :
    print("일반인")
elif 2.3 <= score :
    print("일탈을 꿈꾸는 소시민")
elif 1.75 <= score :
    print("오락 문화의 선구자")
elif 1.0 <= score : 
    print("불가촉천민")
elif 0.5 <= score :
    print("자벌레")
elif 0 < score :
    print("플랑크톤")
else :
    print("시대를 앞서가는 혁명의 씨앗")
    
# 실행 결과
학점 입력 > 3.4
일반인

condition07.py는 condition06.py의 조건문에서 이미 한번 비교한 것을 제외하고 작성한 코드입니다. 즉 5행에서 score가 4.5인지 비교해서 거짓임을 확인하고 7행을 실행하고 있으므로 하위 값만 검사하고 상위 값은 검사를 생략한 것입니다.

elif 4.2 <= score < 4.5 :
elif 4.2 <= score :

이렇게 조건식을 바꾸면 이전 코드보다 조건 비교를 반밖에 하지 않고, 코드의 가독성도 좀 더 향상되기 때문에 프로그램의 효율이 훨씬 높아집니다. 그러므로 elif 구문을 사용할 때는 앞 단계 조건문에서 비교했던 것을 다음 단계에서 한번 더 하고 있지는 않는지 꼭 확인하기 바랍니다.


False로 변환되는 값

if 조건문의 매개변수에 불이 아닌 다른 값이 올 때는 자동으로 이를 불로 변환해서 처리합니다. 따라서 어떤 값이 True로 변환되고, 어떤 값이 False로 변환되는지 알고 있어야 코드를 이해할 수 있습니다. False로 변환되는 값은 None, 숫자 0과 0.0, 빈 컨테이너(빈 문자열"", 빈 바이트열b"", 빈 리스트[], 빈 튜플(), 빈 딕셔너리{} 등)입니다. 이 외에는 모두 True로 변환되므로 위에 언급한 세 가지만 기억하세요.

다음 예제를 통해 숫자 0과 빈 문자열을 if else 조건문의 매개변수에 넣으면 무엇이 실행되는지 살펴보겠습니다.

👉 False로 변환되는 값

소스코드 false_value.py

print("# if 조건문에 0 넣기")
if 0 : 
    print("0은 True로 변환됩니다")
else :
    print("0은 False로 변환됩니다")    # 은 False
print()

print("# if 조건문에 빈 문자열 넣기")
if "" :
    print("빈 문자열은 True로 변환됩니다")
else :
    print("빈 문자열은 False로 변환됩니다")   # 빈 문자열은 False
    
# 실행 결과
# if 조건문에 0 넣기
0False로 변환됩니다

# if 조건문에 빈 문자열 넣기
빈 문자열은 False로 변환됩니다

결과에서도 볼 수 있듯이 2행의 조건문에 0이 있으므로 이것은 False로 변환되어 5행의 else 구문으로 이동한 후 "0은 False로 변환됩니다"를 출력하고, 9행의 조건문에는 빈 문자열 ""이 있으므로 이 또한 False로 변환되어 12행의 else 구문으로 이동한 후 "빈 문자열은 False로 변환됩니다"를 출력합니다.

여기서 잠깐! 뭔가 없는 것 같은 False
if 조건문에 비교 연산자가 없고 어떤 변수만 놓여 있을 때는 대부분 이러한 변환을 사용하는 것입니다. 어떤 값이 False로 변환되는지 알고 있어야만 코드를 이해할 수 있다는 이유로 이런 변환을 사용하지 말자는 개발자도 많습니다. 그래도 이미 수많은 코드에서 이와 같은 변환을 사용하고 있으므로, 다른 사람이 작성한 코드를 이해하려면 어느정도 알고 있어야 합니다. 따라서 간단하게 '뭔가 없는 것 같은 것은 False'라고 기억해 두고 이후에 필요할 때 조금씩 활용해 보며 알아가도록 합시다.

pass 키워드

프로그래밍을 하다 보면 일단 프로그래밍의 전체 골격을 잡아 놓고 내부에서 처리할 내용은 차근차근 생각하며 만들겠다는 의도로 다음과 같이 코딩하는 경우가 많습니다. 이때 골격은 일반적으로 조건문, 반복문, 함수, 클래스 등의 기본 구문을 말합니다.

if zero == 0
    빈 줄 삽입
else :
    빈 줄 삽입

다음 예제를 통해 어떤 결과가 나오는지 살펴보겠습니다.

👉 나중에 하려고 비워 둔 구문

소스코드 pass_keyword.py

# 입력을 받습니다.
number = input("정수 입력 > ")
number = int(number)

# 조건문 사용
if number > 0 :
    # 양수일 때 : 아직 미구현 상태입니다.
else :
    # 음수일 때 : 아직 미구현 상태입니다.
    
# 실행 결과
  File "<ipython-input-2-3b3dce594a96>", line 11
    else :
    ^
IndentationError: expected an indented block

다른 프로그래밍 언어에서는 위의 7행과 9행처럼 아무 내용을 작성하지 않아도 실행이 정상적으로 되지만, 파이썬의 경우에는 if 조건문 사이에는 무조건 들여쓰기 4칸을 넣고 코드를 작성해야만 구문이 성립되기 때문에 위와 같이 작성하는경우에는 IndentationError를 발생합니다.

IndentationError는 '들여쓰기가 잘못되어 있다'는 의미인데, 그렇기 때문에 if 구문 사이에는 어떤 내용이라도 넣어 줘야 합니다. 다음과 같이 0을 넣어도 일단 실행은 정상적으로 됩니다.

if number > 0 :
	0
else : 
	0

하지만 이렇게 0을 넣어 놓은 상태의 코드를 다른 개발자들이 보면 "왜 0이 있지?"라고 이상하게 생각할 수도 있습니다. 그래서 파이썬에서는 이러한 고민을 조금 덜어주기 위해 pass라는 키워드를 제공합니다. 코드를 살펴보던 중 pass 키워드를 만나면 "진짜로 아무것도 안함" 또는 "곧 개발하겠음"이라는 의미로 생각하면 됩니다.

👉 pass 키워드를 사용한 미구현 부분 입력

소스코드 pass_keyword01.py

# 입력을 받습니다.
number = input("정수 입력 > ")
number = int(number)

# 조건문 사용
if number > 0 :
    # 양수일 때 : 아직 미구현 상태입니다.
    pass
else :
    # 음수일 때 : 아직 미구현 상태입니다.
    pass
    
# 실행 결과
정수 입력 > 100

좀 더 알아보기 : raise NotImplementError

pass 키워드를 입력해 놨어도 내일이면 잊어버리는 경우가 많죠. 이후에 배우겠지만 raise 키워드와 미구현 상태를 표형하는 NotImplementedError를 조합해 raise NotImplementedError를 사용하면 '아직 구현하지 않은 부분이에요!' 라는 오류를 강제로 발생기킬 수도 있습니다.
앞서 작성한 passkeyword01.py에 raise NotImplementedError 구문을 넣어 보겠습니다.

# 입력을 받습니다.
number = input("정수 입력 > ")
number = int(number)

# 조건문 사용
if number > 0 :
    # 양수일 때 : 아직 미구현 상태입니다.
    raise NotImplementedError
else :
    # 음수일 때 : 아직 미구현 상태입니다.
    raise NotImplementedError

# 실행 결과
정수 입력 > 100
---------------------------------------------------------
NotImplementedError              Traceback (most recent call last)
<ipython-input-6-64d1374fa7e9> in <module>
      8 if number > 0 :
      9     # 양수일 때 : 아직 미구현 상태입니다.
---> 10     raise NotImplementedError
     11 else :
     12     # 음수일 때 : 아직 미구현 상태입니다.

NotImplementedError: 

코드를 실행하면 코드의 실행은 정상적으로 진행됩니다. 대신 구현되지 않은 부분에 들어서는 순간 NotImplementedError라는 오류를 발생시킵니다. 따라서 '이거 어제 구현을 안 했구나'라고 인지할 수 있는 것이지요.


마무리

🔍 4가지 키워드 핵심 포인트

  • else 구문은 if 조건문 뒤에 사용하며, if 조건문의 조건이 거짓일 때 실행됩니다.
  • elif 구문은 if 조건문과 else 구문 사이에 입력하며, 세 개 이상의 조건을 연결해서 사용할 때 적절합니다.
  • if 조건문의 조건식에서 False로 변환되는 값은 None, 0. 0.0, 빈 문자열"", 빈 바이트열b"", 빈 리스트[], 빈 튜플(), 빈 딕셔너리{} 등입니다.
  • pass 키워드는 프로그래밍의 전체 골격을 잡아놓고, 내부에 처리할 내용은 나중에 만들고자 할 때 pass라는 키워드를 입력해 둡니다.

🔍 확인문제

1. 다음 코드의 실행결과를 예측해 빈칸에 결괏값을 입력하세요. 아래의 코드는 모두 같고 입력이 다른 경우입니다.

## 예제 1
x = 2
y = 10

if x > 4 :    # x가 2라서 if 조건문 거짓임 -> else 구문으로 출력
    if y > 2 :
        print(x * y)
else :
    print (x + y)
    
# 실행 결과
12
## 예제 2
x = 1
y = 4

if x > 4 :    # x가 1라서 if 조건문 거짓임 -> else 구문으로 출력
    if y > 2 :
        print(x * y)
else :
    print (x + y)
    
# 실행 결과
5
## 예제 3
x = 10
y = 2

if x > 4 :    # x가 10이라 if 조건문 참, 실행
    if y > 2 :    # y가 2라 if 조건문 거짓임 -> else 구문 실행
        print(x * y)
else :
    print (x + y)
    
# 실행 결과
아무것도 실행되지 않고 코드가 종료됨

2. 다음 중첩 조건문에 논리 연산자를 적용해 하나의 if 조건문으로 만들어 주세요.

# 수정 전
if x > 10 :
    if x < 20 :
        print("조건에 맞습니다.")
        
# 수정 후
if 10 < x < 20 : 
    print("조건에 맞습니다.")

3. 사용자에게 태어난 연도를 입력받아 띠를 출력하는 프로그램을 작성해 주세요. 작성 시 입력받은 연도를 12로 나눈 나머지를 사용합니다. 나머지가 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11일 때 각각 원숭이, 닭, 개, 돼지, 쥐, 소, 범, 토끼, 용, 뱀, 말, 양띠입니다.

str_input = input("태어난 해를 입력해 주세요 > ")
birth_year = int(str_input) % 12

if birth_year == 0 :
    print("원숭이 띠 입니다.")
elif birth_year == 1 :
    print("닭 띠 입니다.")
elif birth_year == 2 :
    print("개 띠 입니다.")
elif birth_year == 3 :
    print("돼지 띠 입니다.")
elif birth_year == 4 :
    print("쥐 띠 입니다.")
elif birth_year == 5 :
    print("소 띠 입니다.")
elif birth_year == 6 :
    print("범 띠 입니다.")
elif birth_year == 7 :
    print("토끼 띠 입니다.")
elif birth_year == 8 :
    print("용 띠 입니다.")
elif birth_year == 9 :
    print("뱀 띠 입니다.")
elif birth_year == 10 :
    print("말 띠 입니다.")
elif birth_year == 11 :
    print("양 띠 입니다.")
    
# 실행 결과
태어난 해를 입력해 주세요 > 2019
돼지 띠 입니다.

윤성인, 『혼자 공부하는 파이썬』, 한빛미디어(2019), p126-137.

profile
라쏘, 릿지, 엘라스틱넷 중 라쏘를 담당하고 있습니다.

0개의 댓글