코린이의 소소한 공부노트

조건문 - if 본문

Python

조건문 - if

무지맘 2021. 5. 18. 18:14

데이터 타입과 타입별 연산자, 함수 등을 쭉 한번 둘러봤으니 이제 슬슬 프로그램의 모습을 갖춘 코드들을 작성해서 돌려보려 한다. 이번에 볼 것은 가장 기초적인 문법, 조건문 중에 if(이프)를 살펴보려고 한다.

 

1. if 조건문이란?

2. if문 작성 시 유의사항

3. 거짓이 False 말고 더 있다고?


1. if 조건문(if condition)이란?


# 나랑 동생이랑 저치(저녁 치킨) 예정
# 오늘은 내가 사는 날
i_have = ????
chicken = 18000

if i_have >= chicken*2:      # 내가 가진 돈이 치킨 2마리값 이상일 때 실행
    print('1인 1닭 ㄱㄱ.')
elif i_have >= chicken:      # 돈이 2마리값은 안되고 1마리 값 이상일 때 실행
    print('다이어트해야지 1마리만 시키자')
else:                        # 돈이 1마리 값도 없을 때........
    print('치킨은 개뿔 물이나 마시자..')

위에서 본 것이 if 조건문의 예시이다. 영어 수업 때 졸지 않았다면 대충 어떤 코드인지 해석이 가능할 것이다.

if 조건문은

1) 내가 정한 조건을 만족하는 경우에 실행된다.

 - i_have = 20000 이라면 if 조건은 False이므로 스킵하지만 elif 조건은 True이므로 elif에 해당하는 것이 실행된다.

2) 모든 조건은 논리형(boolean, bool)으로 표현된다.

 - i_have >= chicken 처럼 비교 연산자나 bool 타입의 값을 이용해서 조건을 표현한다.

 - 예외는 있다. 아래에서 설명 예정

3) if, elif(엘이프), else(엘스) 키워드가 사용되고, 조건 뒤에는 꼭 콜론 :을 붙여준다.

 - 콜론을 빼먹으면 SyntaxError: invalid syntax라는 에러 문구가 나온다. 꼭 확인할 것!

4) 들여 쓰기(보통 탭)로 코드의 범위를 구분 짓는다. 이때 들여 쓰기 된 코드를 코드 블록(code block)이라고 한다.

 - i_have의 값이 얼마냐에 따라 실행되는 print함수가 제각각이다.

 - if조건이 참이면 if의 코드 블록(print('1인 1닭 ㄱㄱ.'))이 실행되고,

 - if조건은 거짓, elif조건이 참이면 elif의 코드 블록(print('다이어트해야지 1마리만 시키자'))이 실행되고,

 - 모든 조건문에서 거짓이 나오면 else 코드 블록(print('치킨은 개뿔 물이나 마시자..'))이 실행된다.


2. if문 작성 시 유의사항


조건문을 만들 때 알고 있어야 하는 것은

1) 코드 블록은 여러 줄이어도 된다. 들여 쓰기만 똑같이 해두면 같은 코드 블록으로 인식한다.

a = 30

if a > 100:
    print('1번')
    print('if block')
    
elif a > 10:
    print('2번')
                        # 한 줄 띄워놔도 들여쓰기가 같기 때문에
    print('elif block') # 여기도 elif block
    
else:
    print('3번')
    print('else block')
    
>> 2번
>> elif block

2) if, elif, else 사이에 다른 코드를 넣을 수 없다.

위의 코드에서 한 줄만 바꾸면 이런 일이 일어난다.

a = 30

if a > 100:
    print('1번')
    print('if block')
    
elif a > 10:
    print('2번')
print('another block')       # 들여쓰기가 같지 않아 elif코드블록이 아님

else:
    print('3번')
    print('else block')

>> else:
   ^
>> SyntaxError: invalid syntax

if 코드 블록(두줄) 다음 elif 코드 블록(한 줄)이 나왔고 다른 코드 블록(주석 부분)이 나왔으므로 컴퓨터는 if 조건문이 끝났다고 생각하는데, 갑자기 else문을 만나서 당황해하는 모습을 보고 있다. if 조건문이 끝나기 전까지 다른 코드 블록을 중간에 삽입하지 말자.

3) if, elif를 여러 개 써도 상관없다. 하지만 else는 하나만 쓸 수 있다.

 - if를 하나 썼다면, 그 이후에는 if 0번 이상, elif 0번 이상 나올 수 있지만, else는 0번 또는 1번밖에 쓸 수 없다.

 - elif, else는 그 윗줄의 if 중 가장 가까운 if에 속하게 된다.

 - if문 안에 또 다른 if문(중첩 if문)을 쓸 수 있다. >> 가장 마지막 예시 코드를 보면 확인 가능하다.

a = 22

if a > 100:                   # False
    print('100보다 큰 수')

if a%2 == 0:                  # True
    print('짝수')              # 실행
else:                         # skip
    print('홀수')

if a%4 == 0:                  # False
    print('4로 나누면')
    print('나누어 떨어진다.')
elif a%4 == 1:                # False
    print('4로 나누면')
    print('1이 남는다.')
elif a%4 == 2:                # True
    print('4로 나누면')        # 실행
    print('2가 남는다.')
else:                         # skip
    print('4로 나누면')
    print('3이 남는다.')
    
>> 짝수
>> 4로 나누면
>> 2가 남는다.

4) 조건문에 쓰는 조건 또한 여러 가지 조건을 붙여 쓸 수 있다. bool 연산자인 and, or, not을 이용하면 된다.

