상세 컨텐츠

본문 제목

[ Python 기초 문법 ] - 제어문(1) - if문

Language/Python

by bing_su 2023. 8. 10. 21:32

본문

반응형
SMALL

이번 게시물부터는 프로그램의 구조를 설계하기 위해 사용되는 제어문에 대해 살펴볼 것이다. 프로그래밍에서 제어문은 조건에 따라 실행해야 할 명령문을 제어하는 데 사용된다. 즉, 제어문은 조건을 판단하여 해당 조건에 맞는 상황을 수행하거나 해당 조건에 맞춰 상황을 반복하는 역할을 수행한다.

 

이번 게시물에서는 조건에 맞춰 해당하는 명령어를 사용하는 if문을 살펴볼 예정이다.

[ if문의 기본 구조 ]

if와 else를 사용한 조건문의 기본 구조를 살펴보면 아래와 같다.

if (condition):  # 조건문이 참일 경우 동작
    Sentence 1
    Sentence 2
    …
else:
    Sentence A  # 조건문이 참이 아닐 경우(거짓일 경우) 동작
    Sentence B
    …

if 문의 순서도

위의 기본 코드와 순서도를 통해 살펴보자. 먼저, 어떤 값이 입력되면(Input) 해당 조건문을 테스트한다. 해당 값을 조건문에 테스트해서 참이면 if문이 동작하여 if 블록의 문장이 수행되고, 거짓이면 else 블록의 문장이 수행된다. 이러한 Logic 때문에 else문은 if문 없이 독립적으로 사용할 수 없다.

※ 들여 쓰기: 블록의 구분 단위

파이썬에서는 들여 쓰기로 블록(어떠한 동작을 수행할 때 필요한 코드들을 묶어놓은 단락 정도로 생각하면 됨.)을 구분한다. 코딩 블록을 시작하는 문장에는 콜론(:)을 붙여야 하고, 블록 내부의 문장들은 동일한 칸의 공백을 사용해야 한다. 예를 들면 4개의 공백을 사용하는데 중간에 하나라도 틀리면 에러가 발생한다.

if (condition):
    Sentence 1
    Sentence 2
    Sentence 3

if문을 만들 때도 if문 내부에서 동작하는 모든 문장은 동일한 들여 쓰기(indentation)를 해야 한다. 그리고 if문 내부의 블록을 시작한다는 의미에서 if 뒤에 콜론(:)을 붙여야 한다. (콜론 빼먹지 마세요!!)

if (condition):
    Sentence 1
  Sentence 2
    Sentence 3

위와 같이 코드를 작성하면 오류가 발생한다. 'Sentence 2'를 다른 문장들과 동일하게 들여 쓰기를 하지 않았기 때문이다. 들여 쓰기는 언제나 같은 너비로 해야 한다. 들여 쓰기는 공백(Spacebar)으로 하든 탭(Tab)으로 하든 본인 편한 방식으로 하면 된다. 본인이 Spacebar로 할 거면 쭉 Spacebar로 통일하고, Tab으로 할 거면 Tab으로 통일하면 좋다. (필자는 Tab이 더 익숙한 사람..) 혼용해서 쓰지만 말자.

[ 조건문 ]

if문에서 '조건문'이란 참과 거짓을 판단하는 문장이다. 조건문의 참, 거짓을 판단하는 데는 자료형과 여러 연산자가 활용될 수 있다. 자료형의 참 거짓은 해당 게시물에서 다뤘으니 기억이 나지 않는다면 다시 보고 오자.

<< 비교 연산자 >>

실제 조건문을 작성할 때 자료형보다 비교 연산자를 쓰는 경우가 더 많다.

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

위의 표에서 비교 연산자를 살펴보자. 이를 조금 더 쉽게 설명하기 위해 예시 코드로 설명하겠다.

>>> x = 3
>>> y = 2
>>> x > y
True  # x는 y보다 크므로 True 출력
>>> x < y
False  # x는 y보다 작지 않으므로 False 출력
>>> x == y
False  # x와 y는 같지 않으므로 False 출력
>>> x != y
True  # x와 y는 다르므로 True 출력

if문을 활용한 예시를 하나 더 살펴보자.

