08. 반복문

🎯 이 장의 목표
  • for로 컬렉션의 모든 항목을 하나씩 처리한다.
  • range()로 원하는 횟수만큼 반복한다.
  • while로 조건이 참인 동안 반복한다.
  • break·continue로 반복을 제어하고, enumerate()를 파이썬답게 쓴다.

같은 일을 반복하기

"학생 30명에게 한 명씩 인사하기"를 print() 30번으로 쓴다면 끔찍하겠죠. 반복문(loop)은 같은 작업을 자동으로 되풀이합니다.

Python의 반복문은 두 종류입니다.

반복문언제 쓰나한 줄 요약
for횟수가 정해져 있거나 컬렉션을 훑을 때"이 목록의 각 항목에 대해…"
while조건이 참인 동안 계속할 때"이 조건이 만족되는 한 계속…"

for 반복문: 항목을 하나씩

for는 리스트·문자열 같은 컬렉션의 항목을 하나씩 꺼내 처리합니다.

PYTHON
fruits = ["사과", "배", "감"]
for fruit in fruits:
    print(f"{fruit}를 먹습니다")
# 출력:
# 사과를 먹습니다
# 배를 먹습니다
# 감를 먹습니다

읽는 법: "fruits의 각 항목을 fruit에 담아, 하나씩, 블록을 실행하라". fruit은 우리가 정한 이름으로, 반복마다 다음 항목으로 바뀝니다.

flowchart LR
    List["['사과','배','감']"]:::data --> Loop{"다음 항목<br/>있나?"}:::proc
    Loop -->|사과| Body["fruit = '사과'<br/>→ 블록 실행"]:::result
    Body --> Loop
    Loop -->|배| Body
    Loop -->|감| Body
    Loop -->|없음| End([반복 끝]):::start

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

문자열도 컬렉션이라 한 글자씩 순회됩니다.

PYTHON
for ch in "abc":
    print(ch)
# a
# b
# c

range(): 정해진 횟수만큼

"5번 반복" 같은 경우엔 range()를 씁니다. range(n)0부터 n-1까지의 숫자를 만들어냅니다.

PYTHON
for i in range(5):
    print(i)
# 0
# 1
# 2
# 3
# 4
⚠️ 흔한 실수
흔한 함정: range(5)는 0,1,2,3,4 — 즉 5는 포함하지 않습니다. 4장 슬라이싱에서 본 "끝 미포함" 규칙과 똑같습니다. 횟수는 5번이 맞지만, 값은 0부터 시작해 4에서 끝납니다.

range는 시작값과 간격도 정할 수 있습니다.

형태의미만들어지는 값
range(5)0부터 5 전까지0,1,2,3,4
range(1, 6)1부터 6 전까지1,2,3,4,5
range(0, 10, 2)0부터 10 전까지 2씩0,2,4,6,8
PYTHON
for i in range(1, 6):
    print(i, end=" ")     # 1 2 3 4 5
print()

for i in range(0, 10, 2):
    print(i, end=" ")     # 0 2 4 6 8
💡 팁
단순히 "n번 반복"하고 반복 변수를 안 쓸 거라면 관습적으로 _(밑줄)를 이름으로 씁니다.
```python
for _ in range(3):
print("삡!") # 변수를 안 쓸 땐 _
```

⭐ enumerate(): 번호와 값을 동시에

"목록을 번호와 함께" 출력하고 싶을 때가 많습니다. 인덱스를 직접 관리하는 것보다 enumerate()가 파이썬답습니다.

PYTHON
fruits = ["사과", "배", "감"]

# ❌ 나쁜 예: 인덱스를 손으로 관리
i = 0
for fruit in fruits:
    print(f"{i}: {fruit}")
    i += 1

# ✅ 좋은 예: enumerate가 번호를 알아서
for i, fruit in enumerate(fruits):
    print(f"{i}: {fruit}")
# 0: 사과
# 1: 배
# 2: 감

enumerate()(번호, 값) 쌍을 내놓고, 6장의 언패킹으로 i, fruit에 동시에 받습니다. 번호를 1부터 시작하려면 enumerate(fruits, start=1)을 씁니다.

📌 핵심
핵심: 반복하며 번호가 필요하면 i = 0; i += 1 대신 enumerate()를 써라.

딕셔너리 순회

6장에서 예고한 .items()가 여기서 빛납니다. 키와 값을 동시에 훑습니다.

PYTHON
person = {"name": "민지", "age": 25, "city": "서울"}

for key, value in person.items():
    print(f"{key}: {value}")
# name: 민지
# age: 25
# city: 서울

.items() 없이 그냥 for key in person:을 돌리면 키만 나옵니다. 값까지 필요하면 .items() + 언패킹이 정석입니다.

while 반복문: 조건이 참인 동안

while은 횟수가 아니라 조건으로 반복합니다. 조건이 참인 한 계속 돕니다.

PYTHON
count = 0
while count < 3:
    print(f"카운트: {count}")
    count += 1
