[Python 시리즈 4편] 조건문과 반복문으로 흐름 제어하기

English version

3편에서 변수와 자료형으로 데이터를 담고 꺼내는 감각을 익혔다면, 이제 그 데이터를 언제 어떻게 처리할지 결정해야 합니다. 조건문과 반복문은 프로그램 흐름을 제어하는 기본 도구이면서, 자동화 스크립트에서도 가장 자주 쓰이는 구문입니다. 이번 글에서는 iffor, while을 현실적인 시나리오와 함께 정리합니다.

이번 글에서 새로 나오는 용어

  1. 제어 흐름: 코드가 어떤 순서로 실행될지 결정하는 로직 전체를 가리키는 말
  2. iterable: for 문으로 순회할 수 있는 리스트·튜플·딕셔너리 같은 자료형을 통칭
  3. enumerate: 순회할 때 인덱스와 값을 동시에 꺼내 주는 Python 내장 함수
  4. break/continue: 반복문을 완전히 멈추거나 이번 회차만 건너뛰게 하는 제어 키워드

핵심 개념

학습 메모

  • 소요 시간: 45~60분
  • 준비물: 변수·자료형 다루기, uv run 실행 경험
  • 학습 목표: 조건문과 반복문으로 분기·반복 패턴을 작성해 재사용하기

조건문은 상황별로 행동을 나누고, 반복문은 같은 동작을 여러 번 수행합니다. 이 두 가지를 묶으면 대부분의 자동화 흐름을 설계할 수 있습니다.

코드로 따라하기

조건문 기본

temperature = 29

if temperature >= 30:
    print("에어컨 강풍 모드")
elif temperature >= 25:
    print("에어컨 약풍 모드")
else:
    print("환기만 하면 충분")

조건문은 위에서 아래로 평가되며, 첫 번째로 참이 되는 블록만 실행됩니다. 논리 연산자 and, or, not과 함께 쓰면 복합 조건을 쉽게 표현할 수 있습니다.

for 반복문

리스트나 튜플처럼 반복 가능한(iterable) 객체를 순회할 때 사용합니다.

logs = [
    {"status": 200, "path": "/health"},
    {"status": 500, "path": "/sync"},
    {"status": 200, "path": "/users"},
]

for log in logs:
    if log["status"] >= 400:
        print(f"⚠️ 오류 발생: {log['path']}")

enumerate()를 함께 쓰면 인덱스도 받을 수 있습니다. enumerate는 "몇 번째 요소인지"를 알려주는 내장 함수입니다.

for index, todo in enumerate(["보고서", "배포", "미팅"]):
    print(index, todo)

리스트 컴프리헨션

조건문과 반복문을 한 줄로 조합해 새로운 리스트를 만들 수 있습니다.

numbers = [1, 2, 3, 4, 5]
even_squares = [n ** 2 for n in numbers if n % 2 == 0]
print(even_squares)  # [4, 16]

while 반복문

반복 횟수가 정해져 있지 않을 때 조건을 기반으로 반복합니다.

countdown = 5

while countdown > 0:
    print(countdown)
    countdown -= 1

print("자동 배포 시작")

while을 사용할 때는 탈출 조건이 반드시 실행되도록 주의해야 합니다.

break와 continue

  • break: 반복을 완전히 멈춥니다.
  • continue: 현재 반복을 건너뛰고 다음 반복으로 넘어갑니다.
for status in [200, 200, 500, 200]:
    if status == 500:
        print("오류 발견, 모니터링 종료")
        break
    print("정상 상태")

미니 프로젝트: 간단한 재고 확인기

inventory = {
    "keyboard": 12,
    "mouse": 0,
    "monitor": 3,
}

alert_items = []

for name, count in inventory.items():
    if count <= 1:
        alert_items.append(name)

if not alert_items:
    print("모든 제품 재고 충분")
else:
    print("보충 필요:")
    for item in alert_items:
        print(f"- {item}")

이 예제는 for 반복과 조건문을 함께 쓰면서, 부족한 재고만 선택적으로 출력하는 패턴을 보여 줍니다.

실전 예시: 비동기 API 재시도 로직

실제 웹 서비스에서는 실패한 요청만 골라 재시도해야 할 때가 많습니다. 조건문과 반복문을 조합하면 아래처럼 구현할 수 있습니다.


async def fetch_with_retry(url: str, retries: int = 3):
    for attempt in range(1, retries + 1):
        response = await httpx.AsyncClient().get(url, timeout=5)
        if response.status_code == 200:
            return response.json()
        if attempt == retries:
            raise RuntimeError("최대 재시도 초과")
        await asyncio.sleep(2 * attempt)

data = asyncio.run(fetch_with_retry("https://school-api.example.com/health"))
print(data)

이 패턴은 나중에 Requests/Automation 편에서 다시 활용되지만, 조건·반복 로직을 미리 익혀 두면 훨씬 쉽게 이해할 수 있습니다.

왜 중요한가

조건문과 반복문은 오류 재시도, 모니터링, 자동화 리포트처럼 학교나 동아리에서도 바로 써먹을 수 있는 패턴입니다. for·while 흐름에 익숙해지면 이후 함수와 모듈을 나눌 때도 자연스럽게 분리 기준을 잡을 수 있습니다.

실습

  • 따라 하기: 재고 확인 예제를 그대로 입력하고 품목을 바꿔가며 조건 분기를 다른 메시지로 출력해 봅니다.
  • 확장하기: 반복문에서 continue를 활용해 status == 200 로그만 건너뛰는 간단한 모니터링 스크립트를 만들어 봅니다.
  • 디버깅: while 루프에 탈출 조건을 일부러 빼 무한 루프를 만든 뒤 카운터를 줄이거나 break를 추가해 복구합니다.
  • 완료 기준: 조건·반복 조합으로 최소 두 개의 분기 로직을 작성하고 실행 흐름을 설명할 수 있을 때입니다.

마무리

조건문과 반복문은 프로그램 흐름 전체를 이끌어 가는 요소입니다. 데이터를 순회하며 조건에 따라 분기하는 패턴에 익숙해지면 자연스럽게 함수로 코드를 나누고 재사용하는 습관을 갖게 됩니다. 다음 글에서는 함수와 모듈을 통해 코드를 더 구조적으로 나누는 방법을 살펴보겠습니다.

💬 댓글

이 글에 대한 의견을 남겨주세요