본문 바로가기
카테고리 없음

[Python] 파이썬 기본 문법 - 조건문 (if, else, elif)

by A6K 2022. 10. 25.

프로그램을 구성하는 가장 기본적인 블럭중에 조건문이 있다. 특정 조건이 만족되면 프로그램의 제어 흐름이 특정 부분으로 분기해서 수행되도록 하는 구문이다. 파이썬에서는 if, elif, else 키워드를 이용해 조건문을 사용할 수 있다.

조건문

우선 조건문이라는 것이 무엇인지부터 정리하고 넘어가자. 파이썬을 비롯한 많은 프로그래밍 언어에서 조건문을 if 라는 키워드를 통해 제공하고 있다. if는 우리말로 "만약에~"라는 의미다. "만약 나에게 10억이 있다면? 스포츠카를 살텐데" 같은 문장을 보면 나에게 10억이 있다는 조건이 만족되면 스포츠카를 산다는 행동이 진행된다. 즉, 10억이라는 조건이 만족되면 스포츠카를 산다는 행동이 실행된다.

이를 프로그래밍 언어의 조건문처럼 표현하면

money = 10억
if money > 10억:
  스포츠카를 산다.
else:
  못 산다

가지고 있는 돈의 양이 money라는 변수에 할당된다. 그리고 money 변수의 값이 10억을 넘으면 "스포츠카를 산다"를 실행하고, 10억이 넘지 않으면 "못 산다"로 실행 흐름이 넘어간다.

순서도(FlowChart)로 표현하면 다음과 같다.

10억이라는 조건이 있고, 그 조건의 만족 여부에 따라서 어떤 코드가 실행될지 결정된다.

파이썬에서 조건문은 다음과 같은 구조로 표현된다.

if expr1 :
  statement1
elif expr2 :
  statement2
else:
  statement3

if와 elif 그리고 else 키워드를 이용해서 각 조건들을 분기한다. if, elif, else 뒤에는 콜론(:) 문자가 붙고 그 다음에 한 단계 들여쓰기를 해서 그 조건이 맞았을 때 실행할 코드들을 작성한다.

if, elif, else 키워드는 if -> elif -> else 키워드 순으로 사용된다. 위 코드를 보면  expr1 이 참인 경우 statement1이 실행된다. expr1이 참이 아닌 상태에서 그 다음 elif 에 있는 조건으로 가서, expr2가 참이면 statement2가 실행된다. expr2 도 참이 아니면 else 쪽으로 가서 statement3이 실행된다.

if와 else는 if-elif-else 구문의 각각 처음과 마지막에 한번 사용되며, 중간에 elif는 여러번 등장할 수 있다. 단 조건은 윗쪽에 있는 조건부터 검사하며 조건이 참이 아닐 경우 그 다음 조건을 검사하면서 내려온다. elif와 else는 필요없는 경우 사용하지 않아도 된다.

순서도를 이용해서 표현하면 다음과 같다.

중첩된 조건문

조건문은 다른 조건문과 함께 사용할 수도 있다. 예를 들어

if expr1:
  if condition1:
    statement1
  else:
    statement2
elif expr2:
  if condition3:
    statement3
  elif condition4:
    statement4
  else
    statement5
else
  statement5

이렇게 복잡한 조건문들을 구성해서 쓸 수 있다. 보기에는 복잡해보이지만 실제로는 단순하다. expr1이 참이면 condition1을 검사한다. condition1이 참이면 statement1, 거짓이면 statement2를 실행한다. expr1이 거짓이면 expr2를 검사해서 참이면 condition3을 체크한다. 이런식으로 중첩된 조건문을 사용하게 된다.

간단한 조건문 예제

if-elif-else 구문을 이용한 파이썬의 조건문 예제를 생각해보자.

fruit = "Apple"

if fruit == "Apple":
  print("사과")
elif fruit == "Pear":
  print("배")
elif fruit == "Strawberry":
  print("딸기")
else:
  print("모르는 과일")

fruit 변수에 담겨있는 문자열에 따라서 출력되는 글자가 달라진다. fruit 변수에 "Apple"이 담겨 있으므로 "사과"가 화면에 출력된다.

참고로 위 코드를 다음과 같이 작성해도 되긴한다.

fruit = "Apple"

if fruit == "Apple":
  print("사과")
if fruit == "Pear":
  print("배")
  
if fruit == "Strawberry":
  print("딸기")
else:
  print("모르는 과일")

출력되는 내용은 동일하다. 하지만 if-elif-else로 묶어 둔 코드의 경우 fruit 변수가 "Apple" 인 경우 Pear, Strawberry 인지를 검사하지 않는다. 반면 여러 개의 if 문으로 체크하는 두 번째 코드의 경우 fruit 변수가 "Apple"인 경우에도 "Pear"인지, "Strawberry"인지를 매번 체크한다.

논리적으로 한번에 체크해야하는 경우라면 첫 번째 코드처럼 if-elif-else로 묶어야 불필요한 비교를 하지 않게 된다. (나중에 이런 것들이 모여서 성능 개선을 만드는 경우도 있다)

조건

if와 elif 옆에 사용할 수 있는 조건에 대해 알아보자. 조건문을 구성할 수 있는 조건은 참, 거짓을 판별할 수 있어야 한다. 예를 들어 변수의 값이 어떤 값과 같은지 다른지 , 변수의 값이 어떤 값보다 큰지 작은지 등이 있을 수 있다. 좀 더 정확하게 말하면 True 혹은 False로 표현되는 표현식을 의미한다.