# 카운트: 0
# 카운트: 1
# 카운트: 2
⚠️ 흔한 실수
가장 무서운 함정 — 무한 루프: 조건이 영원히 참이면 반복이 끝나지 않습니다.
```python
count = 0
while count < 3:
print(count)
# count += 1 을 빠뜨림! → count가 영원히 0 → 무한 반복!
```
무한 루프에 빠지면 터미널에서 Ctrl + C로 강제 종료할 수 있습니다. while을 쓸 땐 "조건을 언젠가 거짓으로 만드는 코드"(여기선 count += 1)가 있는지 꼭 확인하세요.

for vs while, 언제 무엇을?

  • for: 반복 횟수나 대상이 정해져 있을 때 (목록 순회, n번 반복) — 대부분의 경우
  • while: 언제 끝날지 미리 모를 때 (사용자가 "quit"을 칠 때까지, 조건이 만족될 때까지)
PYTHON
# while이 자연스러운 예: 올바른 입력을 받을 때까지
while True:
    answer = input("계속할까요? (y/n): ")
    if answer == "y":
        print("계속합니다")
        break
    elif answer == "n":
        print("종료합니다")
        break
    else:
        print("y 또는 n만 입력하세요")

break와 continue: 반복 제어

반복 도중에 흐름을 바꾸는 두 명령입니다.

키워드하는 일
break반복을 즉시 완전히 중단하고 빠져나감
continue이번 회차만 건너뛰고 다음 회차로
PYTHON
# break: 5를 만나면 멈춤
for i in range(10):
    if i == 5:
        break
    print(i, end=" ")     # 0 1 2 3 4
print()

# continue: 짝수는 건너뛰고 홀수만 출력
for i in range(10):
    if i % 2 == 0:
        continue
    print(i, end=" ")     # 1 3 5 7 9
flowchart TD
    Loop{"반복 중"}:::proc --> Check{"조건?"}:::proc
    Check -->|break| Out([반복 완전 종료]):::err
    Check -->|continue| Loop
    Check -->|보통| Body["블록 실행"]:::result --> Loop

    classDef proc fill:#fff3b0,stroke:#e0a800,color:#5c4500
    classDef result fill:#b8e6c1,stroke:#34a853,color:#14532d
    classDef err fill:#f4b6b6,stroke:#d64545,color:#7a1f1f

자주 쓰는 반복 패턴: 누적

반복하며 값을 쌓는 것은 매우 흔한 패턴입니다. 빈 그릇을 준비해두고 반복마다 더합니다.

PYTHON
# 합계 누적
total = 0
for n in [10, 20, 30]:
    total += n
print(total)        # 60

# 리스트 만들기
squares = []
for i in range(1, 6):
    squares.append(i ** 2)
print(squares)      # [1, 4, 9, 16, 25]
💡 팁
합계처럼 흔한 작업은 내장 함수가 이미 있습니다. sum([10, 20, 30])60을 바로 돌려줍니다. 또한 위 squares 같은 "리스트 만들기"는 리스트 컴프리헨션이라는 더 파이썬다운 한 줄 표현으로 쓸 수 있는데, 이는 중급편에서 다룹니다.

이 장에서 배운 것

  • for는 컬렉션의 항목을 하나씩 꺼내 처리한다. 문자열·리스트·딕셔너리 모두 순회 가능.
  • range(n)은 0부터 n-1까지 숫자를 만든다(끝 미포함). range(시작, 끝, 간격)도 가능.
  • 번호가 필요하면 enumerate(), 딕셔너리는 .items() + 언패킹이 파이썬답다.
  • while은 조건이 참인 동안 반복한다. 조건을 갱신하지 않으면 무한 루프(Ctrl+C로 탈출).
  • break는 반복을 완전히 끝내고, continue는 이번 회차만 건너뛴다.

🧪 실습 문제

문제 1. forrange()를 이용해 1부터 10까지의 합을 구해 출력하세요. (결과: 55)

문제 2. 다음 코드의 출력은?

PYTHON
for i in range(2, 11, 2):
    print(i, end=" ")

문제 3. 리스트 names = ["민지", "현우", "수빈"]enumerate(start=1)로 순회해 1번: 민지 형태로 출력하세요.

문제 4. 1부터 20까지 중 3의 배수만 출력하되, continue를 사용하세요. (3의 배수가 아니면 건너뛰기)

문제 5. while을 사용해, 사용자가 "quit"을 입력할 때까지 입력을 계속 받아 그대로 따라 출력(에코)하는 프로그램을 작성하세요. "quit"이면 "종료합니다"를 출력하고 반복을 끝내세요.

<details>

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

1.

PYTHON
total = 0
for i in range(1, 11):     # 1~10 (11은 미포함)
    total += i
print(total)               # 55
# 참고: sum(range(1, 11)) 로도 가능

2. 2 4 6 8 10. range(2, 11, 2)는 2부터 11 전까지 2씩 증가합니다.

3.

PYTHON
names = ["민지", "현우", "수빈"]
for i, name in enumerate(names, start=1):
    print(f"{i}번: {name}")

4.

PYTHON
for i in range(1, 21):
    if i % 3 != 0:
        continue
    print(i, end=" ")      # 3 6 9 12 15 18

5.

PYTHON
while True:
    text = input("입력: ")
    if text == "quit":
        print("종료합니다")
        break
    print(text)

</details>

◀️ 이전 장: 07. 조건문 | ▶️ 다음 장: 09. 함수