Skip to content

4주차 · 반복문

이 장은 반복문이 왜 필요한지부터 시작합니다.

  • 컴퓨터는 같은 일을 수백 번 빠르게 반복할 수 있습니다.
  • 우리는 반복의 규칙(초기값, 조건, 갱신)을 정확히 써줘야 합니다.
  • forwhile의 기본 문법과 들여쓰기 위치를 설명할 수 있습니다.
  • C의 반복문과 Python 반복문의 차이를 예제로 설명할 수 있습니다.
  • 반복문 + 조건문을 결합해서 “조건을 만족하는 값만 처리”하는 패턴을 쓸 수 있습니다.
  • breakcontinue가 반복 흐름을 어떻게 바꾸는지 설명할 수 있습니다.
  • 반복문을 잘 쓰면 센서 데이터 처리, 평균 계산, 오류 검사 자동화가 쉬워집니다.

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) 반복문의 기본 형태부터 보기”

먼저 forwhile이 어떤 모양인지부터 눈에 익혀야 합니다.

for i in range(3):
print(i)

실행 결과:

0
1
2
  • for는 정해진 횟수만큼 처음부터 끝까지 차례대로 반복할 때 사용합니다.
  • range(3)은 숫자 0, 1, 2를 차례로 만들어 줍니다 (3개).
  • 반복할 때마다 변수 i에 다음 숫자가 자동으로 들어갑니다.

for 반복문의 실행 순서를 추적해 봅시다

Section titled “for 반복문의 실행 순서를 추적해 봅시다”

for i in range(3): print(i) 이 코드가 실행되는 과정을 한 줄씩 따라가 보겠습니다.

반복 회차i의 값print(i) 출력다음 동작
1회째00range에서 다음 값 꺼냄
2회째11range에서 다음 값 꺼냄
3회째22range에 값이 더 없으므로 종료

이처럼 for문은 “range가 값을 하나 꺼내서 i에 넣고 → 본문 실행 → 또 꺼내고 → 본문 실행 → … → 더 이상 없으면 종료” 라는 흐름으로 동작합니다.

error = 10.0
while error > 0.5:
print(error)
error = error / 2

실행 결과:

10.0
5.0
2.5
1.25
0.625
  • while조건이 참인 동안 반복합니다.
  • 위 코드에서는 error > 0.5이 참인 동안 계속 반복하고, error가 0.3125가 되면 조건이 거짓이므로 멈춥니다.
  • 그래서 조건을 언젠가 거짓으로 바꾸는 갱신 코드(error = error / 2)가 반드시 필요합니다.
회차조건 error > 0.5error출력갱신 후 error
1회째10.0 > 0.5 → True10.010.05.0
2회째5.0 > 0.5 → True5.05.02.5
3회째2.5 > 0.5 → True2.52.51.25
4회째1.25 > 0.5 → True1.251.250.625
5회째0.625 > 0.5 → True0.6250.6250.3125
6회째0.3125 > 0.5False종료

반복문 문법 quickstart: 어떻게 쓰나요?

Section titled “반복문 문법 quickstart: 어떻게 쓰나요?”

반복문도 조건문처럼 콜론(:) + 들여쓰기 로 블록을 만듭니다.

for item in iterable:
# 반복해서 실행할 코드
statement_1
statement_2
# 들여쓰기가 끝나면 반복문 밖 코드
statement_3

위 문법에서 iterable“하나씩 꺼낼 수 있는 묶음” 을 뜻합니다. 아직 리스트(list)를 배우지 않았으므로, 지금은 range() 가 가장 중요한 iterable입니다.

