if/elif/else의 실행 원리를 이해하고 조건 설계의 모범 사례를 배운다.
🎯 이 강의에서 배우는 것
프로그램이 결정을 내리는 방법 — 그것이 조건문입니다. 파이썬의 조건문은 들여쓰기로 블록을 정의하는 독특한 철학을 가집니다. if/elif/else의 정확한 실행 모델부터, 코드를 단순하게 만드는 가드 클로즈 패턴, Python 3.10의 구조적 패턴 매칭(match-case)까지 배웁니다.
🧠 들여쓰기가 블록을 정의하는 이유
C, Java, JavaScript는 중괄호 {}로 블록을 정의합니다. 파이썬은 들여쓰기(indentation)로 블록을 정의합니다. 코드의 시각적 구조가 논리적 구조와 일치해야 한다는 설계 철학입니다.
temperature = 28
if temperature >= 30:
print("덥다!")
print("에어컨 켜기")
elif temperature >= 20:
print("따뜻하다")
print("창문 열기")
elif temperature >= 10:
print("선선하다")
print("가벼운 외투 필요")
else:
print("춥다!")
print("두꺼운 외투 필요")
print("날씨 체크 완료") # 항상 실행
들여쓰기 표준: PEP 8은 스페이스 4개를 권장합니다. 탭과 스페이스를 혼용하면 TabError가 발생합니다. VS Code, PyCharm 등 현대 IDE는 기본적으로 탭 키를 스페이스 4개로 변환합니다.
🏗️ if 문의 실행 모델
# 실행 흐름 정밀 분석
x = 5
if x > 10: # 평가: False → 이 블록 건너뜀
print("10 초과")
elif x > 3: # 평가: True → 이 블록 실행
print("3 초과 10 이하") # 실행됨
elif x > 0: # 이 조건은 평가조차 안 됨!
print("0 초과 3 이하") # 실행 안 됨
else:
print("0 이하") # 실행 안 됨
# 핵심: 첫 번째 True 조건의 블록만 실행됨
# 나머지 조건들은 평가하지 않음 (단락 평가와 유사)
💡 조건 표현식 (삼항 연산자)
age = 17
status = "성인" if age >= 18 else "미성년자"
print(status) # 미성년자
# 함수 반환에 사용
def classify(score):
return "합격" if score >= 60 else "불합격"
# 기본값 설정
user_input = ""
display_name = user_input if user_input else "손님"
# 중첩 조건 표현식 (3단계 이상이면 가독성 저하)
score = 75
grade = "A" if score >= 90 else "B" if score >= 80 else "C" if score >= 70 else "F"
# 이런 경우는 if-elif-else를 쓰는 것이 더 명확
🛡️ 가드 클로즈 패턴 (Guard Clause)
함수 초반에 예외 상황을 먼저 처리하고 early return하는 패턴입니다. 화살촉 코드(arrow code)를 평탄하게 만듭니다:
# 나쁜 예: 깊은 중첩 (arrow code / hadouken code)
def process_user_bad(user):
if user is not None:
if user.get("is_active"):
if user.get("age", 0) >= 18:
return f"{user['name']}님 처리 완료"
else:
return "미성년자"
else:
return "비활성 계정"
else:
return "사용자 없음"
# 좋은 예: 가드 클로즈 패턴 (Guard Clause)
def process_user(user):
if user is None: # 가드 1: 즉시 종료
return "사용자 없음"
if not user.get("is_active"): # 가드 2: 즉시 종료
return "비활성 계정"
if user.get("age", 0) < 18: # 가드 3: 즉시 종료
return "미성년자"
# 이 아래: 모든 가드를 통과한 정상 케이스
return f"{user['name']}님 처리 완료"
🎯 match-case: 구조적 패턴 매칭 (Python 3.10+)
command = "go north"
match command.split():
case ["quit"]:
print("게임 종료")
case ["go", direction]: # 변수 캡처
print(f"{direction} 방향으로 이동")
case ["pick", "up", item]:
print(f"{item} 획득")
case ["drop", *items]: # * 로 나머지 캡처
print(f"버린 아이템: {items}")
case _: # 기본값 (wildcard)
print("모르는 명령")
# HTTP 상태 코드 분기
status_code = 404
match status_code:
case 200 | 201 | 204: # | 로 여러 값 매칭
msg = "성공"
case 400:
msg = "잘못된 요청"
case 401 | 403:
msg = "인증/인가 오류"
case 404:
msg = "찾을 수 없음"
case 500:
msg = "서버 오류"
case _ if status_code >= 400: # 가드 조건
msg = f"기타 오류 ({status_code})"
case _:
msg = "알 수 없음"
print(msg)
🔍 조건 단순화 원칙
# 불필요한 비교 제거
is_valid = True
# 나쁜 예
if is_valid == True:
print("유효")
# 좋은 예
if is_valid:
print("유효")
# 드모르간 법칙 활용
# not (A and B) == not A or not B
# not (A or B) == not A and not B
# 복잡한 조건 → 설명적 변수로 분리
age = 25
income = 50000
credit_score = 750
# 복잡한 인라인 조건 (읽기 어려움)
if age >= 20 and income >= 30000 and credit_score >= 700:
approve_loan()
# 설명적 변수로 분리 (읽기 쉬움)
is_adult = age >= 20
has_sufficient_income = income >= 30000
has_good_credit = credit_score >= 700
if is_adult and has_sufficient_income and has_good_credit:
approve_loan()
⚠️ 자주 하는 실수
- = 와 == 혼동:
if x = 5:는 SyntaxError. 비교는 반드시==. - 들여쓰기 일관성 없음: 탭과 스페이스 혼용 금지. 스페이스 4개로 통일.
- else 없이 if만 사용: 모든 조건이 False면 암묵적으로 None이 반환됩니다. 의도적이지 않으면 else를 명시하거나 가드 클로즈를 사용하세요.
📝 정리 및 다음 강의 예고
- 파이썬의 들여쓰기는 선택이 아닌 문법입니다. 스페이스 4개를 사용하세요.
- 가드 클로즈 패턴으로 중첩을 줄이고 코드를 평탄하게 만드세요.
- Python 3.10+의 match-case는 복잡한 조건 분기를 우아하게 표현합니다.
다음 강의: while 루프의 정확한 실행 모델과 루프 불변식(loop invariant) 개념으로 올바른 루프를 설계하는 방법을 배웁니다.
관련 주제
- if/elif/else 실행흐름
- 들여쓰기 블록 구조
- 조건 표현식(삼항연산자)
- 가드 클로즈 패턴
- match-case 패턴매칭
- 매직넘버 제거
- 개발·프로그래밍
- 개발·프로그래밍 강의
- 파이썬 기초 40강 — 처음 배우는 프로그래밍
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
댓글
0/1000
불러오는 중...
