4주차 · 반복문
이 장은 반복문이 왜 필요한지부터 시작합니다.
- 컴퓨터는 같은 일을 수백 번 빠르게 반복할 수 있습니다.
- 우리는 반복의 규칙(초기값, 조건, 갱신)을 정확히 써줘야 합니다.
for와while의 기본 문법과 들여쓰기 위치를 설명할 수 있습니다.- C의 반복문과 Python 반복문의 차이를 예제로 설명할 수 있습니다.
- 반복문 + 조건문을 결합해서 “조건을 만족하는 값만 처리”하는 패턴을 쓸 수 있습니다.
break와continue가 반복 흐름을 어떻게 바꾸는지 설명할 수 있습니다.- 반복문을 잘 쓰면 센서 데이터 처리, 평균 계산, 오류 검사 자동화가 쉬워집니다.
0) 반복문을 처음 보는 학생을 위한 비유
Section titled “0) 반복문을 처음 보는 학생을 위한 비유”반복문은 “컨베이어 벨트”와 비슷합니다.
flowchart LR D1[데이터 상자 1] --> P1[처리] P1 --> D2[데이터 상자 2] D2 --> P2[처리] P2 --> D3[데이터 상자 3] D3 --> P3[처리] P3 --> E[... 반복 후 종료]
for: 상자 개수가 이미 정해져 있을 때 (예: “5번 반복해라”)while: 어떤 조건이 만족되는 동안 계속할 때 (예: “오차가 1보다 작아질 때까지 반복해라”)
1) 반복문의 기본 형태부터 보기
Section titled “1) 반복문의 기본 형태부터 보기”먼저 for와 while이 어떤 모양인지부터 눈에 익혀야 합니다.
for 반복문
Section titled “for 반복문”for i in range(3): print(i)실행 결과:
012for는 정해진 횟수만큼 처음부터 끝까지 차례대로 반복할 때 사용합니다.range(3)은 숫자 0, 1, 2를 차례로 만들어 줍니다 (3개).- 반복할 때마다 변수
i에 다음 숫자가 자동으로 들어갑니다.
for 반복문의 실행 순서를 추적해 봅시다
Section titled “for 반복문의 실행 순서를 추적해 봅시다”for i in range(3): print(i) 이 코드가 실행되는 과정을 한 줄씩 따라가 보겠습니다.
| 반복 회차 | i의 값 | print(i) 출력 | 다음 동작 |
|---|---|---|---|
| 1회째 | 0 | 0 | range에서 다음 값 꺼냄 |
| 2회째 | 1 | 1 | range에서 다음 값 꺼냄 |
| 3회째 | 2 | 2 | range에 값이 더 없으므로 종료 |
이처럼 for문은 “range가 값을 하나 꺼내서 i에 넣고 → 본문 실행 → 또 꺼내고 → 본문 실행 → … → 더 이상 없으면 종료” 라는 흐름으로 동작합니다.
while 반복문
Section titled “while 반복문”error = 10.0
while error > 0.5: print(error) error = error / 2실행 결과:
10.05.02.51.250.625while은 조건이 참인 동안 반복합니다.- 위 코드에서는
error > 0.5이 참인 동안 계속 반복하고,error가 0.3125가 되면 조건이 거짓이므로 멈춥니다. - 그래서 조건을 언젠가 거짓으로 바꾸는 갱신 코드(
error = error / 2)가 반드시 필요합니다.
while 반복문의 실행 순서
Section titled “while 반복문의 실행 순서”| 회차 | 조건 error > 0.5 | error 값 | 출력 | 갱신 후 error |
|---|---|---|---|---|
| 1회째 | 10.0 > 0.5 → True | 10.0 | 10.0 | 5.0 |
| 2회째 | 5.0 > 0.5 → True | 5.0 | 5.0 | 2.5 |
| 3회째 | 2.5 > 0.5 → True | 2.5 | 2.5 | 1.25 |
| 4회째 | 1.25 > 0.5 → True | 1.25 | 1.25 | 0.625 |
| 5회째 | 0.625 > 0.5 → True | 0.625 | 0.625 | 0.3125 |
| 6회째 | 0.3125 > 0.5 → False | — | — | 종료 |
반복문 문법 quickstart: 어떻게 쓰나요?
Section titled “반복문 문법 quickstart: 어떻게 쓰나요?”반복문도 조건문처럼 콜론(:) + 들여쓰기 로 블록을 만듭니다.
for 문법 뼈대
Section titled “for 문법 뼈대”for item in iterable: # 반복해서 실행할 코드 statement_1 statement_2
# 들여쓰기가 끝나면 반복문 밖 코드statement_3iterable이란?
Section titled “iterable이란?”위 문법에서 iterable은 “하나씩 꺼낼 수 있는 묶음” 을 뜻합니다.
아직 리스트(list)를 배우지 않았으므로, 지금은 range() 가 가장 중요한 iterable입니다.
| 형태 | 생성되는 값 | 예시 |
|---|---|---|
range(n) | 0, 1, 2, …, n−1 | range(5) → 0 1 2 3 4 |
range(start, stop) | start, start+1, …, stop−1 | range(2, 6) → 2 3 4 5 |
range(start, stop, step) | start, start+step, … (stop 미포함) | range(0, 10, 3) → 0 3 6 9 |
# range(n): 0부터 n-1까지for i in range(4): print(i) # 0, 1, 2, 3
# range(start, stop): start부터 stop-1까지for i in range(1, 4): print(i) # 1, 2, 3
# range(start, stop, step): start부터 step씩 건너뛰기for i in range(0, 10, 2): print(i) # 0, 2, 4, 6, 8
# 거꾸로 세기 (step이 음수)for i in range(5, 0, -1): print(i) # 5, 4, 3, 2, 1나중에 배울 iterable: 리스트(
[1, 2, 3]), 문자열("hello") 등도 iterable이지만, 이번 주에는range()만 사용합니다.
while 문법 뼈대
Section titled “while 문법 뼈대”while condition: # condition 이 True 인 동안 반복 statement_1 update_condition
statement_2처음 쓸 때 체크할 4가지
Section titled “처음 쓸 때 체크할 4가지”for/while줄 끝에 반드시:를 붙인다.- 반복 본문은 같은 깊이로 4칸 들여쓰기 한다.
while에는 조건을 바꾸는 갱신 줄이 거의 항상 필요하다.- 반복이 끝난 뒤 실행할 코드는 들여쓰기를 원래대로 되돌린다.
count = 0
while count < 3: print("현재 count =", count) count += 1
print("반복 종료")+= 복합 대입 연산자
Section titled “+= 복합 대입 연산자”반복문에서 자주 쓰이는 += 연산자를 정리합니다.
| 표현 | 의미 | 예시 |
|---|---|---|
x += 1 | x = x + 1 | count += 1 → 카운터 1 증가 |
x -= 1 | x = x - 1 | error -= 0.1 → 오차 감소 |
x *= 2 | x = x * 2 | value *= 2 → 두 배로 |
x /= 2 | x = x / 2 | error /= 2 → 절반으로 |
이 연산자들은 “현재 값을 기준으로 갱신”할 때 편리합니다. 반복문의 누적, 카운팅, 갱신 패턴에서 매우 자주 사용됩니다.
2) 반복문의 4요소: 초기화 · 조건 · 본문 · 갱신
Section titled “2) 반복문의 4요소: 초기화 · 조건 · 본문 · 갱신”모든 반복문은 아래 4단계를 따릅니다. 이 구조를 기억하면 반복문을 설계하기 쉬워집니다.
flowchart TB
A["1) 초기화<br/>i = 0, total = 0"] --> B{"2) 조건 검사<br/>i < N ?"}
B -- Yes --> C["3) 본문 실행"]
C --> D["4) 갱신<br/>i += 1"]
D --> B
B -- No --> E["종료 End"] 구체적으로 따라가 봅시다
Section titled “구체적으로 따라가 봅시다”“1부터 3까지 합계를 구하라”는 문제를 4요소로 분해하면:
# 1) 초기화total = 0
# 2) 조건: i가 1, 2, 3일 때 반복for i in range(1, 4): # 3) 본문 total += i # 4) 갱신: for문이 i를 자동으로 다음 값으로 바꿔 줌
print("합계:", total) # 6| 회차 | i | total += i 계산 | total 결과 |
|---|---|---|---|
| 1회째 | 1 | 0 + 1 | 1 |
| 2회째 | 2 | 1 + 2 | 3 |
| 3회째 | 3 | 3 + 3 | 6 |
| 종료 | — | — | 6 |
직접 실행 순서를 따라가 보세요
Section titled “직접 실행 순서를 따라가 보세요”아래에서 “다음 →” 버튼을 누르면 반복문이 한 줄씩 실행되는 과정을 볼 수 있습니다.
3) for와 while를 구분하기
Section titled “3) for와 while를 구분하기”| 상황 | 권장 반복문 | 이유 |
|---|---|---|
| 정해진 횟수만큼 반복 | for | range(N)으로 범위가 명확 |
| 데이터 묶음을 처음부터 끝까지 처리 | for | 범위가 명확하고 실수 적음 |
| 오차가 충분히 작아질 때까지 반복 | while | 반복 횟수가 미리 고정되지 않음 |
| 카운터로 N번만 반복 | for range(N) | 종료 조건이 자동으로 명확 |
안전장치(max_steps)가 필요한 탐색 | while + guard | 무한루프 방지 쉬움 |
한 줄 요약: 반복 횟수를 미리 알면 for, 모르면 while.
C와 비교: 반복문 문법이 이렇게 다릅니다
Section titled “C와 비교: 반복문 문법이 이렇게 다릅니다”C 프로그래밍을 배웠거나, 다른 수업에서 C를 병행하는 학생을 위한 비교입니다.
| 항목 | C | Python | 기억할 점 |
|---|---|---|---|
| 블록 구분 | { ... } | 들여쓰기 | Python에서는 공백이 문법이다 |
for 헤더 | for (i=0; i<n; i++) | for i in range(n): | Python은 초기화;조건;증가를 한 줄에 쓰지 않는다 |
while 조건 | while (x < 10) | while x < 10: | 괄호보다 :가 중요하다 |
| 증가 연산 | i++ | i += 1 | Python에는 ++가 없다 |
int total = 0;
for (int i = 0; i < 5; i++) { total += i;}
printf("%d\n", total);total = 0
for i in range(5): total += i
print(total)핵심은 중괄호 대신 들여쓰기, i++ 대신 i += 1, C의 for (...) 구조 대신 for i in range(...) 를 쓰는 것입니다.
4) 알고리즘적 사고: “종이에 먼저” 반복문 설계
Section titled “4) 알고리즘적 사고: “종이에 먼저” 반복문 설계”코드를 바로 치기 전에, 종이에 먼저 설계하면 실수가 크게 줄어듭니다.
1부터 N까지의 숫자 중 합계, 평균, 기준값을 초과하는 개수를 구하라.
- 입력 확인:
n = 10,threshold = 5 - 누적 변수 준비:
total = 0,count_over = 0 - 반복:
for i in range(1, n + 1):로 1부터 N까지 방문 - 본문:
total += iif i > threshold: count_over += 1
- 종료 후 계산:
avg = total / n - 검증: 손으로 2~3개 값 계산해 결과 비교
검증 예시 (N=4, threshold=2)
Section titled “검증 예시 (N=4, threshold=2)”i | total | i > 2? | count_over |
|---|---|---|---|
| 1 | 1 | No | 0 |
| 2 | 3 | No | 0 |
| 3 | 6 | Yes | 1 |
| 4 | 10 | Yes | 2 |
→ 합계 10, 평균 2.5, 초과 2개. 코드 결과와 일치하는지 확인!
5) 반복문 안에서 조건문 사용하기
Section titled “5) 반복문 안에서 조건문 사용하기”반복문과 조건문을 결합하면 “N개 중에서 조건을 만족하는 것만 골라서 처리” 할 수 있습니다. 이것은 프로그래밍에서 매우 자주 등장하는 패턴입니다.
패턴 1: 카운팅 — “몇 개인지 세기”
Section titled “패턴 1: 카운팅 — “몇 개인지 세기””count = 0for i in range(1, 11): # 1부터 10까지 if i % 2 == 0: # 짝수인지 확인 count += 1print("짝수 개수:", count) # 5패턴 2: 누적 — “조건에 맞는 값만 더하기”
Section titled “패턴 2: 누적 — “조건에 맞는 값만 더하기””total = 0for i in range(1, 11): if i % 3 == 0: # 3의 배수만 total += iprint("3의 배수 합:", total) # 3+6+9 = 18패턴 3: 조건 분기 — “경우에 따라 다르게 처리”
Section titled “패턴 3: 조건 분기 — “경우에 따라 다르게 처리””for i in range(1, 6): if i % 2 == 0: print(i, "→ 짝수") else: print(i, "→ 홀수")흐름 제어: break 와 continue
Section titled “흐름 제어: break 와 continue”반복문은 보통 처음부터 끝까지 순서대로 돌지만, 때로는 중간에 멈추거나(break) 현재 회차만 건너뛰고 다음 회차로 넘어가야(continue) 할 때가 있습니다.
for i in range(1, 11): if i == 7: print("i=7 → break, 반복 종료") break
if i % 2 == 0: continue
print("처리된 값:", i)실행 흐름:
i = 1, 3, 5→ 홀수이므로 출력i = 2, 4, 6→ 짝수이므로continue, 아래print()는 건너뜀i = 7→break, 반복문 즉시 종료
핵심 규칙:
break→ 가장 가까운 반복문 1개만 즉시 종료continue→ 현재 회차만 건너뛰고 다음 반복으로 이동
6) 중첩 반복문 (Nested Loops)
Section titled “6) 중첩 반복문 (Nested Loops)”for 안에 for를 넣으면 “모든 조합” 을 만들 수 있습니다. 바깥 반복문이 한 번 돌 때마다 안쪽 반복문이 처음부터 끝까지 완전히 실행됩니다.
실행 흐름 추적: range(3) × range(2)
Section titled “실행 흐름 추적: range(3) × range(2)”for i in range(3): for j in range(2): print(f"i={i}, j={j}")바깥 i | 안쪽 j | 출력 |
|---|---|---|
| 0 | 0 | i=0, j=0 |
| 0 | 1 | i=0, j=1 |
| 1 | 0 | i=1, j=0 |
| 1 | 1 | i=1, j=1 |
| 2 | 0 | i=2, j=0 |
| 2 | 1 | i=2, j=1 |
총 3 × 2 = 6가지 조합 이 만들어집니다.
EE 예제 1: 구구단 일부 (2~4단)
Section titled “EE 예제 1: 구구단 일부 (2~4단)”for dan in range(2, 5): # 2단, 3단, 4단 for i in range(1, 10): # 1~9 print(f"{dan} x {i} = {dan * i:2d}") print() # 단 사이 빈 줄바깥 반복문(dan)이 단(2, 3, 4)을 결정하고, 안쪽 반복문(i)이 각 단의 1~9를 순서대로 계산합니다.
EE 예제 2: 파라미터 스윕 — 전압과 저항 조합으로 전력 계산
Section titled “EE 예제 2: 파라미터 스윕 — 전압과 저항 조합으로 전력 계산”실험에서 여러 조건을 조합해 결과를 한꺼번에 계산할 때 중첩 반복문이 유용합니다.
for v in range(1, 6): # 1V ~ 5V for r in range(10, 60, 10): # 10Ω ~ 50Ω power_mw = (v ** 2) / r * 1000 print(f"V={v}V, R={r}Ω → P={power_mw:.1f}mW")v가 1일 때 r은 10, 20, 30, 40, 50을 모두 순회합니다. 그다음 v가 2가 되면 다시 r이 10부터 반복됩니다. 총 5 × 5 = 25가지 조합 이 출력됩니다.
7) 잘못된 예와 올바른 예
Section titled “7) 잘못된 예와 올바른 예”A. 범위 경계(off-by-one)
Section titled “A. 범위 경계(off-by-one)”Bad
# 1부터 5까지 합계를 구하려고 했는데...total = 0for i in range(1, 5): total += iprint("합계:", total) # 10 (1+2+3+4), 15가 아님!왜 문제? range(1, 5)는 1, 2, 3, 4까지만 생성하고 5는 포함하지 않습니다.
Good
total = 0for i in range(1, 6): # 끝값 + 1 을 써야 5까지 포함 total += iprint("합계:", total) # 15B. while 갱신 누락
Section titled “B. while 갱신 누락”Bad
x = 0while x < 5: print(x) # x를 바꾸는 코드가 없다! → 무한루프왜 문제? x가 영원히 0이므로 x < 5는 항상 True. 프로그램이 멈추지 않습니다.
Good
x = 0step = 0while x < 5 and step < 20: # 안전장치(guard) 추가 print(x) x += 1 step += 1C. 누적 변수를 반복문 안에서 초기화
Section titled “C. 누적 변수를 반복문 안에서 초기화”Bad
for i in range(1, 6): total = 0 # 매 반복마다 0으로 리셋됨! total += iprint("합계:", total) # 5 (마지막 i=5만 남음)Good
total = 0 # 반복문 바깥에서 한 번만 초기화for i in range(1, 6): total += iprint("합계:", total) # 15규칙: 누적 변수(total, count 등)는 반드시 반복문 시작 전에 초기화합니다.
8) 디버깅 습관
Section titled “8) 디버깅 습관”반복문에서 버그를 찾을 때 도움이 되는 5가지 습관입니다.
- 처음 5회만 로그 출력:
if step < 5: print(...) - 종료 조건을 출력으로 확인: 현재 조건식 값 확인
- 손계산 1회 비교: 코드 결과와 수동 계산 비교
- guard 넣기:
step < max_steps - 작은 범위로 시작:
range(3)정도로 먼저 테스트하고 나중에 늘리기
print(f"...") — 디버그 출력 도구
Section titled “print(f"...") — 디버그 출력 도구”예제에서 자주 사용하는 f"..." 문법을 간단히 소개합니다.
i = 3value = 7.5print(f"i={i}, value={value}") # i=3, value=7.5print(f"value={value:.2f}") # value=7.50 (소수점 2자리)f"..."안에서{변수이름}을 쓰면 그 변수의 값이 자동으로 들어갑니다.{value:.2f}는 소수점 아래 2자리까지 표시하라는 뜻입니다.
예제 1 — for/range 누적 계산
Section titled “예제 1 — for/range 누적 계산” 예제 1 줄별 해설
Section titled “예제 1 줄별 해설”n = 5— 1부터 5까지 반복할 횟수 설정threshold = 5.0— “이 값보다 크면 카운트”하는 기준값total = 0.0,count_over = 0— 누적 변수를 반복문 바깥에서 0으로 초기화for i in range(1, n + 1):—range(1, 6)이므로 i는 1, 2, 3, 4, 5value = i * 2.5— 각 반복에서 i를 이용해 값을 계산 (2.5, 5.0, 7.5, 10.0, 12.5)total += value— 매 반복마다 합계에 더함if value > threshold:— 조건문으로 기준 초과 여부 확인print(f"debug ...")— 디버그 출력으로 중간 상태 확인avg = total / n— 반복문 종료 후 평균 계산 (들여쓰기가for밖)
예제 2 — while/종료 조건/디버깅
Section titled “예제 2 — while/종료 조건/디버깅” 예제 2 줄별 해설
Section titled “예제 2 줄별 해설”target = 10.0— 도달하고 싶은 목표값value = 0.0— 현재 값 (0에서 시작)alpha = 0.25— 한 번에 오차의 25%만큼 이동 (학습률)tol = 0.001— “충분히 가까움” 기준 (tolerance)abs(target - value)—abs()는 절댓값 함수.abs(-3)→3while abs(...) > tol and step < max_steps:— 오차 조건 + 안전장치(guard) 를 같이 적용error = target - value와value = value + alpha * error— 매 반복마다 목표에 조금씩 접근step += 1— 반드시 반복 카운트 증가 (guard가 작동하려면 필수)if step <= 6:— 처음 6회만 디버그 출력 (너무 많은 출력 방지)- 마지막
print— 반복문 밖이므로 종료 후 최종 결과 출력
예제 3 — off-by-one 비교
Section titled “예제 3 — off-by-one 비교”off-by-one(하나 어긋남) 실수를 직접 확인하는 예제입니다.
예제 3 해설
Section titled “예제 3 해설”range(1, 5)는 1, 2, 3, 4를 생성합니다. 5는 빠집니다.range(1, 6)으로 써야 1, 2, 3, 4, 5를 모두 포함합니다.- “1부터 N까지”를 반복하고 싶으면 →
range(1, N + 1)이라고 기억하세요. - 이 실수는 매우 흔합니다. 디버그 출력으로
i의 첫 값과 마지막 값을 확인하면 빠르게 발견할 수 있습니다.
예제 4 — 안전한 while 템플릿
Section titled “예제 4 — 안전한 while 템플릿”while문에서 무한루프를 방지하는 안전한 패턴입니다.
예제 4 해설
Section titled “예제 4 해설”step < max_steps는 안전장치(guard) 입니다.while조건에and step < max_steps를 함께 넣으면, 설령 다른 조건에 버그가 있어도 최대max_steps회 후에는 반드시 멈춥니다.- 이 패턴은
while문을 쓸 때 항상 적용하는 것을 권장합니다.
예제 5 — 반복문 + 조건문 조합
Section titled “예제 5 — 반복문 + 조건문 조합”반복문 안에서 조건문을 사용하여 “조건에 맞는 값만 골라서 처리”하는 패턴입니다.
예제 5 해설
Section titled “예제 5 해설”for i in range(1, 21):— 1부터 20까지 순회i % 3 == 0— 3으로 나눈 나머지가 0 → 3의 배수i % 2 != 0— 2로 나눈 나머지가 0이 아님 → 홀수and로 두 조건을 결합 — 둘 다 참일 때만 본문 실행- 들여쓰기가 두 단계:
for본문(4칸) →if본문(8칸)
초보자 실수와 교정 패턴
Section titled “초보자 실수와 교정 패턴”| 실수 | 증상 | 빠른 수정 |
|---|---|---|
range(1, N) 으로 N을 빼먹음 | 마지막 값이 빠진 결과 | range(1, N + 1)로 수정 |
| while에 갱신 없음 | 프로그램 멈춤/무한반복 | 반복문 끝에 갱신문 추가 |
while에서 continue가 갱신문보다 먼저 실행됨 | 특정 값에서 같은 회차가 무한반복 | continue 전에 카운터/상태 갱신 |
| 누적 변수를 반복문 안에서 초기화 | 결과가 항상 작거나 0 | 초기화는 반복문 밖으로 이동 |
종료 조건 없이 while True | 강제 중단 필요 | 안전장치 step < max_steps 사용 |
| 디버그 로그 없이 결과만 봄 | 어디서 틀렸는지 모름 | 처음 N회 상태 출력 |
for 안 if의 들여쓰기 오류 | 조건문이 반복 밖에서 실행됨 | if문을 for 본문 안에 4칸 들여쓰기 |
실습 문제 · 직접 코딩
Section titled “실습 문제 · 직접 코딩”문제: 1부터 N까지의 합계와 평균을 for문으로 계산하세요.
문제: 1부터 20까지의 숫자 중 짝수의 개수와 합계를 구하세요. (for + if)
문제: range(start, stop, step)을 사용해서 10부터 1까지 거꾸로 카운트다운하세요.
문제: 오차가 충분히 작아질 때까지 while문으로 값을 반복 갱신하세요.
문제: break와 continue를 함께 사용해 반복 흐름을 제어하세요. 1부터 20까지 순회하면서, 3의 배수는 건너뛰고, 17을 만나면 즉시 반복을 종료하세요. 처리된 숫자의 개수와 합계를 구하세요.
문제: 중첩 반복문으로 파라미터 스윕을 수행하세요. 전압 110V, 저항 100500Ω(100Ω 간격) 조합에서 전력이 0.5W를 넘는 조합의 개수를 세세요. 전력은 W 단위로 계산하고, 조건은 power > 0.5 입니다. (P = V² / R)