파이썬(Python) 공부 4편
조건문 if / elif / else 완전 정복
프로그램이 상황에 따라 다르게 동작하려면 조건문이 필요합니다. "점수가 90점 이상이면 A등급, 80점 이상이면 B등급…" 같은 분기 처리가 바로 조건문입니다. 비교·논리 연산자부터 중첩 조건문, 삼항 연산자, Python 3.10에서 추가된 match-case까지 한 번에 정리합니다.
💡 조건문이란 — 프로그램에 '분기'를 만드는 도구
조건문은 특정 조건이 참(True)인지 거짓(False)인지에 따라 실행할 코드를 선택하는 구조입니다. 파이썬의 조건문은 if, elif, else 세 키워드로 구성됩니다.
⚖ 비교 연산자 — 조건식의 재료
조건문의 조건식에는 비교 연산자가 사용됩니다. 비교 연산자의 결과는 항상 True 또는 False입니다.
| 연산자 | 의미 | 예시 | 결과 |
|---|---|---|---|
| == | 같다 (등호 두 개) | 5 == 5 | True |
| != | 다르다 | 5 != 3 | True |
| > | 크다 | 10 > 5 | True |
| < | 작다 | 3 < 1 | False |
| >= | 크거나 같다 | 5 >= 5 | True |
| <= | 작거나 같다 | 3 <= 2 | False |
| is | 동일한 객체인가 (정체성 비교) | x is None | True/False |
| is not | 다른 객체인가 | x is not None | True/False |
| in | 포함 여부 | "a" in "abc" | True |
| not in | 미포함 여부 | "z" not in "abc" | True |
- = → 대입 연산자: 오른쪽 값을 왼쪽 변수에 넣는다 (x = 10)
- == → 비교 연산자: 두 값이 같은지 비교한다 (x == 10 → True/False)
- 조건문에서 =를 쓰면 SyntaxError가 발생합니다
🔄 논리 연산자 — 조건을 여러 개 연결하기
| 연산자 | 의미 | 예시 | 결과 |
|---|---|---|---|
| and | 모두 True일 때만 True | True and False | False |
| or | 하나라도 True면 True | True or False | True |
| not | True ↔ False 반전 | not True | False |
age = 25 salary = 3000000 has_job= True # and — 두 조건 모두 만족 if age >= 20 and salary >= 2000000: print("대출 가능") # or — 하나라도 만족 if age < 18 or age > 65: print("할인 대상") else: print("정상 가격") # not — 조건 반전 if not has_job: print("취업 준비 중") # 연산자 우선순위: not > and > or # 복잡한 경우 괄호로 명확히 표현 if (age >= 20 and has_job) or salary > 5000000: print("우대 조건 충족")
🌟 if / elif / else — 기본 구조와 들여쓰기 규칙
파이썬은 중괄호({}) 대신 들여쓰기로 코드 블록을 구분합니다. 일반적으로 스페이스 4칸을 사용하며, 같은 블록 안의 코드는 동일하게 들여써야 합니다. 들여쓰기가 맞지 않으면 IndentationError가 발생합니다.
- if 조건식: 끝에 콜론(:) 필수
- 조건이 True일 때 실행할 코드는 반드시 들여쓰기해야 함
- elif와 else는 선택 사항 — 필요한 만큼만 사용
# ① if만 사용 x = 10 if x > 0: print("양수입니다") # 스페이스 4칸 들여쓰기 # ② if - else age = 17 if age >= 18: print("성인입니다") else: print("미성년자입니다") # 미성년자입니다 # ③ if - elif - else (가장 자주 사용) score = 85 if score >= 90: print("A학점") elif score >= 80: print("B학점") # ← 이 줄이 실행됨 elif score >= 70: print("C학점") else: print("D학점 이하") # B학점
elif는 필요한 만큼 추가할 수 있습니다. 단, 조건은 위에서부터 순서대로 검사하며 처음으로 True가 되는 블록만 실행하고 나머지는 건너뜁니다. 순서가 중요합니다.
📋 다양한 조건 표현 — 실무에서 자주 쓰는 패턴
# ① 범위 조건 — and 대신 파이썬 스타일 체이닝 score = 75 if 70 <= score < 80: # 파이썬 전용 — 수학처럼 표현 print("C학점") # 위는 (70 <= score) and (score < 80) 과 동일 # ② in / not in 조건 fruits = ["apple", "banana", "cherry"] if "apple" in fruits: print("사과가 있습니다") # 실행됨 lang = "Python" if lang not in ["Java", "C++"]: print("Java/C++이 아닙니다") # ③ Truthy / Falsy 조건 — 0, "", None, [], {} 는 False name = "" if name: # 빈 문자열은 False print(f"안녕, {name}") else: print("이름이 없습니다") # 실행됨 items = [] if not items: # 빈 리스트는 False → not False = True print("목록이 비었습니다") # ④ is / is not — None 비교 시 권장 result = None if result is None: # == 보다 is 사용 권장 print("결과가 없습니다")
🕐 중첩 조건문 — if 안에 if
age = 25 has_id = True is_vip = False # 중첩 조건문 if age >= 18: print("성인 확인") if has_id: # 안쪽 if print("신분증 확인됨") if is_vip: # 더 안쪽 if print("VIP 입장") else: print("일반 입장") # ← 실행됨 else: print("신분증 없음, 입장 불가") else: print("미성년자, 입장 불가") # 출력: 성인 확인 / 신분증 확인됨 / 일반 입장
중첩 조건문이 3단계 이상 깊어지면 코드 가독성이 급격히 떨어집니다. 가능하면 and 연산자로 하나의 조건문으로 합치거나, 이른 반환(Early Return) 패턴을 활용하는 것이 좋습니다.
# 깊은 중첩 → 평탄화 if age >= 18 and has_id and not is_vip: print("일반 입장")
⚡ 삼항 연산자 — 한 줄로 if-else 표현하기
파이썬의 삼항 연산자(조건 표현식)는 값A if 조건 else 값B 형태입니다. 조건이 True면 값A, False면 값B를 반환합니다. 간단한 if-else를 한 줄로 줄일 때 유용합니다.
# 일반 if-else score = 75 if score >= 60: result = "합격" else: result = "불합격" # 삼항 연산자로 한 줄에 result = "합격" if score >= 60 else "불합격" print(result) # 합격 # f-string 안에서도 사용 가능 age = 20 print(f"당신은 {'성인' if age >= 18 else '미성년자'}입니다.") # 당신은 성인입니다. # 절댓값 구하기 n = -5 abs_n = n if n >= 0 else -n print(abs_n) # 5
- 간단한 경우에만 사용 — 복잡한 조건을 삼항으로 쓰면 오히려 가독성이 떨어짐
- 삼항 연산자를 중첩하는 것은 권장하지 않음 → 일반 if-elif-else로 작성하는 것이 명확
🔒 pass — 아무것도 하지 않는 키워드
파이썬에서 코드 블록은 반드시 최소 한 줄 이상의 코드가 있어야 합니다. 조건문 구조는 만들어두되 아직 내용을 채우지 않을 때 pass를 사용합니다.
score = 95 if score >= 90: pass # 나중에 내용 채울 예정 → 지금은 아무것도 안 함 else: print("90점 미만") # pass 없이 비워두면 → IndentationError 발생!
🆕 match-case — Python 3.10+ 구조적 패턴 매칭
Python 3.10에서 추가된 match-case는 다른 언어의 switch-case와 유사하지만 훨씬 강력한 구조적 패턴 매칭(Structural Pattern Matching)을 지원합니다. 여러 값 중 하나를 선택하는 분기에서 elif 체인보다 가독성이 뛰어납니다.
# 기본 match-case command = "quit" match command: case "quit": print("프로그램을 종료합니다") # ← 실행됨 case "hello": print("안녕하세요!") case "help": print("도움말을 표시합니다") case _: # _ 는 default (else 역할) print("알 수 없는 명령어") # 여러 값 한 번에 매칭 (| 사용) status = 404 match status: case 200 | 201: print("성공") case 400: print("잘못된 요청") case 404: print("찾을 수 없음") # ← 실행됨 case 500: print("서버 오류") case _: print("기타 상태 코드")
- elif 체인: 조건이 범위 비교(>=, <=), 복합 조건(and/or) 등인 경우
- match-case: 하나의 변수가 특정 값들 중 하나인지 비교할 때 / Python 3.10+ 환경에서 권장
- Python 버전을 확인하고 사용: python --version
💻 실전 예제 — 학점 계산기 완성
# 학점 계산기 — 조건문 총복습 score = 83 # 입력값 검증 if not (0 <= score <= 100): print("점수는 0~100 사이여야 합니다") else: # 학점 계산 if score >= 95: grade = "A+" elif score >= 90: grade = "A" elif score >= 85: grade = "B+" elif score >= 80: grade = "B" # ← 83점이므로 여기 실행 elif score >= 75: grade = "C+" elif score >= 70: grade = "C" elif score >= 60: grade = "D" else: grade = "F" # 결과 출력 pass_fail = "합격" if score >= 60 else "불합격" print(f"점수: {score}점 | 학점: {grade} | {pass_fail}") # 점수: 83점 | 학점: B | 합격
📝 4편 실습 문제
- 월(month) 변수를 입력받아 계절을 출력하는 조건문 작성
- 3~5월 → 봄, 6~8월 → 여름, 9~11월 → 가을, 12·1·2월 → 겨울
- 1~12 범위 밖의 값 → "잘못된 월입니다" 출력
- 두 수 a, b를 비교해 큰 값을 삼항 연산자로 구하기
- 어떤 수가 짝수인지 홀수인지 삼항 연산자로 판별하기 (힌트: % 2 == 0)
# 실습 1 — 계절 판별기 month = 7 if not (1 <= month <= 12): print("잘못된 월입니다") elif month in [3, 4, 5]: print("봄") elif month in [6, 7, 8]: print("여름") # ← month=7이므로 실행 elif month in [9, 10, 11]: print("가을") else: # 12, 1, 2 print("겨울") # 실습 2 — 삼항 연산자 a, b = 10, 25 bigger = a if a > b else b print(f"큰 값: {bigger}") # 큰 값: 25 n = 7 parity = "짝수" if n % 2 == 0 else "홀수" print(f"{n}은 {parity}입니다") # 7은 홀수입니다
- 비교 연산자: == != > < >= <= / is / is not / in / not in
- 논리 연산자: and(모두 True) / or(하나라도 True) / not(반전) — 우선순위: not > and > or
- 기본 구조: if 조건: 콜론 필수 / 들여쓰기 4칸 / elif·else는 선택
- 범위 체이닝: 70 <= score < 80 — 파이썬 전용 수학적 표현
- Truthy/Falsy: 0, "", None, [], {} → False / 나머지 → True
- 중첩 조건문: if 안에 if / 너무 깊어지면 and로 평탄화 권장
- pass: 블록 내용을 나중에 채울 때 — 빈 블록 오류 방지
- 삼항 연산자: 값A if 조건 else 값B — 간단한 if-else를 한 줄로
- match-case: Python 3.10+ / 특정 값 비교 분기에서 elif 체인 대안
range() / break / continue / else절 / 중첩 반복문 / enumerate / zip