지금까지 기본적인 자료 구조에 대해서 배웠고, 이제부터는 이러한 자료 구조들을 활용하여 코드를 본격적으로 만들기 위해 코드 구조에 대해서 다뤄보겠습니다.
목차
1. 조건문 if-else
2. 비교 연산자/불형 연산자
3. 추가 조건-elif
4. 참과 거짓
프로그래밍 언어에는 로직의 흐름을 제어하기 위한 여러 가지 문법을 제공합니다. 대표적으로 조건문, 예외 처리문, 반복문이 있습니다.
조건문은 모든 프로그래밍 언어에서 가장 기본이 되는 문법입니다. 특정 조건을 만족할 때만 코드가 시행되게 하게끔 만들 때 반드시 필요한 문법이기 때문이죠. 파이썬에서 조건문을 만들 때는 if문과 elif(else if), 그리고 else문을 사용합니다.
1. 조건문 if-else
가장 기본적인 예제는 다음과 같습니다.
value = True if value: print("Hello World") else: print("안녕하세요") |
결과)
Hello World |
코드 구조를 살펴보겠습니다.
value = True |
value라는 변수를 선언하고 동시에 True라는 불 값을 할당합니다.
if value: print("Hello World") |
if 선언 이후 True(참)/False(거짓)을 판단합니다. 참이라면 하위 코드를 실행합니다. if문과 같은 제어문의 마지막에는 콜론(:)을 찍습니다. 그 다음 줄에는 해당 조건이 만족할 때 실행될 소스 코드를 작성하게 되는데 이때 들여쓰기가 중요해집니다. 파이썬에서 들여쓰기는 if와 else 부분이 어떻게 짝을 짓는지를 결정합니다. 같은 들여쓰기는 같은 수준의 if/else 구문을 따르게 됩니다. 위의 부분 코드에서 볼 수 있듯, if 조건문이 참일 때 실행되는 코드는
print("Hello World")
로 들여쓰기가 되어 있습니다. 이후에도 등장하겠지만 이렇게 코드의 흐름을 제어하는 문법이 등장한 후 조건이 만족될 때 실행 될 코드는 들여쓰기를 통해 작성하도록 되어 있습니다. 이러한 들여쓰기(indentation)는 탭(tab) 키 또는 스페이스바를 이용한 띄어쓰기 4번으로 이루어지며, 파이썬 권장 문법은 띄어쓰기 4번을 이용할 것을 권합니다. 다만 저희는 파이참(pycharm)을 이용하고 있죠? 파이참에서는 탭과 띄어쓰기 4번이 동일하게 인식됩니다. 파이참을 이용할 경우 탭과 띄어쓰기 4번을 구분없이 사용해도 괜찮습니다.
else: print("안녕하세요") |
else에는 if 조건문이 만족이 되지 않을 때 시행할 코드를 작성하게 됩니다. 실행될 코드는
print("안녕하세요")
입니다. 종합적으로 value = True이므로 if True의 구조로 if 이하의 코드가 시행됩니다. else 이하의 코드는 시행되지 않습니다.
좀 더 복잡한 수준의 조건문도 가능합니다.
furry = True small = True if furry: if small: print("It's a cat.") else: print("It's a bear!") else: if small: print("It's a skink!") else: print("It's a human. Or a hairless bear.") |
결과)
It's a cat. |
furry = True small = True |
furry와 small 변수를 선언하고 각각 True를 할당합니다.
if furry: ~code1 else: ~code2 |
소스코드의 전반적인 구조는 위와 같습니다. furry가 True일 경우 code1이, False일 경우 code2가 시행되는 구조입니다. furry 변수는 True라는 불 값을 갖고 있으므로 code1만 시행되며 code2는 시행되지 않습니다.
~code1 if small: print("It's a cat.") else: print("It's a bear!") |
code1도 조건문으로 구성되어 있습니다. 변수 small이 True인지 False인지를 판단하며 True일 경우
print("It's a cat.")
코드를, False일 경우print("It's a bear!")를 시행합니다. 초기에 furry = True로 할당했기 때문에 print("It's a cat.")이 시행됩니다. 또한 if/else 부분이 탭/띄어쓰기 4번으로 들여쓰기 되어 있기 때문에 이 하위 코드는 탭 2번/들여쓰기 8번으로 들여쓰기가 되어있어야 합니다.
~code2 if small: print("It's a skink!") else: print("It's a human. Or a hairless bear.") |
code2는 시행되지 않지만 code1과 같은 구조를 보입니다.
2. 비교 연산자/불형 연산자
True/False 뿐만 아니라 비교 연산자를 통해 조건문 수행 여부를 결정할 수도 있습니다.
의미 | 연산자 |
equality | == |
inequality | != |
less than | < |
less than or equal | <= |
greater than | > |
greater than or equal | >= |
membership | in |
x = 7 print(x == 5) print(x == 7) print(5 < x) print(x < 10) |
결과)
False True True True |
동시에 복잡한 여러 비교를 할 때는 and, or, not을 사용하면 됩니다. 이러한 연산자를 불형 연산자(boolean operator)라 합니다.
x = 7 print(5 < x and x < 10) print((5 < x) and (x < 10)) print(5 < x or x < 10) print(5 < x and x > 10) print(5 < x and not x > 10) print(5 < x < 10) print(5 < x < 10 < 999) |
결과)
True True True False True True True |
3. 추가 조건-elif
테스트하고자 하는 조건이 여러 개일 경우 elif를 추가로 사용합니다.
color = "puce" if color == "red": print("It's a tomato.") elif color == "green": print("It's a green pepper.") elif color == "purple": print("It's an eggplant.") else: print("I've never heard of the color '{}'.".format(color)) |
결과)
I've never heard of the color 'puce'. |
color = "puce" if color == "red": ~code1 elif color == "green": ~code2 elif color == "purple": ~code3 else: ~code4 |
color = "puce"로 변수의 선언과 할당이 이루어졌습니다. 다음으로 등장하는 조건문들은 모두 color 변수가 담고 있는 값이 특정 문자열과 일치하는지를 판단합니다. 일치한다면 하위 코드가 시행되며 일치하지 않는다면 다음 조건문으로 넘어가게 됩니다. 특이한 사항은 if 조건문을 만족하지 않을 때 바로 else로 넘어가는 것이 아닌, elif 조건문으로 들어간다는 것입니다.
color가 담고 있는 "puce"라는 문자열은 "red"와 일치하지 않기 때문에 code1은 시행되지 않습니다. 다음의 elif 조건을 판단하게 되며 이때도 마찬가지로 변수 color의 값은 "green"과 일치하지 않아 code2는 시행되지 않습니다. 같은 시행이 elif color == "purple": 까지 이어지며 이 경우에도 조건이 만족하지 않으므로 결과적으로 else 이하의 code4가 시행됩니다.
~code4 print("I've never heard of the color '{}'.".format(color)) |
따라서 결과창에는 I've never heard of the color 'puce'.라는 문장이 출력됩니다.
다른 예제를 보겠습니다.
price = 15980 if price < 14000: print("Do not buy it.") elif 14000 <= price: print("Consider buying it.") elif 15000 < price: print("It's overestimated.") else: print("You didn't move.") |
결과)
Consider buying it. |
price = 15980 if price < 14000: ~code1 elif 14000 <= price: ~code2 elif 15000 < price: ~code3 else: ~code4 |
price = 15980에서는 변수명 price가 변수로 선언됨과 동시에 정수 15980이 할당됩니다. 이후 조건문의 구조를 보면 if/elif/elif/else의 순으로 이루어져 있는 것을 알 수 있는데요. 이때 조건이 참이되는 경우가 두 가지 입니다.
elif 14000 <= price:
~code2
elif 15000 < price:
~code3
price가 만족하는 두 개의 조건이 있기 때문에 code2와 code3가 모두 시행될까요? elif 문을 사용하면 처음 조건이 만족하게 되는
elif 14000 <= price:
~code2
만 시행이 됩니다. 따라서 결과 창에 Consider buying it.만 출력되는 것이죠. 그럼 다음의 코드 시행 결과는 어떨까요?
price = 15980 if price < 14000: print("Do not buy it.") if 14000 <= price: print("Consider buying it.") if 15000 < price: print("It's overestimated.") else: print("You didn't move.") |
결과)
Consider buying it. It's overestimated. |
price = 15980 if price < 14000: ~code1 if 14000 <= price: ~code2 if 15000 < price: ~code3 else: ~code4 |
elif 대신 if문을 여러 번 사용한 경우, 모든 if 조건을 탐색하여 결과를 시행합니다. 즉, 조건을 만족하는
if 14000 <= price:
~code2
if 15000 < price:
~code3
에 해당하는 모든 소스 코드(code2, code3)를 순서대로 시행하여 결과를 냅니다. 순서도로 그려보면 다음과 같은 차이가 있겠네요.
4. 참과 거짓
파이썬에서는 불형이 아니더라도 참과 거짓을 판단할 수 있습니다. 아래의 예들은 모두 False로 취급되며 이외는 True로 취급됩니다.
자료형 | 표현 |
boolean | False |
null | None |
zero integer | 0 |
zero float | 0.0 |
empty string | ' ' |
empty list | [ ] |
empty tuple | ( ) |
empty dict | { } |
empty | set( ) |
some_list =[ ] if some_list: print("There's something in here.") else: print("Hey, it's empty!") |
결과)
Hey, it's empty! |