콘텐츠로 이동

03. 제어문 (선택과 반복)

"코드는 기본적으로 위에서 아래로 흐릅니다. 하지만 가끔은 갈림길(if)을 만나기도 하고, 쳇바퀴(loop)를 돌기도 합니다."

1. 조건문 (if) - 갈림길

상황(조건)에 따라 다른 코드를 실행하고 싶을 때 사용합니다. 파이썬에서 들여쓰기(Indentation)는 선택이 아니라 생명입니다! (보통 스페이스 4칸)

graph TD
    Start(("시작")) --> Check{"점수가 90점 이상?"}
    Check -- Yes --> A["A학점 출력"]
    Check -- No --> Check2{"80점 이상?"}
    Check2 -- Yes --> B["B학점 출력"]
    Check2 -- No --> C["재수강 출력"]

    style Check fill:#fff9c4,stroke:#fbc02d
    style Check2 fill:#fff9c4,stroke:#fbc02d
score = 85

if score >= 90:
    print("A학점")
elif score >= 80:
    print("B학점")
else:
    print("재수강")

2. 반복문 (Loop) - 쳇바퀴

for 문 (범위 반복)

"~에 있는 것들을 하나씩 꺼내면서" 반복합니다.

1) 리스트에 있는 것 꺼내기

fruits = ["사과", "바나나", "포도"]

for fruit in fruits:
    print(f"나는 {fruit}를 좋아해")

2) 횟수로 반복하기 (range)

리스트가 없어도 "그냥 5번 반복해!"라고 시킬 때는 range()를 씁니다.

# 0부터 4까지 (5번) 반복
for i in range(5):
    print(f"{i}번째 반복 중...")

while 문 (조건 반복)

"~인 동안 계속" 반복합니다. 언제 끝날지 모를 때 씁니다.

graph TD
    Start(("시작")) --> Check{"체력이 남았나?"}
    Check -- Yes --> Hit["체력 감소"]
    Hit --> Check
    Check -- No --> End(("게임 오버"))

    style Check fill:#e1f5fe,stroke:#01579b
hp = 100

while hp > 0:
    print(f"현재 체력: {hp}")
    hp = hp - 10  # 체력 감소

print("게임 오버")

무한 루프(Infinite Loop) 조심

while 문을 쓸 때는 반드시 끝나는 조건을 만들어줘야 합니다. hp가 줄어들지 않는다면, 컴퓨터는 지치지 않고 영원히 체력을 출력하다가 멈출 것입니다. (강제 종료: Ctrl + C)

3. 반복문 제어 (리모컨)

반복문을 돌다가 멈추거나 건너뛰고 싶을 때 씁니다.

  • break: 탈출! 반복문을 즉시 끝냅니다. (예: 범인 찾았으면 수색 종료)
  • continue: 패스! 이번 순서만 건너뛰고 다음 순서로 넘어갑니다. (예: 3, 6, 9 게임에서 박수치기)

4. enumerate (번호표 붙이기)

반복문 돌 때 "내용물" 뿐만 아니라 "몇 번째(번호표)"인지도 필요할 때가 많습니다. 이때 count = 0 같은 변수를 따로 만들지 말고 enumerate를 쓰세요.

fruits = ["A", "B", "C"]

# i에는 번호, name에는 내용물이 들어갑니다
for i, name in enumerate(fruits):
    print(f"{i}번: {name}") 
# 결과 -> 0번: A, 1번: B...

5. 예외 처리 (try-except) - 안전장치

프로그램이 실행 중에 에러가 나서 "뻑" 하고 죽는 것을 막고 싶을 때 씁니다. "에러가 날 것 같으면 미리 대비(try)하고, 실제로 에러가 나면 수습(except)해라"라는 뜻입니다.

graph TD
    Start(("시작")) --> Try["Try (시도)"]
    Try --> Check{"에러 발생?"}
    Check -- Yes --> Except["Except (수습)"]
    Check -- No --> Pass["계속 진행"]
    Except --> End(("종료"))
    Pass --> End

    style Check fill:#ffcdd2,stroke:#d32f2f
    style Except fill:#ffccbc,stroke:#d84315
try:
    # 에러가 날 수도 있는 위험한 코드
    result = 10 / 0
    print(f"결과는 {result}입니다.")
except ZeroDivisionError:
    # 에러가 났을 때 실행할 코드 (수습)
    print("0으로 나눌 수 없습니다! 1로 나눈 것으로 칠게요.")
    result = 10 / 1

print("프로그램이 죽지 않고 잘 끝났습니다.")

"완벽한 프로그램은 없습니다. 하지만 잘 수습하는 프로그램은 만들 수 있습니다."

AI와 협업 포인트: 의사코드(Pseudocode)

복잡한 제어문(if가 겹치고 for가 겹치는 상황)을 짤 때는 바로 코드를 쓰려 하지 마세요. AI에게 "사람의 말(의사코드)"로 먼저 로직을 설명하고 코드로 바꿔달라고 하세요.

> **프롬프트 예시:**
> "리스트를 10번 반복하는데, 만약 짝수면 출력하고 홀수면 넘어가고, 
> 5보다 크면 멈추는 로직을 짜줘."