flowchart TD
START(["루프 진입"]) --> COND{"반복 조건 만족?<br/>(Loop Condition)"}
COND -- "예 (True)" --> BODY["반복 본문 실행<br/>(Loop Body)"]
BODY --> UPDATE["상태 변수 갱신<br/>(count += 1)"]
UPDATE --> COND
COND -- "아니오 (False)" --> EXIT["루프 탈출 & 다음 단계"]
style START fill:#f1f5f9
style COND fill:#fef3c7,stroke:#d97706,stroke-width:2px
style BODY fill:#dbeafe,stroke:#2563eb
style UPDATE fill:#dcfce7,stroke:#16a34a
style EXIT fill:#f1f5f9
개념 이해
반복 구조의 본질: 인간과 컴퓨터의 차이
인간은 수천 번의 단순 계산을 반복하면 피로를 느끼고 실수를 범하지만, 컴퓨터는 수억 번의 반복 연산을 단 \(1\)밀리초의 오차도 없이 묵묵히 수행합니다.
반복 구조(Iteration/Loop)는 동일하거나 유사한 일련의 명령어 집합을 정해진 횟수만큼 또는 특정 조건이 만족되는 동안 되풀이하여 실행하도록 제어하는 프로그래밍 구조입니다.
횟수 기반 반복문: for 문과 range() 함수
파이썬의 for 문은 리스트, 튜플, 문자열 등 순서가 있는 데이터 시퀀스(Sequence)의 원소를 처음부터 끝까지 하나씩 꺼내어 변수에 대입하며 반복합니다.
# 문자열의 각 글자 순회
for ch in "PYTHON":
print(ch, end=" ")
# 출력 결과: P Y T H O Nrange() 함수의 3가지 용법
range()는 지정된 범위의 연속된 정수 수열을 메모리 효율적으로 생성하는 파이썬의 강력한 내장 제너레이터 함수입니다.
flowchart LR
R["range(start, stop, step)"]
R --> S1["range(5)<br/>0부터 4까지 5회 반복<br/>[0, 1, 2, 3, 4]"]
R --> S2["range(1, 6)<br/>1부터 5까지 5회 반복<br/>[1, 2, 3, 4, 5]"]
R --> S3["range(1, 10, 2)<br/>1부터 9까지 2씩 증가 (홀수)<br/>[1, 3, 5, 7, 9]"]
style R fill:#dbeafe,stroke:#1d4ed8
style S1 fill:#f8fafc
style S2 fill:#f8fafc
style S3 fill:#f8fafc
파이썬의 모든 범위 지정에서 종료값(stop)은 포함되지 않고 직전 값까지만 순회합니다. 예컨대 range(1, 10)은 \(1\)부터 \(9\)까지 실행됩니다.
# 1부터 10까지의 누적합 계산
total_sum = 0
for i in range(1, 11):
total_sum += i
print(f"1부터 10까지의 합계: {total_sum}") # 55조건 기반 반복문: while 문과 무한 루프
while 문은 반복 횟수가 사전에 명확하지 않고, 특정 조건이 참(True)인 동안 계속해서 실행해야 하는 동적 상황(예: 게임 루프, 센서 감지, 사용자 로그인 대기)에 사용됩니다.
count = 1
while count <= 5:
print(f"카운트다운: {count}")
count += 1 # 조건 탈출을 위한 필수 증감식
print("발사!")무한 루프(Infinite Loop)의 위험과 탈출
만약 while 문의 조건식이 항상 True이고 내부에서 탈출할 수 있는 장치가 없다면, 프로그램은 무한히 멈추지 않는 무한 루프에 빠져 CPU 자원을 \(100\%\) 점유하게 됩니다. 따라서 while 문을 작성할 때는 반드시 종료 조건으로 수렴하는 상태 갱신 코드가 포함되어 있는지 점검해야 합니다.
반복의 흐름을 능동 제어하는 break와 continue
| 제어 키워드 | 동작 방식 | 실생활 비유 |
|---|---|---|
break |
루프 조건을 무시하고 현재 반복문을 즉시 완전히 탈출 | 비상벨이 울려 쇼핑을 즉시 중단하고 매장을 퇴장함 |
continue |
아래쪽 실행문을 건너뛰고 다음 회차 반복으로 즉시 이동 | 줄을 서 있다가 결격 사유가 있는 사람만 건너뛰고 다음 사람을 심사함 |
flowchart TD
subgraph BreakConcept["break 제어 흐름"]
B_START["루프 실행 중"] --> B_COND{"break 조건?"}
B_COND -- "Yes" --> B_EXIT["루프 강제 탈출 (Exit Loop)"]
B_COND -- "No" --> B_CONT["남은 코드 실행"]
end
subgraph ContinueConcept["continue 제어 흐름"]
C_START["루프 실행 중"] --> C_COND{"continue 조건?"}
C_COND -- "Yes" --> C_SKIP["남은 코드 생략 후 다음 회차로 Skip"]
C_COND -- "No" --> C_CONT["남은 코드 실행"]
end
style BreakConcept fill:#fee2e2,stroke:#dc2626
style ContinueConcept fill:#fef3c7,stroke:#d97706
# 1부터 10 중 짝수만 건너뛰고, 7을 만나면 즉시 종료
for num in range(1, 11):
if num % 2 == 0:
continue # 짝수는 출력을 건너뜀
if num == 7:
break # 7을 만나면 루프 완전 종료
print(num, end=" ")
# 출력 결과: 1 3 5실전 응용 예제 2선
예제 1: 은행 ATM 비밀번호 3회 오류 잠금 시스템
비밀번호 입력 시도를 카운트하고, 3회 연속 실패 시 계좌를 잠급니다.
correct_pin = "1234"
attempts = 0
max_attempts = 3
is_authenticated = False
# 시뮬레이션 입력값 목록
simulated_inputs = ["0000", "1111", "1234"]
while attempts < max_attempts:
attempts += 1
input_pin = simulated_inputs[attempts - 1]
if input_pin == correct_pin:
is_authenticated = True
print(f"[{attempts}회차] 비밀번호 인증 성공! 안전하게 로그인되었습니다.")
break
else:
print(f"[{attempts}회차] 비밀번호 불일치! (남은 기회: {max_attempts - attempts}회)")
if not is_authenticated:
print("경고: 비밀번호 3회 오류로 인해 해당 계좌가 일시 잠금되었습니다.")예제 2: 2차원 중첩 루프를 활용한 구구단 표 생성
for 문 안에 또 다른 for 문을 중첩하여 행(Row)과 열(Column)의 2차원 데이터를 격자 형태로 처리합니다.
print("=== 2단부터 4단까지의 구구단 출력 ===")
for dan in range(2, 5): # 바깥 루프 (단수: 2, 3, 4)
print(f"\n--- [{dan}단] ---")
for i in range(1, 10): # 안쪽 루프 (곱하는 수: 1~9)
print(f"{dan} x {i} = {dan * i:2d}")핵심 개념 확인
- 반복 구조는 대용량 데이터 처리와 자동화 알고리즘의 심장입니다.
- 횟수가 명확할 때는
for문과range(), 조건에 따라 동적으로 돌아야 할 때는while문을 사용하는 것이 정석입니다. range(start, stop, step)에서stop값은 포함되지 않는다는 점을 항상 유의합니다.break는 루프를 완전히 파괴하고 탈출하며,continue는 이번 회차만 건너뛰고 다음 반복으로 넘어갑니다.