예를 들어 True 혹은 False를 값으로 갖는 변수는 조건문의 조건으로 사용할 수 있다.

condition = True
if condition:
  print("참")
else:
  print("거짓")

condition 변수가 True이기 때문에 if 조건을 만족하고 "참"이 출력된다.

비교연산

조건문의 조건으로 사용할 수 있는 비교 연산자는 다음과 같다.

비교연산 설명
x < y y가 x보다 크면 참 아니면 거짓
x > y x가 y보다 크면 참 아니면 거짓
x == y x와  y가 같으면 참 아니면 거짓
x != y x와 y가 다르면 참 아니면 거짓
x >= y x가 y와 같거나 y보다 크면 참 아니면 거짓
x <= y y가 x와 같거나 x보다 크면 참 아니면 거짓

비교 연산으로 조건문을 다음과 같이 만들 수 있다.

if x > y:
  print('x를 가져라')
else:
  print('y를 가져라')

 

x가 y보다 크면 "x를 가져라"를 출력하고 아니라면(y와 x가 같거나 y가 x보다 크면) "y를 가져라"를 출력하도록 조건문을 이용해 코드를 작성할 수 있다.

논리연산

조건이 복잡한 경우 여러 조건들을 조합해서 사용해야 할 수 있다. 여러 조건을 조합해서 사용하기 위해서는 논리 연산을 사용하면 된다.

논리연산  
x or y x와 y 둘 중 하나라도 참이면 참, 둘 다 거짓이면 거짓
x and y x와 y 둘다 참이면 참, 둘 중 하나라도 거짓이면 거짓
not x x가 참이면 거짓, x가 거짓이면 참

논리연산을 조합해서 다음과 같이 조건문을 확장할 수 있다.

if x > y and z > x:
  print("z를 가져라")
elif x > y and z < x:
  print("x를 가져라")

in, not in 연산

파이썬에서는 어떤 자료구조에 어떤 값이 포함되어 있는지를 빠르게 확인할 수 있는 조건문을 제공한다. in 연산과 not in 연산을 이용해서 딕셔너리나 집합, 리스트에 특정 값이 포함되어 있는지를 확인할 수 있다.

예를 들어

a = [2,4,6,8]
value = 3

if value in a:
  print("리스트에 있음")
else:
  print("리스트에 없음")

이코드를 실행하면 "리스트에 없음"이 출력된다.

함수

True 혹은 False를 리턴하는 함수도 조건문에 사용할 수 있다.

if isMyFile(path):
  print("이건 내 파일이다")
else:
  print("내 파일이 아니네?")

isMyFile()이라는 함수를 정의해서 사용했다고 하자. isMyFile은 여러 정보들을 확인해서 True 혹은 False를 리턴한다. 이 함수는 조건문의 조건으로 사용할 수 있다.

조건부 표현식

파이썬에서는 조건부 표현식(Conditional Expression)을 통해 삼항연산자와 비슷한 기능을 제공한다. 삼항 연산자란 C나Java 같은 언어에서 제공하는 기능으로 다음과 같은 모양을 하고 있다.

condition ? statement1 : statement2;

condition이 참이면 statement1을 실행하고 (혹은 반환하고), 거짓이면 statement2를 실행(반환)한다. 예를 들어서

value = (myObject == null) ? DEFAULT_VALUE : myObject.getValue();

value 변수에 값을 할당하고 싶을 때, myObject 변수가 null이면 미리 정의된 기본값을 사용하고, 아니라면 myObject에서 값을 가져오는 것이다.

파이썬의 조건문으로 표현하면 다음과 같다.

if myObject == null:
  value = DEFAULT_VALUE
else:
  value = myObject.getValue()

4줄짜리 코드가 한줄로 줄어들었다. 코드의 라인수가 코드의 퀄리티를 결정하는 것은 아니지만 한줄로 표현할 수 있는 간결한 의미라면 삼항 연산자가 더 좋을 수 있다.

파이썬에서는 삼항연산자를 다음과 같이 사용할 수 있다.

조건문이 참일 경우 if 조건문 else 조건문이 거짓일 경우

위에서 봤던 Java로 표현된 삼항 연산자는 다음과 같이 표현할 수 있다.

value = DEFAULT_VALUE if myObject == None else myObject.getValue()

switch-case 구문

파이썬에서는 switch-case 구문을 제공하지 않는다. PEP-3103에서 switch-case 구문을 파이썬에 추가하는 것에 대한 논의가 있긴 있었다. 하지만 if-elif-else 만으로 잘 동작하고 있었고, 파이썬 개발자들이 switch-case 구문에 대한 필요성을 못 느끼고 있어 관련 논의는 폐기되었다.

switch-case 구문은 if-elif-else 구문으로 대체할 수 있다. 또, 특정 값에 따라 처리해야하는 동작이 다른 경우, 딕셔너리와 함수를 매핑해서 구현할 수 있다. 예를 들어

def function1(...):
   ...
   
def function2(...):
   ...
...

functions = {'value1' : function1,
             'value2' : function2,
             'value3' : function3, ...}
             
 func = functions[value]
 func()

이런식으로 구현해서 매핑해 사용한다면 switch-case 문을 대체할 수 있다.


 

파이썬 스크립트 작성에 도움되는 글 모음

파이썬으로 프로그램을 작성할 때 도움되는 글들을 모아본다. 개발환경 [Python] macOS에 파이참 설치 [Python] 파이참 깃허브 연동 [Python] 파이썬 PIP란? [Python] VSCode를 이용한 개발환경 Python 문법 [Pyth.

hbase.tistory.com

 

댓글