형태생성되는 값예시
range(n)0, 1, 2, …, n−1range(5) → 0 1 2 3 4
range(start, stop)start, start+1, …, stop−1range(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 condition:
# condition 이 True 인 동안 반복
statement_1
update_condition
statement_2
  1. for/while 줄 끝에 반드시 :를 붙인다.
  2. 반복 본문은 같은 깊이로 4칸 들여쓰기 한다.
  3. while에는 조건을 바꾸는 갱신 줄이 거의 항상 필요하다.
  4. 반복이 끝난 뒤 실행할 코드는 들여쓰기를 원래대로 되돌린다.
count = 0
while count < 3:
print("현재 count =", count)
count += 1
print("반복 종료")

반복문에서 자주 쓰이는 += 연산자를 정리합니다.

표현의미예시
x += 1x = x + 1count += 1 → 카운터 1 증가
x -= 1x = x - 1error -= 0.1 → 오차 감소
x *= 2x = x * 2value *= 2 → 두 배로
x /= 2x = x / 2error /= 2 → 절반으로

이 연산자들은 “현재 값을 기준으로 갱신”할 때 편리합니다. 반복문의 누적, 카운팅, 갱신 패턴에서 매우 자주 사용됩니다.

2) 반복문의 4요소: 초기화 · 조건 · 본문 · 갱신

Section titled “2) 반복문의 4요소: 초기화 · 조건 · 본문 · 갱신”

모든 반복문은 아래 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"]

“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
회차itotal += i 계산total 결과
1회째10 + 11
2회째21 + 23
3회째33 + 36
종료6

직접 실행 순서를 따라가 보세요

Section titled “직접 실행 순서를 따라가 보세요”

아래에서 “다음 →” 버튼을 누르면 반복문이 한 줄씩 실행되는 과정을 볼 수 있습니다.

for문 실행 추적기
변수 상태
출력
 
Step 0
상황권장 반복문이유
정해진 횟수만큼 반복forrange(N)으로 범위가 명확
데이터 묶음을 처음부터 끝까지 처리for범위가 명확하고 실수 적음
오차가 충분히 작아질 때까지 반복while반복 횟수가 미리 고정되지 않음
카운터로 N번만 반복for range(N)종료 조건이 자동으로 명확
안전장치(max_steps)가 필요한 탐색while + guard무한루프 방지 쉬움

한 줄 요약: 반복 횟수를 미리 알면 for, 모르면 while.

C와 비교: 반복문 문법이 이렇게 다릅니다

Section titled “C와 비교: 반복문 문법이 이렇게 다릅니다”

C 프로그래밍을 배웠거나, 다른 수업에서 C를 병행하는 학생을 위한 비교입니다.

항목CPython기억할 점
블록 구분{ ... }들여쓰기Python에서는 공백이 문법이다
for 헤더for (i=0; i<n; i++)for i in range(n):Python은 초기화;조건;증가를 한 줄에 쓰지 않는다
while 조건while (x < 10)while x < 10:괄호보다 :가 중요하다
증가 연산i++i += 1Python에는 ++가 없다
int total = 0;
for (int i = 0; i < 5; i++) {
total += i;
}
printf("%d\n", total);

핵심은 중괄호 대신 들여쓰기, i++ 대신 i += 1, C의 for (...) 구조 대신 for i in range(...) 를 쓰는 것입니다.

4) 알고리즘적 사고: “종이에 먼저” 반복문 설계

Section titled “4) 알고리즘적 사고: “종이에 먼저” 반복문 설계”

코드를 바로 치기 전에, 종이에 먼저 설계하면 실수가 크게 줄어듭니다.

1부터 N까지의 숫자 중 합계, 평균, 기준값을 초과하는 개수를 구하라.

  1. 입력 확인: n = 10, threshold = 5
  2. 누적 변수 준비: total = 0, count_over = 0
  3. 반복: for i in range(1, n + 1):로 1부터 N까지 방문
  4. 본문:
    • total += i
    • if i > threshold: count_over += 1
  5. 종료 후 계산: avg = total / n
  6. 검증: 손으로 2~3개 값 계산해 결과 비교
itotali > 2?count_over
11No0
23No0
36Yes1
410Yes2

→ 합계 10, 평균 2.5, 초과 2개. 코드 결과와 일치하는지 확인!

5) 반복문 안에서 조건문 사용하기

Section titled “5) 반복문 안에서 조건문 사용하기”

반복문과 조건문을 결합하면 “N개 중에서 조건을 만족하는 것만 골라서 처리” 할 수 있습니다. 이것은 프로그래밍에서 매우 자주 등장하는 패턴입니다.

