조건에 따른 분기
조건이 없는 프로그램은 언제 실행해도 같은 줄을 같은 순서로 실행합니다.
갈림길이 없는 프로그램은 위에서 아래로 한 번 실행되고 끝납니다.
입력이 무엇이든 실행되는 줄이 같습니다. if는 여기에 갈림길을 놓습니다. 이처럼 조건에 따라 실행할 줄이 나뉘는 것을 분기(branch)라고 합니다.
score = 75
if score >= 60:
print("합격") # 합격
else:
print("불합격")읽는 순서
if뒤의 조건식을 계산한다 — 비교한 결과는 참 아니면 거짓이다.- 참이면 들여쓴 줄들을 실행하고
else쪽은 건너뛴다. - 거짓이면
else쪽만 실행한다.
둘 중 하나만 실행됩니다. else는 없어도 됩니다 —
그러면 조건이 거짓일 때 아무 일도 하지 않고 지나갑니다.
콜론을 빠뜨리기 쉽습니다
조건 끝의 :는 「여기부터 딸린 줄들이 시작된다」는 표시입니다.
빠뜨리면 SyntaxError가 납니다. if를 썼는데 오류가 나면
줄 끝에 콜론이 있는지부터 확인하세요.
경우가 셋 이상이면 elif로 이어 씁니다. 「else if」를 줄인 예약어입니다.
score = 85
if score >= 90:
print("A")
elif score >= 80:
print("B") # B 여기서 멈춘다
elif score >= 70:
print("C")
else:
print("D")위에서부터 검사하다가 「참인 첫 조건」에서 멈춥니다
85점은 score >= 80도 참이고 score >= 70도 참입니다.
그런데 B만 출력됩니다. 한 조건이 참이 되면 그 아래 조건은 검사하지 않기 때문입니다.
그래서 순서가 결과를 바꿉니다. 조건의 순서를 뒤집어 score >= 70을
맨 위에 두면 95점도 C가 되어 버립니다. 이처럼 한 조건이 다른 조건을 포함할 때는 좁은 조건부터 넓은 조건 순으로 놓아야 합니다.
year = int(input("연도를 입력하세요: "))
if year % 4 == 0 and year % 100 != 0:
print(year, "년은 윤년입니다")
elif year % 400 == 0:
print(year, "년은 윤년입니다")
else:
print(year, "년은 윤년이 아닙니다")윤년 판별은 윤년이 되는 경우를 두 조건으로 나누어 쓴 예입니다. 4의 배수이면서 100의 배수가 아니면 윤년이고, 100의 배수라도 400의 배수이면 윤년입니다. 두 조건은 동시에 참이 될 수 없으므로, 이 코드는 두 조건의 순서를 바꿔도 결과가 같습니다. 순서가 결과를 바꾸는 것은 등급 코드처럼 조건이 겹칠 때입니다. 2024와 2000은 윤년이고, 1900은 아닙니다.
스스로 확인
등급을 매기는 코드에서 score가 105일 때는 무엇이 출력될까요? 잘못된 값을 따로 처리하려면 어디에 무엇을 더해야 할까요?
들여쓰기도 문법입니다
파이썬에서는 줄 앞의 공백이 코드의 구조를 정합니다.
if에 딸리는 줄이 어디까지인지는 들여쓰기가 정합니다.
묶어 주는 괄호 같은 것이 따로 없습니다.
score = 40
if score >= 60:
print("합격")
print("수고했습니다") # 들여쓰기가 없으니 if와 「상관없이」 실행된다들여쓴 만큼만 딸립니다
print("수고했습니다")는 들여쓰지 않았으므로 조건과 상관없이 실행됩니다.
40점이어도 출력됩니다. 이것은 오류가 아니라 코드에 쓴 대로 실행된 결과입니다.
무엇을 조건 안에 넣고 무엇을 밖에 둘지는 들여쓰기로 정합니다.
반대로 아예 안 들여쓰면 「문법 오류」입니다
score = 40
if score >= 60:
print("합격") # IndentationError — 들여쓰지 않아 「문법 오류」가 난다
if 뒤에는 딸린 줄이 적어도 하나 있어야 합니다.
하나도 없으면 파이썬이 IndentationError를 알리고 한 줄도 실행하지 않습니다.
파이썬은 실행하기 전에 파일 전체의 문법을 먼저 검사하므로, 이 오류는 앞줄이 실행되기도 전에 발견됩니다.
조용히 지나가지 않는다는 점에서 오히려 다행인 실수입니다.
공백 네 개로 통일합니다
공백을 몇 개 넣어 들여쓸지는 정해져 있지 않습니다. 같은 단계에 있는 줄끼리 같기만 하면 됩니다. 그래도 공백 네 개가 널리 쓰이는 관례이니 그대로 따르는 편이 좋습니다.
탭과 공백을 섞지 마세요. 화면에는 똑같이 보이지만 파이썬은 둘을 다르게 해석하므로
눈으로는 찾기 어려운 오류(TabError 등)가 납니다.
편집기에서 「탭을 공백으로 바꾸기」를 켜 두면 이 문제 자체가 생기지 않습니다.
스스로 확인
if 안에서 아무것도 하지 않고 넘어가고 싶을 때는 어떻게 할까요? 빈 줄로 두면 오류가 나는데요.
조건이 여럿일 때
if 안에 if를 둘 수도 있고, 조건을 한 줄로 묶을 수도 있습니다.
if 안에 if를 또 쓸 수 있습니다. 이것을 중첩(nesting)이라고 합니다.
한 단계 들어갈 때마다 공백 네 개만큼 더 들여씁니다.
score = 85
attend = True
if attend:
if score >= 60:
print("합격") # 합격 두 단계 들여쓴 줄
else:
print("불합격")
else:
print("출석이 모자라 판정할 수 없습니다")같은 판정을 중첩하지 않고 쓸 수도 있습니다.
score = 85
attend = True
if attend and score >= 60: # 중첩하지 않고 and로 묶었다
print("합격") # 합격
else:
print("불합격이거나 출석 부족")둘은 같지 않습니다
합격 여부만 보면 결과가 같지만, 불합격인 경우를 구분하는 방식이 다릅니다.
중첩해 쓰면 「출석이 모자란 경우」와 「점수가 모자란 경우」를 따로 안내할 수 있고,
and로 묶으면 두 조건이 하나의 조건식이 되어 이유를 나눌 수 없습니다.
이유를 나눌 필요가 없으면 묶는 편이 읽기 쉽습니다. 중첩이 깊어질수록 코드가 오른쪽으로 밀리므로, 두 단계를 넘으면 대개 읽기 어려워집니다.
스스로 확인
출석이 모자랄 때와 점수가 모자랄 때 서로 다른 안내 문구를 출력하려면, 두 방식 가운데 어느 쪽을 골라야 할까요?
참으로 보는 것과 거짓으로 보는 것
조건에 꼭 비교식만 오는 것은 아닙니다.
if 뒤에는 참·거짓이 아닌 값도 놓을 수 있습니다.
그러면 파이썬이 그 값을 참과 거짓 가운데 어느 쪽으로 볼지 판정합니다.
name = input("이름을 입력하세요: ")
if name: # 빈 문자열은 「거짓」으로 본다
print(name, "님 반갑습니다")
else:
print("이름을 입력하지 않았습니다")| 거짓으로 보는 것 | 참으로 보는 것 |
|---|---|
0, 0.0 |
0이 아닌 모든 수 — 음수도 참이다 |
"" 빈 문자열 |
글자가 하나라도 있는 문자열 — "0"도 참이다 |
False |
True |
"0"은 참입니다
따옴표로 묶는 순간 「글자 0 하나로 된 문자열」이 되기 때문입니다.
input으로 입력받은 값은 언제나 문자열이므로,
「0을 입력했는지」를 확인하려면 숫자로 변환해 비교해야 합니다.
고르는 것이 실행할 줄이 아니라 값 하나일 때는 한 줄로 쓸 수 있습니다. 이것을 조건 표현식(conditional expression)이라고 합니다.
score = 75
result = "합격" if score >= 60 else "불합격" # 줄이 아니라 「값」을 고른다
print(result) # 합격
「참일 때 값, 조건, 거짓일 때 값」 순서로 씁니다.
짧아서 편하지만 중첩하면 금세 읽기 어려워지므로, 그럴 때는 if 문으로 풀어 씁니다.
스스로 확인
if score:라고 쓰면 학생의 점수가 0점일 때 어느 쪽이 실행될까요? 이것이 왜 위험한 조건일까요?
핵심 정리
if · elif · else
위에서부터 검사하다가 참인 첫 조건에서 멈춘다. 조건이 겹치면 순서가 결과를 바꾸므로 좁은 조건을 위에 놓는다. 줄 끝의 콜론을 빠뜨리지 않는다.
들여쓰기가 문법
들여쓴 만큼만 조건에 딸린다. 딸린 줄이 하나도 없으면 IndentationError다.
공백 네 개로 맞추고 탭과 섞지 않는다.
중첩과 묶기
중첩하면 불합격 이유를 나눌 수 있고, and로 묶으면
하나의 조건식이 된다. 이유를 나눌 필요가 없으면 묶는 편이 읽기 쉽다.
참으로 보는 값
숫자와 문자열 가운데서는 0과 빈 문자열이 거짓, 나머지는 참이다.
"0"은 참이므로 입력값을 확인할 때는 숫자로 변환해 비교한다.
확인 퀴즈
배운 내용을 확인해 봅시다.
1. score가 95일 때, 조건을 score >= 70 → score >= 80 →
score >= 90 순으로 elif를 이어 쓰면?
2. if 다음 줄을 들여쓰지 않으면?
3. 다음 중 조건으로 쓸 때 거짓으로 보는 것은?