07. 조건문

🎯 이 장의 목표
  • if/elif/else로 상황에 따라 다른 코드를 실행한다.
  • Python의 들여쓰기 규칙(코드 블록)을 이해한다.
  • in 키워드로 포함 여부를 조건에 활용한다.
  • 5장의 Truthy/Falsy를 조건문에서 파이썬답게 쓴다.

갈림길에서 길 고르기

지금까지 코드는 위에서 아래로 한 줄씩 차례대로 실행됐습니다. 하지만 진짜 프로그램은 상황에 따라 다르게 행동해야 합니다. "비가 오면 우산을 챙기고, 아니면 그냥 나간다"처럼요.

이 갈림길을 만드는 것이 조건문입니다. 5장에서 배운 불리언(True/False)이 여기서 빛을 발합니다.

PYTHON
age = 20
if age >= 18:
    print("입장 가능합니다")
# 출력: 입장 가능합니다

if 뒤의 조건(age >= 18)이 True이면 아래 들여쓴 코드를 실행하고, False이면 건너뜁니다.

flowchart TD
    Start([시작]):::start --> Cond{"age >= 18 ?"}:::proc
    Cond -->|True| Do["'입장 가능' 출력"]:::result
    Cond -->|False| Skip["아무것도 안 함"]:::data
    Do --> End([계속])
    Skip --> End

    classDef start fill:#fff3b0,stroke:#e0a800,color:#5c4500
    classDef proc fill:#7fd8d8,stroke:#2a9d8f,color:#14532d
    classDef result fill:#b8e6c1,stroke:#34a853,color:#14532d
    classDef data fill:#a8dadc,stroke:#457b9d,color:#1d3557

⭐ 들여쓰기가 곧 문법이다

많은 언어가 코드 묶음을 중괄호 { }로 표시하지만, Python은 들여쓰기(indentation)로 표시합니다. 이게 Python의 가장 큰 특징 중 하나입니다.

if 줄 끝에는 콜론 :을 붙이고, 그 조건이 참일 때 실행할 코드를 한 단계 들여씁니다. 들여쓰기는 보통 공백 4칸입니다.

PYTHON
if age >= 18:
    print("이 줄은 if에 속함")    # 들여쓴 줄
    print("이 줄도 if에 속함")    # 들여쓴 줄
print("이 줄은 if와 무관")        # 들여쓰기 없음 → 항상 실행
⚠️ 흔한 실수
입문자 최대의 함정 — 들여쓰기 오류: 들여쓰기를 빠뜨리거나 칸 수를 섞으면 에러가 납니다.
```python
if age >= 18:
print("입장") # 들여쓰기 없음!
```
```text
IndentationError: expected an indented block after 'if' statement on line 1
```
IndentationError는 "들여쓰기가 잘못됐다"는 뜻입니다. if, 다음에 올 for·def 등 콜론 :으로 끝나는 줄 다음에는 반드시 들여쓴 블록이 와야 합니다.
💡 팁
탭과 공백을 섞지 마세요. 눈에는 똑같아 보여도 Python은 다르게 봅니다. 에디터에서 "Tab을 공백으로 변환" 설정을 켜두면 안전합니다. 대부분의 에디터가 기본으로 공백 4칸을 넣어줍니다.

if – elif – else: 여러 갈래

조건이 여러 개일 때는 elif(else if의 줄임)와 else를 씁니다.

PYTHON
score = 75

if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
else:
    print("F")
# 출력: C

위에서부터 조건을 차례로 검사하다가 처음으로 참인 곳을 실행하고 나머지는 건너뜁니다. 어느 것도 참이 아니면 else를 실행합니다.

📌 핵심
핵심: if/elif위에서부터 순서대로 검사하고, 처음 참인 가지 하나만 실행한다. 그래서 조건의 순서가 중요하다.

순서가 왜 중요한지 봅시다. score = 95일 때 위 코드는 첫 번째 score >= 90에서 바로 "A"를 출력하고 멈춥니다. 만약 조건을 거꾸로(>= 70부터) 썼다면 95점도 "C"가 되어버립니다.

구조의미
if 조건:가장 먼저 검사. 참이면 실행하고 끝
elif 조건:앞이 거짓일 때 검사. 여러 개 가능
else:위 전부 거짓일 때 실행. 조건 없음. 생략 가능

조건 안에서 and/or/in

5장의 논리 연산자와 in을 조건에 그대로 쓸 수 있습니다.

PYTHON
age = 20
has_ticket = True

if age >= 18 and has_ticket:
    print("입장 가능")
# 출력: 입장 가능

in은 리스트·문자열·딕셔너리 등에 어떤 값이 들어 있는지 검사합니다.

PYTHON
fruits = ["사과", "배", "감"]
if "사과" in fruits:
    print("사과가 있습니다")        # 실행됨

command = input("명령: ")
if command in ["start", "stop", "restart"]:
    print("유효한 명령입니다")