패턴 1: 카운팅 — “몇 개인지 세기”

Section titled “패턴 1: 카운팅 — “몇 개인지 세기””
count = 0
for i in range(1, 11): # 1부터 10까지
if i % 2 == 0: # 짝수인지 확인
count += 1
print("짝수 개수:", count) # 5

패턴 2: 누적 — “조건에 맞는 값만 더하기”

Section titled “패턴 2: 누적 — “조건에 맞는 값만 더하기””
total = 0
for i in range(1, 11):
if i % 3 == 0: # 3의 배수만
total += i
print("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) 할 때가 있습니다.

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 = 7break, 반복문 즉시 종료

핵심 규칙:

  • break가장 가까운 반복문 1개만 즉시 종료
  • continue현재 회차만 건너뛰고 다음 반복으로 이동

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출력
00i=0, j=0
01i=0, j=1
10i=1, j=0
11i=1, j=1
20i=2, j=0
21i=2, j=1

총 3 × 2 = 6가지 조합 이 만들어집니다.

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가지 조합 이 출력됩니다.

Bad

# 1부터 5까지 합계를 구하려고 했는데...
total = 0
for i in range(1, 5):
total += i
print("합계:", total) # 10 (1+2+3+4), 15가 아님!

왜 문제? range(1, 5)는 1, 2, 3, 4까지만 생성하고 5는 포함하지 않습니다.

Good

total = 0
for i in range(1, 6): # 끝값 + 1 을 써야 5까지 포함
total += i
print("합계:", total) # 15

Bad

x = 0
while x < 5:
print(x)
# x를 바꾸는 코드가 없다! → 무한루프

왜 문제? x가 영원히 0이므로 x < 5는 항상 True. 프로그램이 멈추지 않습니다.

Good

x = 0
step = 0
while x < 5 and step < 20: # 안전장치(guard) 추가
print(x)
x += 1
step += 1

C. 누적 변수를 반복문 안에서 초기화

Section titled “C. 누적 변수를 반복문 안에서 초기화”

Bad

for i in range(1, 6):
total = 0 # 매 반복마다 0으로 리셋됨!
total += i
print("합계:", total) # 5 (마지막 i=5만 남음)

Good

total = 0 # 반복문 바깥에서 한 번만 초기화
for i in range(1, 6):
total += i
print("합계:", total) # 15

규칙: 누적 변수(total, count 등)는 반드시 반복문 시작 전에 초기화합니다.

반복문에서 버그를 찾을 때 도움이 되는 5가지 습관입니다.

  1. 처음 5회만 로그 출력: if step < 5: print(...)
  2. 종료 조건을 출력으로 확인: 현재 조건식 값 확인
  3. 손계산 1회 비교: 코드 결과와 수동 계산 비교
  4. guard 넣기: step < max_steps
  5. 작은 범위로 시작: range(3) 정도로 먼저 테스트하고 나중에 늘리기

예제에서 자주 사용하는 f"..." 문법을 간단히 소개합니다.

i = 3
value = 7.5
print(f"i={i}, value={value}") # i=3, value=7.5
print(f"value={value:.2f}") # value=7.50 (소수점 2자리)
  • f"..." 안에서 {변수이름}을 쓰면 그 변수의 값이 자동으로 들어갑니다.
  • {value:.2f}는 소수점 아래 2자리까지 표시하라는 뜻입니다.

4주차 · 예제 1 (for/range/누적 계산) Runs in-browser with Pyodide
Ready
  1. n = 5 — 1부터 5까지 반복할 횟수 설정
  2. threshold = 5.0 — “이 값보다 크면 카운트”하는 기준값
  3. total = 0.0, count_over = 0 — 누적 변수를 반복문 바깥에서 0으로 초기화
  4. for i in range(1, n + 1):range(1, 6)이므로 i는 1, 2, 3, 4, 5
  5. value = i * 2.5 — 각 반복에서 i를 이용해 값을 계산 (2.5, 5.0, 7.5, 10.0, 12.5)
  6. total += value — 매 반복마다 합계에 더함
  7. if value > threshold: — 조건문으로 기준 초과 여부 확인
  8. print(f"debug ...") — 디버그 출력으로 중간 상태 확인
  9. avg = total / n — 반복문 종료 후 평균 계산 (들여쓰기가 for 밖)

예제 2 — while/종료 조건/디버깅

Section titled “예제 2 — while/종료 조건/디버깅”
4주차 · 예제 2 (while/종료 조건/디버깅) Runs in-browser with Pyodide
Ready
  1. target = 10.0 — 도달하고 싶은 목표값
  2. value = 0.0 — 현재 값 (0에서 시작)
  3. alpha = 0.25 — 한 번에 오차의 25%만큼 이동 (학습률)
  4. tol = 0.001 — “충분히 가까움” 기준 (tolerance)
  5. abs(target - value)abs()는 절댓값 함수. abs(-3)3
  6. while abs(...) > tol and step < max_steps: — 오차 조건 + 안전장치(guard) 를 같이 적용
  7. error = target - valuevalue = value + alpha * error — 매 반복마다 목표에 조금씩 접근
  8. step += 1 — 반드시 반복 카운트 증가 (guard가 작동하려면 필수)
  9. if step <= 6: — 처음 6회만 디버그 출력 (너무 많은 출력 방지)
  10. 마지막 print — 반복문 밖이므로 종료 후 최종 결과 출력

off-by-one(하나 어긋남) 실수를 직접 확인하는 예제입니다.

4주차 · 예제 3 (off-by-one 비교) Runs in-browser with Pyodide
Ready
  • range(1, 5)는 1, 2, 3, 4를 생성합니다. 5는 빠집니다.
  • range(1, 6)으로 써야 1, 2, 3, 4, 5를 모두 포함합니다.
  • “1부터 N까지”를 반복하고 싶으면 → range(1, N + 1) 이라고 기억하세요.
  • 이 실수는 매우 흔합니다. 디버그 출력으로 i의 첫 값과 마지막 값을 확인하면 빠르게 발견할 수 있습니다.

while문에서 무한루프를 방지하는 안전한 패턴입니다.

4주차 · 예제 4 (안전한 while 템플릿) Runs in-browser with Pyodide
Ready
  • step < max_steps안전장치(guard) 입니다.
  • while 조건에 and step < max_steps를 함께 넣으면, 설령 다른 조건에 버그가 있어도 최대 max_steps회 후에는 반드시 멈춥니다.
  • 이 패턴은 while문을 쓸 때 항상 적용하는 것을 권장합니다.

반복문 안에서 조건문을 사용하여 “조건에 맞는 값만 골라서 처리”하는 패턴입니다.

4주차 · 예제 5 (반복문 + 조건문 조합) Runs in-browser with Pyodide
Ready
  1. for i in range(1, 21): — 1부터 20까지 순회
  2. i % 3 == 0 — 3으로 나눈 나머지가 0 → 3의 배수
  3. i % 2 != 0 — 2로 나눈 나머지가 0이 아님 → 홀수
  4. and로 두 조건을 결합 — 둘 다 참일 때만 본문 실행
  5. 들여쓰기가 두 단계: for 본문(4칸) → if 본문(8칸)
실수증상빠른 수정
range(1, N) 으로 N을 빼먹음마지막 값이 빠진 결과range(1, N + 1)로 수정
while에 갱신 없음프로그램 멈춤/무한반복반복문 끝에 갱신문 추가
while에서 continue가 갱신문보다 먼저 실행됨특정 값에서 같은 회차가 무한반복continue 전에 카운터/상태 갱신
누적 변수를 반복문 안에서 초기화결과가 항상 작거나 0초기화는 반복문 밖으로 이동
종료 조건 없이 while True강제 중단 필요안전장치 step < max_steps 사용
디버그 로그 없이 결과만 봄어디서 틀렸는지 모름처음 N회 상태 출력
forif의 들여쓰기 오류조건문이 반복 밖에서 실행됨if문을 for 본문 안에 4칸 들여쓰기

문제: 1부터 N까지의 합계와 평균을 for문으로 계산하세요.

실습 문제 1 · for/range로 합계와 평균 구하기 Runs in-browser with Pyodide
Ready