개념 이해

반복 구조의 본질: 인간과 컴퓨터의 차이

인간은 수천 번의 단순 계산을 반복하면 피로를 느끼고 실수를 범하지만, 컴퓨터는 수억 번의 반복 연산을 단 \(1\)밀리초의 오차도 없이 묵묵히 수행합니다.

반복 구조(Iteration/Loop)는 동일하거나 유사한 일련의 명령어 집합을 정해진 횟수만큼 또는 특정 조건이 만족되는 동안 되풀이하여 실행하도록 제어하는 프로그래밍 구조입니다.

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

그림 6-1. 반복 조건에 따른 반복 구조의 흐름


횟수 기반 반복문: for 문과 range() 함수

파이썬의 for 문은 리스트, 튜플, 문자열 등 순서가 있는 데이터 시퀀스(Sequence)의 원소를 처음부터 끝까지 하나씩 꺼내어 변수에 대입하며 반복합니다.

# 문자열의 각 글자 순회
for ch in "PYTHON":
    print(ch, end=" ")
# 출력 결과: P Y T H O N

range() 함수의 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

그림 6-2. range() 함수의 범위 지정 방식

중요range(start, stop)의 핵심: stop 값은 미포함(Exclusive)!

파이썬의 모든 범위 지정에서 종료값(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 문을 작성할 때는 반드시 종료 조건으로 수렴하는 상태 갱신 코드가 포함되어 있는지 점검해야 합니다.


반복의 흐름을 능동 제어하는 breakcontinue

제어 키워드 동작 방식 실생활 비유
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

그림 6-3. break와 continue의 제어 흐름

# 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}")

핵심 개념 확인

  1. 반복 구조는 대용량 데이터 처리와 자동화 알고리즘의 심장입니다.
  2. 횟수가 명확할 때는 for 문과 range(), 조건에 따라 동적으로 돌아야 할 때는 while을 사용하는 것이 정석입니다.
  3. range(start, stop, step)에서 stop 값은 포함되지 않는다는 점을 항상 유의합니다.
  4. break는 루프를 완전히 파괴하고 탈출하며, continue는 이번 회차만 건너뛰고 다음 반복으로 넘어갑니다.