Program Arcade Games
With Python And PygameChapter 3: 퀴즈 게임과 IF 문
게임 플레이어가 최고점수를 깼을 때 어떻게 알려줘야 할까? 만약 생명력이 다 되어간다면 어떤식으로 알려주어야 하나? 잠긴 문을 열 수 있는 키를 가지고 있다면 어떻게 알려 줘야 할까?
우리에게 필요 한 것은 if 문 이다. if 문은 또한 조건문(conditional statement)이라고도 한다. (똑똑함을 보여 주고 싶다면 “conditional statement” 라고 표현하는 것도 괜찮겠다. -_-) if 문은 컴퓨터에게 결정을 할 수 있도록 해준다. 바깥 날씨가 춥나? 우주선이 화면 꼭대기에 도달 했나? 계좌에서 너무 많은 돈이 인출되었나? 프로그램은 이런 조건들을 if 문을 사용하여 해결 할 수 있다.
3.1 기본 비교
if 문에 대한 몇 가지 예를 보자. 먼저 if 문에서 사용 할 변수 2개(a 와 b)를 선언한다. 그 다음 2개의 if 문은 변수 간의 크기를 어떻게 비교하는 지를 보여 준다. “Step” 버튼을 눌러서 컴퓨터가 코드를 어떻게 수행하는지 알아 보자.
# Variables used in the example if statements a = 4 b = 5 # Basic comparisons if a < b: print("a is less than b") if a > b: print("a is greater than b") print("Done") |
Variables:
a=4 b=5 Output:
a is less than b Done |
a가 b보다 작기 때문에, 이 코드를 실행시키면 첫번째 문장이 출력 될 것이다. 만약 변수 a와 b의 값이 4로 같다면, 위 2개의 if 문은 어떤 것도 출력 하지 않는다. 4는 4보다 크지 않기 때문에 if 문은 거짓이므로 실행되지 않는다.
프로그램의 흐름을 보여 주기 위해 순서도(flowchart) 를 사용 할 수 있다. 대부분 사람들은 프로그램에 대한 지식이 없더라도 순서도의 흐름은 따라 갈 수 있다. Figure 3.1을 보고 이해 해 보자.
지루할 수도 있어서 순서도에 대한 깊이있는 얘기는 하지 않겠다. 하지만, 여러분이
멋진 프로그래머가 되고자 한다면 좀 더 읽어보기를 권한다.:
http://en.wikipedia.org/wiki/Flowchart
앞의 예제에서는 크거나 작음을 비교 했었다. 같은 수는 if문을 통과하지 못했다. 크거나같음을 비교하는 것을 다음 예제가 보여 준다:
if a <= b: print("a is less than or equal to b") if a >= b: print("a is greater than or equal to b")
<= 와 >= 심볼은 순서대로 사용되어야 하고 사이에 공백이 없어야 한다. 예를 들면, =< 나 < = 는 제대로 동작하지 않는다.
시험에 이런 구문을 내보면 어떤 학생들은 ≤ 심볼을 사용하기도 한다. 예를 들면:
if a ≤ b:
이 ≤ 심볼은 프로그램에서 제대로 동작하지 않는다. 게다가 대다수는 키보드에서 이 심볼을 입력하기 위해 뭘 눌러야 하는지도 모른다. (혹시 어떻게 입력하는지 궁금한 사람을 위해 설명하자면, 'ㄷ'을 누르고 '한자'키를 누르면 입력할 수 있다.) 그러므로 코드를 작성 할 때 ≤이 아니라 <= 를 사용하라. 많은 이들이 헷갈려 하는 부분이다.
다음 예제코드는 두 변수값이 같은지를 체크하는 것이다. 같음을 확인하는 연산자는 == 이고 같지 않음을 확인 하는 연산자는 != 이다. 어떻게 동작하는지 살펴 보자
# Equal if a == b: print("a is equal to b") # Not equal if a != b: print("a and b are not equal")
주의할 것은 == 와 =을 혼동하지 말아야 한다. 서로 값이 같은지를 확인하고자 한다면 == 를 사용하라. 변수에 값을 할당하고자 하는 경우는 = 를 사용한다.
= 와 ==를 혼동하는 흔한 실수를 아래 예제가 보여 준다:
# This is wrong a == 1 # This is also wrong if a = 1: print("A is one")
잠깐! 마지막 두 개의 코드를 주의 깊게 좀 더 보길 바란다.= 와 ==를 명확하게 구분하여 나중에 실수 하지 않도록 하자.
3.2 들여쓰기(Indentation)
파이썬에서 들여쓰기는 매우 중요하다. if 문이 참(True)일 때 if문 아래 들여쓰기가 된 구문만이 실행된다:
if a == 1: print("a가 1이면 이 문장이 출력된다.") print("이것도 출력되고,") print("여기도 출력되고,") print("이 부분은 들여쓰지 않았으므로 항상 출력된다.")
들여쓰기의 정도는 같아야 한다. 아래 코드는 동작하지 않는다.
if a == 1: print("두 칸 들여썼다.") print("네 칸 들여썼다, 에러를 낼 것이다.") print("컴퓨터는 여러분이 정확한 결정을 하길 원한다.")
일단 if 문이 한번 종료되고 나면, 다시 되돌아가기 위해 들여쓰기를 다시 하는 것은 옳지 않다. 조건문을 다시 만들어 써야 한다.
if a == 1: print("a가 1이면 이 문장이 출력된다.") print("이것도 출력된다.") print("이 부분은 들여쓰지 않았으므로 항상 출력된다.") print("이 부분은 에러를 낼 것이다. 들여쓰기를 왜 했지?")
3.3 And/Or 사용하기
if 문은 and 와 or 를 사용해서 다중 조건을 비교할 수 있다. + 나 - 같은 연산자(operators) 처럼 생각 해도 된다.
# And if a < b and a < c: print("a 는 b 와 c 보다 작다.") # Non-exclusive or if a < b or a < c: print("a 는 b나 c 보다 작다.(또는 둘 다)")
다중 조건을 비교할 때 범하는 흔한 실수는 변수를 빼먹는 경우이다. 아래 코드는 작동하지 않는다. 왜냐하면 컴퓨터는 무엇을 변수 c와 비교해야 하는지 모르기 때문이다. a와 비교한다고 가정되지 않는다.
# This is not correct if a < b or < c: print("a is less than b and c")
3.4 이진변수(Boolean Variables)
파이썬은 이진 변수를 지원한다. 이진 변수(Boolean variables)란 무엇인가? 이진변수는 참(True) 또는 거짓(False)을 저장한다. 불대수(Boolean algebra) 는 1854년 George Boole 에 의해 고안되었다. 그는 이 발명이 현대 컴퓨터 로직에 근간이 되었다는 것을 알았을까?
if 문은 참(True) 또는거짓(False)을 평가할 표현이 필요하다. 조금 어색하게 보일 수도 있지만 만약 변수 값이 이미 True 나 False로 정해졌다면 별도의 비교 구문은 필요없다.
# 이진 데이터 타입. 이 구문은 문제가 없다! a = True if a: print("a is true")
내가 학교 다닐때는 거짓인 문장을 사용하는 것이 유행이었다. 3초만 기다려.. "뻥!"이야.. 비록 컴퓨터는 나를 찌질하다고 생각 했을 수도 있지만. False값을 얻고 싶으면 not 연산자를 사용해 보라. 다음 예제는 참과 거짓으로 a값을 바꾸기 위해 not 연산자를 사용하고 있다.
# How to use the not function if not(a): print("a is false")
not은 함수가 아니라 연산자이므로 사실 괄호없이도 사용 할 수 있다. 다음과 같이 사용해도 된다:
# How to use the not function if not a: print("a is false")
and 와 or 연산자와 함께 이진 변수들을 사용 할 수도 있다.
a = True b = False if a and b: print("a and b are both true")
변수에 비교의 결과값을 할당하는 것도 가능하다. 아래 코드에서 변수a 와 b 를 비교한다. 만약 두 값이 같으면 c 는 True가 될 것이고, 같지 않다면 c 는 False가 될 것이다.
a = 3 b = 3 # 다음 코드는 어색하게 보일 수 있지만, 문제 없다. # a 와 b가 같은지 여부에 따라, # c 는 true 또는 false 가 될 수 있다. c = a == b # c값을 출력하는데 이 경우 True가 나올 것이다. print(c)
true 나 false를 평가하지 않고 if 문을 사용하는 것도 가능하다. 일반적으로 바람직한 방법은 아니지만 컴퓨터가 문제들을 찾을 때 어떤식으로 다루는지를 이해하는 것도 중요하다. 아래 구문은 문법적으로 문제가 없고 if 문의 값이 zero가 아니므로 문장을 출력 할 것이다:
if 1: print("1") if "A": print("A")
아래 코드는 아무것도 출력하지 않는다. 왜나하면 if 문의 값이 zero이라서 False로 처리되기 때문이다. zero가 아닌 모든 값들은 True로 처리된다.
if 0: print("Zero")
아래 코드에서 첫번째 if 문은 동작은 한다. 하지만 문제는 변수 a 가 b 와 같지 않더라도 항상 True로 간주된다는 것이다. 왜나하면 b 자체가 true로 간주되기 때문이다.
a = "c" if a == "B" or "b": print("a is equal to b. Maybe.") # 이렇게 if문을 쓰는 것이 바람직하다. if a == "B" or a == "b": print("a is equal to b.")
3.5 Else 와 Else If
아래 코드는 사용자로 부터 온도 값을 입력 받아 뜨거운지 여부를 출력하는 프로그램이다.
temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") print("Done")
만약 프로그래머가 뜨겁지 않을 경우도 실행되기를 원하다면 else 문을 사용 하면 된다. else 문이 if 의 i와 어떻게 줄이 맞춰져 있는지 주목하라. if 구문 처럼 콜론(:)을 찍는 것도 주의 하라.
if...else 문의 경우, 코드 중 한 블록은 항상 실행된다. 조건문이 참-True이면 첫 번째 코드 블록이 실행되고, 거짓-False이면 두 번째 블록이 실행된다.
temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") else: print("It is not hot outside") print("Done")
else...if 구문을 함께 사용하여 여러개의 if 문이 연결되는 것도 가능하다. 파이썬에서는 elif 로 사용한다.
temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") elif temperature < 30: print("It is cold outside") else: print("It is not hot outside") print("Done")
아래 코드에서 사용자가 120도를 입력하더라도 “It is hot outside”가 출력된다. 왜 그런가? 코드는 어떻게 수정되어야 하는가?
잘 모르겠다면 비디오를 보라.
temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") elif temperature > 110: print("Oh man, you could fry eggs on the pavement!") elif temperature < 30: print("It is cold outside") else: print("It is ok outside") print("Done")
3.6 문자 비교
텍스트(Text)를 체크하기 위해서 if 문을 사용하는 것이 가능하다.
user_name = input("What is your name? ") if user_name == "Paul": print("You have a nice name.") else: print("Your name is ok.")
앞의 예제는 단순히 사용자가 입력한 이름이 “Paul”과 일치 하는지 확인 한다. 만약 “paul” 이나 “PAUL”이라고 입력하면 동작하지 않는다.
비교할 문자열 앞뒤에 따옴표를 빼먹는 실수를 흔히 한다. 아래 예제에서, 컴퓨터는 Paul 을 값을 저장하는 변수라고 생각한다. 변수 Paul에 무엇이 저장되어 있는지 모르기 때문에 에러를 낼 것이다..
user_name = input("What is your name? ") if user_name == Paul: # This does not work because quotes are missing print("You have a nice name.") else: print("Your name is ok.")
3.6.1 다중 비교도 가능하다
여러개의 문자열들을 비교 할 때는 매 번 변수를 사용해야 한다는 것을 기억하라. 아래 예를 보라:
# 이 코드는 제대로 동작하지 않는다! 항상 참이 될 것이다. if user_name == "Paul" or "Mary":
대신에 다음과 같이 작성해 보라 :
# 이 코드는 제대로 동작 한다. if user_name == "Paul" or user_name == "Mary":
이유는 0이 아닌 모든 값은 컴퓨터가 True으로 간주하기 때문이다. 컴퓨터에게 "Mary" 라고 하는 것은 True라고 하는 것과 똑같다. 그래서 if 문의 블록이 실행될 것 이다.
3.6.2 대소문자를 가리지 않는 비교
입력된 문자의 대소문자는 구분하지 않고 비교를 하고자 한다면, 가장 쉬운 방법은 전부 다 소문자로 바꿔서 비교하는 것이다. 이는 lower 명령으로 구현할 수 있다.
아래 예제는 사용자가 무엇을 입력하든 그 것을 소문자로 바꿔서 비교를 한다. 중요: 대문자를 갖고 있는 문자열과는 비교하지 말라. 사용자가 입력한 문자가 소문자로 변환되는데 그것을 대문자가 있는 문자열과 비교한다면 일치하는 경우는 나오지 않게 될 것이기 때문이다.
user_name = input("What is your name? ") if user_name.lower() == "paul": print("You have a nice name.") else: print("Your name is ok.")
3.7 if 문 예제
아래 일련의 코드들은 우리가 지금까지 이야기한 개념을 통해 동작한다. 온라인비디오는 코드를 한 줄 씩 따라가면서 어떻게 동작하는지를 설명해 준다.
비디오에서는 이클립스(Eclipse)라고 부르는 통합개발환경(integrated development editor, IDE)를 사용하였다.
이클립스의 기본 버젼은 파이썬이 동작하지 않지만, PyDev버젼은 작동한다.
PyDev 에디터는 무료로 받을 수 있다:
http://pydev.org/
에디터는 복잡해 보이지만 다양한 기능들을 가지고 있는 강력한 개발 환경이다. 일부 개발자들은 PyDev와 같은 개발 환경 사용을 선호하는데 이유는 많은 plug-in들을 설치 할 수 있고 이러한 플러그인들은 거의 모든 필요한 기능을 지원한다. 반면에 또 다른 개발자들은 다양한 기능이 없는 단순한 개발 환경을 선호하기도 한다.
# Sample Python/Pygame Programs # Simpson College Computer Science # http://programarcadegames.com/ # http://simpson.edu/computer-science/ # Explanation video: http://youtu.be/pDpNSck2aXQ # Variables used in the example if statements a = 4 b = 5 c = 6 # Basic comparisons if a < b: print("a is less than b") if a > b: print("a is greater than than b") if a <= b: print("a is less than or equal to b") if a >= b: print("a is greater than or equal to b") # NOTE: It is very easy to mix when to use == and =. # Use == if you are asking if they are equal, use = # if you are assigning a value. if a == b: print("a is equal to b") # Not equal if a != b: print("a and b are not equal") # And if a < b and a < c: print("a is less than b and c") # Non-exclusive or if a < b or a < c: print("a is less than either b or c (or both)") # Boolean data type. This is legal! a = True if a: print("a is true") if not a: print("a is false") a = True b = False if a and b: print("a and b are both true") a = 3 b = 3 c = a == b print(c) # These are also legal and will trigger as being true because # the values are not zero: if 1: print("1") if "A": print("A") # This will not trigger as true because it is zero. if 0: print("Zero") # Comparing variables to multiple values. # The first if statement appears to work, but it will always # trigger as true even if the variable a is not equal to b. # This is because "b" by itself is considered true. a = "c" if a == "B" or "b": print("a is equal to b. Maybe.") # This is the proper way to do the if statement. if a == "B" or a == "b": print("a is equal to b.") # Example 1: If statement temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") print("Done") # Example 2: Else statement temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") else: print("It is not hot outside") print("Done") # Example 3: Else if statement temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") elif temperature < 30: print("It is cold outside") else: print("It is not hot outside") print("Done") # Example 4: Ordering of statements # Something with this is wrong. What? temperature = int(input("What is the temperature in Fahrenheit? ")) if temperature > 90: print("It is hot outside") elif temperature > 110: print("Oh man, you could fry eggs on the pavement!") elif temperature < 30: print("It is cold outside") else: print("It is ok outside") print("Done") # Comparisons using string/text # Note, this example does not work when running under Eclipse # because the input will contain an extra carriage return at the # end. It works fine under IDLE. userName = input("What is your name? ") if userName == "Paul": print("You have a nice name.") else: print("Your name is ok.")
3.8 Review
3.8.1 Multiple Choice Quiz
Click here for a multiple-choice quiz.
3.8.2 Short Answer Worksheet
Click here for the chapter worksheet.
3.8.3 Lab
Click here for the chapter lab.
You are not logged in. Log in here and track your progress.
English version by Paul Vincent Craven
Spanish version by Antonio Rodríguez Verdugo
Russian version by Vladimir Slav
Turkish version by Güray Yildirim
Portuguese version by Armando Marques Sobrinho and Tati Carvalho
Dutch version by Frank Waegeman
Hungarian version by Nagy Attila
Finnish version by Jouko Järvenpää
French version by Franco Rossi
Korean version by Kim Zeung-Il
Chinese version by Kai Lin