a b a and b a or b   c not c
True True False True   True False
True False False True   False True
False True False True      
False False True False   우선순위: not > and > or
a = 60

if a%2 == 0 and a%3 == 0:
    print('6의 배수')
if a%2 == 0 and a%5 == 0:
    print('10의 배수')
if a%4 == 0 or a%7 == 0:
    print('4 또는 7의 배수')
if not a%2 == 0:
    print('홀수')
    
>> 6의 배수
>> 10의 배수
>> 4 또는 7의 배수

3. False로 간주되는 값들


위에서 if문을 설명할 때, 조건을 bool로 안 쓰고 예외인 것도 있다고 했는데, 그것에 대해 설명하겠다.

조건을 bool로 쓰는 것은 참일 때 실행, 거짓일 때 스킵하려고 하는 것이다. 보통 컴퓨터에서 True는 1, False는 0으로 표시를 하는데, 이것은 데이터 타입, 연산자 (1) 숫자형, 논리형에서도 살짝 언급한 부분이기도 하다. 여기서 1은 값이 있는 것, 0은 값이 없는 것으로 해석한다면 다른 타입을 가지고도 True와 False를 나타낼 수 있다.

False로 간주되는 값은 각 타입의 기본값(초기값, default value)이다.

모든 타입 정수 실수 문자열 리스트 튜플 dict 집합
None 0 0.0 '' 또는 "" [] () {} set()

이 외의 값은 모두 True로 간주된다.


위에서 본 if문의 특징들을 잘 읽어보았다면, 다음의 예시문을 고치는 과정을 잘 이해할 수 있다.

지금 해볼 것은 변수 a에 6을 할당해놓고 2, 3, 5의 배수인지 판별하는 if문을 만드는 것이다.

# 2, 3, 5의 배수인지 판별하는 if조건문

a = 6

if a%2 == 0:
    print('2의 배수입니다.')
elif a%3 == 0:
    print('3의 배수입니다.')
elif a%5 == 0:
    print('5의 배수입니다.')
else:
    print('2, 3, 5의 배수가 아닙니다.')
    
>> 2의 배수입니다.

6은 2의 배수이자 3의 배수인데, 3의 배수인 것은 왜왜왜왜왜왜 출력이 되지 않았을까?

if와 elif는 위의 조건문에서 False인 것만 다음 조건문을 수행하지, 한 조건문에서 True가 나오면 그대로 if 조건문을 빠져나오기 때문이다. 위의 예시에서는 if a%2 == 0:이 참이어서 if 코드 블록만 실행하고 나머지를 전부 다 스킵했다.

그럼 3의 배수도 출력이 되게 코드를 약간 수정해보겠다.

# 2, 3, 5의 배수인지 판별하는 if조건문

a = 6

if a%2 == 0:
    print('2의 배수입니다.')
if a%3 == 0:
    print('3의 배수입니다.')
if a%5 == 0:
    print('5의 배수입니다.')
else:
    print('2, 3, 5의 배수가 아닙니다.')
    
>> 2의 배수입니다.
>> 3의 배수입니다.
>> 2, 3, 5의 배수가 아닙니다.

아니, 마지막에 출력된 저 문장은 무엇이란 말이냐? 왜 내 의도대로 안 되는 것이냐?

else의 경우 가장 가까이 붙어있는 if와 짝꿍을 이루게 된다. 그래서 6이 마지막 if문인 if a%5 == 0:에 들어갔을 때 결과가 False가 되어서 else 코드 블록이 실행된 것이다. 으아아아아아 그렇다면 이 상황에서 무엇을 더 손봐야 내가 원하는 것이 나올 것인가?

# 2, 3, 5의 배수인지 판별하는 if조건문
# 주석에 쓰인 ~은 not의 의미를 지님
a = 24

if a%2 == 0:
    print('2의 배수입니다.')           #  2의 배수 & ~3의 배수 & ~5의 배수
    if a%3 == 0:
        print('3의 배수입니다.')       #  2의 배수 &  3의 배수 & ~5의 배수
        if a%5 == 0:
            print('5의 배수입니다.')   #  2의 배수 &  3의 배수 &  5의 배수
    elif a%5 == 0:
        print('5의 배수입니다.')       #  2의 배수 & ~3의 배수 &  5의 배수
elif a%3 == 0:
    print('3의 배수입니다.')           # ~2의 배수 & 3의 배수 & ~5의 배수
    if a%5 == 0:
        print('5의 배수입니다.')       # ~2의 배수 & 3의 배수 & 5의 배수
elif a%5 == 0:
    print('5의 배수입니다.')           # ~2의 배수 & ~3의 배수 & 5의 배수
else:
    print('2, 3, 5의 배수가 아닙니다.') # ~2의 배수 & ~3의 배수 & ~5의 배수
    
>> 2의 배수입니다.
>> 3의 배수입니다.

조건을 세분화해서 if문을 중첩해서 코드를 짰더니 결과가 내가 원한대로 나왔다. 그냥 예시로 만들어서 쓴 것이니 효율적인 코드인지 아닌지 따지는 것은 나중에 합시다..

if 조건문을 쓸 때 if, elif, else를 전혀 생각지도 못한 방향으로도 결과가 나올 수 있기 때문에 요리조리 수정해가면서 의도대로 동작할 수 있게 만들어주면 된다.


<요약>

 

1. if문의 생김새는 if/elif/else 조건:

 - 마지막 콜론 : 빼먹지 않기

 - 들여 쓰기로 코드 블록 구분

2. 각 타입의 초기값 = False

3. if문 하나당 else는 0개 or 1개