>>> money = 2000  # money 변수 값을 2000이라 선언
>>> if money >= 3000:  # money >= 3000 조건식이 True일 때 동작
…    print("Take a taxi")
… else:  # money >= 3000 조건식이 False일 때 동작
…    print("Just walk")

# 출력 화면
Just Walk

조건식은 'money >= 3000'이다. 해당 조건식은 False이므로 else 블록을 수행해야 한다.

<< 논리 연산자 >>

조건을 판단하기 위해 사용하는 다른 연산자로 and, or, not이 있다.

비교 연산자 설명
x or y x와 y 둘 중 하나만 참이어도 참
x and y x와 y 모두 참이어야 참
not x x가 거짓이면 참

각 연산자는 위의 표와 같이 동작한다. 이 역시도 예시 코드를 통해 살펴보자.

>>> money = 2000  # money 변수 값을 2000이라 선언
>>> card = True  # card 변수 값을 True라 선언
# money >= 3000 / card 조건식 둘 중 하나가 True일 때 동작
>>> if money >= 3000 or card:  
…    print("Take a taxi")
# money >= 3000 / card 조건식 둘 다 False일 때 동작
… else:
…    print("Just walk")

# 출력 화면
Take a taxi

조건식은 'money >= 3000'과 'card' 2개다. 전자가 False고 후자가 True이므로 해당 조건식은 결론적으로 True가 된다. 따라서 이번에는 if 블록이 수행된다.

<< 포함 연산자 >>

더 나아가 파이썬에서는 다른 프로그래밍 언어에서는 볼 수 없는, 포함 연산자(in, not in)를 사용한 조건문을 제공한다.

in not in
x in list x not in list
x in tuple x not in tuple
x in string x not in string

위와 같이 해당 연산자는 리스트, 튜플, 문자열 모두에 적용할 수 있다. 예시 코드를 보며 이해하자.

# List
>>> 1 in [1, 2, 3]  # 1이 [1, 2, 3] 안에 있는가?
True
>>> 1 not in [1, 2, 3]  # 1이 [1, 2, 3] 안에 없는가?
False

# Tuple
>>> 'a' in ('a', 'b', 'c')  # 'a'가 ('a', 'b', 'c') 안에 있는가?
True

# String
>>> 'j' not in 'python'  # 'j'가 'python' 안에 없는가?
True

영어에서 in은 '~안에'라는 뜻을 가진다. 이를 생각하면서 위 코드를 보면 쉽게 이해될 것이다.

이를 응용해 우리가 계속 봤던 택시 예시 코드에 in 연산자를 적용해서 살펴보자.

>>> pocket = ['paper', 'cellphone', 'money']  # 주머니 안에 있는 물건을 리스트로 선언
>>> if 'money' in pocket:  # pocket 리스트 안에 'money'가 있을 경우 동작
…    print("Take a taxi")
… else:  # pocket 리스트 안에 'money'가 없을 경우 동작
…    print("Just walk")

# 출력 화면
Take a taxi

pocket 리스트 안에 'money' 문자열이 존재하므로 조건문은 참이 된다. 따라서 if 블록이 실행된다.

<< pass 키워드의 사용 >>

조건문의 참/거짓에 따라 아무런 문장도 실행하지 않도록 설정하고 싶을 때가 있다. 이럴 때 사용하는 것이 pass 키워드다. 구문은 필요하지만 코드를 실행할 필요가 없을 때 빈 자리를 채우기 위해 사용된다. 아래 예시를 살펴보자

>>> pocket = ['paper', 'money', 'cellphone']  # 주머니 안에 있는 물건을 리스트로 선언
>>> if 'money' in pocket:  # pocket 리스트 안에 'money'가 있을 경우 동작
…    pass  # 아무런 코드도 실행되지 않음
… else:  # pocket 리스트 안에 'money'가 없을 경우 동작
…    print("Use your card")

# 출력 화면

pocket 리스트 안에 'money' 문자열이 존재하므로 조건문은 참이 된다. 따라서 if 블록이 실행되는데 pass가 실행되므로 아무 결괏값도 보여 주지 않게 되는 것이다.

[ 다양한 조건을 판단하는 elif ]

if와 else만을 사용하면 다양한 조건을 판단하기 어렵고, 판단하더라도 소스코드가 복잡해질 수 있다. 이때 사용할 수 있는 것이 elif 키워드다. 아래의 예시를 보며 elif 문을 이해하자.