중첩 조건문

조건문 안에 또 조건문을 넣을 수 있습니다(들여쓰기가 한 단계 더 깊어집니다).

PYTHON
age = 20
if age >= 18:
    print("성인입니다")
    if age >= 65:
        print("경로우대 대상입니다")
    else:
        print("일반 요금입니다")
# 출력:
# 성인입니다
# 일반 요금입니다
💡 팁
중첩이 깊어지면 읽기 어려워집니다. 가능하면 and로 합치거나(if age >= 18 and age < 65:) 구조를 단순하게 만드는 게 좋습니다.

⭐ 파이썬다운 조건문

5장에서 배운 Truthy/Falsy 덕분에, 비어 있는지 검사를 짧게 쓸 수 있습니다.

PYTHON
name = input("이름: ")

# ❌ 나쁜 예: 장황한 비교
if len(name) > 0:
    print(f"{name}님 환영합니다")
else:
    print("이름이 비어 있습니다")

# ✅ 좋은 예: name 자체가 Truthy/Falsy
if name:                      # 비어 있지 않으면 참
    print(f"{name}님 환영합니다")
else:
    print("이름이 비어 있습니다")

리스트가 비었는지도 마찬가지입니다.

PYTHON
items = []

# ❌ if len(items) == 0:
# ✅ 파이썬답게:
if not items:                 # 비어 있으면 참
    print("장바구니가 비었습니다")
📌 핵심
핵심: "비어 있나?"는 len(x) == 0 대신 if not x:, "뭔가 있나?"는 len(x) > 0 대신 if x:가 파이썬답다.

💡 삼항 표현식: 한 줄 조건

값을 둘 중 하나로 정할 때, if/else를 한 줄로 압축할 수 있습니다.

PYTHON
age = 20

# 일반적인 if/else
if age >= 18:
    status = "성인"
else:
    status = "미성년"

# 삼항 표현식 (같은 결과, 한 줄)
status = "성인" if age >= 18 else "미성년"
print(status)   # 성인

읽는 순서는 "age >= 18이면 "성인", 아니면 "미성년""입니다. 짧은 양자택일에만 쓰고, 복잡해지면 일반 if/else가 낫습니다.

이 장에서 배운 것

  • 조건문 if는 조건이 참일 때만 들여쓴 블록을 실행한다. 줄 끝에 콜론 :.
  • Python은 들여쓰기(공백 4칸)로 코드 블록을 표시한다. 빠뜨리면 IndentationError.
  • if/elif/else는 위에서부터 검사해 처음 참인 가지 하나만 실행한다. 순서가 중요하다.
  • 조건에 and/or/in을 조합한다. 비었는지 검사는 if not x:, 있는지는 if x:가 파이썬답다.
  • 짧은 양자택일은 삼항 표현식 A if 조건 else B로 한 줄에 쓴다.

🧪 실습 문제

문제 1. 숫자 하나를 입력받아 양수면 "양수", 0이면 "영", 음수면 "음수"를 출력하는 코드를 if/elif/else로 작성하세요.

문제 2. 다음 코드의 출력은? 그리고 왜 그런가요?

PYTHON
score = 95
if score >= 70:
    print("통과")
elif score >= 90:
    print("우수")

문제 3. 리스트 vip = ["민지", "현우"]가 있습니다. 입력받은 이름이 이 리스트에 있으면 "VIP 고객", 없으면 "일반 고객"을 출력하세요. (in 사용)

문제 4. 다음을 파이썬다운 방식으로 고치세요.

PYTHON
cart = []
if len(cart) == 0:
    print("비어 있음")

문제 5. 나이 age를 받아 삼항 표현식으로 "성인"/"미성년"을 정해 fee라는 변수에 담되, 성인은 12000, 미성년은 6000이 되도록 작성하세요.

<details>

<summary>✅ 정답·해설 보기</summary>

1.

PYTHON
n = int(input("숫자: "))
if n > 0:
    print("양수")
elif n == 0:
    print("영")
else:
    print("음수")

2. 통과. score가 95라서 첫 조건 score >= 70이 참이 되는 순간 "통과"를 출력하고 멈춥니다. elif score >= 90은 검사조차 되지 않습니다. 더 구체적인(엄격한) 조건을 위에 둬야 한다는 교훈입니다. >= 90을 먼저 검사하도록 순서를 바꿔야 "우수"가 나옵니다.

3.

PYTHON
vip = ["민지", "현우"]
name = input("이름: ")
if name in vip:
    print("VIP 고객")
else:
    print("일반 고객")

4.

PYTHON
cart = []
if not cart:
    print("비어 있음")

5.

PYTHON
age = int(input("나이: "))
fee = 12000 if age >= 18 else 6000
print(fee)

</details>

◀️ 이전 장: 06. 자료구조 | ▶️ 다음 장: 08. 반복문