"""
주머니에 돈이 있으면 택시, 돈이 없지만 카드가 있으면 택시,
돈도 없고 카드도 없으면 걷는 상황을 프로그램으로 구현
"""

# if ~ else만을 이용하여 구현
>>> pocket = ['paper', 'cellphone']  # 주머니 안에 있는 물건을 리스트로 선언
>>> card = True  # card 변수 값을 True라고 선언. 카드가 있다고 가정.
>>> if 'money' in pocket:  # 주머니(pocket) 안에 돈('money')이 있으면 동작
…    print("Take a taxi")
… else:  # 주머니(pocket) 안에 돈('money')이 없으면 동작
…    if card:  # 주머니 안에 돈이 없지만, 카드를 가지고 있으면 동작
…        print("Take a taxi")
…    else:  # 주머니 안에 돈도 없고, 카드도 없으면 동작
…        print("Just walk")
# 출력 화면
Take a taxi

# elif를 사용하여 구현
>>> pocket = ['paper', 'cellphone']  # 주머니 안에 있는 물건을 리스트로 선언
>>> card = True  # card 변수 값을 True라고 선언. 카드가 있다고 가정.
>>> if 'money' in pocket:  # 주머니(pocket) 안에 돈('money')이 있으면 동작
…    print("Take a taxi")
… elif card:  # 주머니 안에 돈이 없지만, 카드를 가지고 있으면 동작
…    print("Take a taxi")
… else:  # 주머니 안에 돈도 없고, 카드도 없으면 동작
…    print("Just walk")
# 출력 화면
Take a taxi

if / else만을 이용하는 것보다 elif를 활용했을 때 코드가 더 간결하다. elif는 이전 조건문이 거짓일 때 수행된다. 이렇게 if, elif, else를 모두 사용할 때 기본 구조는 아래와 같이 나타낼 수 있다.

if (condition 1):  # 조건문 1이 참일 경우 동작
    Sentence 1-1
    Sentence 1-2
elif (condition 2):  # 조건문 1이 거짓이지만 조건문 2가 참일 경우 동작
    Sentence 2-1
    Sentence 2-2
…
elif (condition N):  # 조건문 1, …, (N-1)이 거짓이지만 조건문 N이 참일 경우 동작
    Sentence N-1
    Sentence N-2
…
else:  # 앞선 조건문이 모두 거짓일 때 동작
    Sentence A
    Sentence B

if ~ elif ~ else문의 순서도

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

[ 조건문을 한 줄로 작성하기 ]

if나 elif나 else 블록에서 수행해야 할 문장이 하나라면, 간략하게 코드를 작성할 수 있다. 예시를 살펴보며 이해하자.

>>> pocket = ['paper', 'money', 'cellphone']
>>> if 'money' in pocket: pass
… else: print("Use your card")

위의 예시처럼 그냥 수행할 문장을 콜론(:) 뒤에 바로 적어주기만 하면 된다. 하지만 필자는 개인적으로 해당 코드는 가독성이 떨어진다고 생각해서 거의 쓰지 않는다. (알아서 취향껏 쓰시면 됨.)

[ 조건부 표현식(conditional expression) ]

조건부 표현식의 기본 구조를 살펴보면 아래와 같다.

(true condition sentence) if (condition) else (false condition Sentence)

아래의 예시 코드를 통해 더 쉽게 살펴볼 수 있다.

# if ~ else 문을 이용하여 구현
>>> if score >= 60:  # score 값이 60보다 크거나 같을 때 동작
…    message = "success"  # message 변수에 "success" 값 대입
… else:  # score 값이 60보다 작을 경우에 동작
…    message = "failure"  # message 변수에 "failure" 값 대입

# 조건부 표현식을 이용하여 구현
>>> message = "success" if score >= 60 else "failure"

위의 두 표현 모두 score이 60 이상이면 message에 문자열 "success"를, 아닐 경우에는 "failure"를 대입하는 코드다. 둘 다 가독성이 괜찮아서 많이 쓴다. 간결하게 쓰고 싶다면 조건부 표현식을 이용하여 구현해도 된다. (취향껏 쓰세요.)

반응형
LIST

관련글 더보기

댓글 영역