파이썬 제어흐름 완벽 정리: 조건문과 반복문 기초 입문

읽기 예상 시간: 9분

반복되는 작업과 조건에 따른 분기를 처리하는 제어흐름의 개념을 확실하게 이해할 수 있어요. if/elif/else문을 사용해 조건에 맞게 프로그램이 다르게 동작하도록 만드는 방법을 알아봐요. 또한 for문과 while문을 상황에 맞게 선택하여 코드를 효율적으로 반복 실행하는 요령을 배웁니다. 들여쓰기 오류나 무한 루프 등 초보자가 제어문을 작성하며 자주 겪는 실수를 예방하는 팁도 챙겨가세요.

목차

갈림길에서 방향을 고민하는 로봇

1. 제어흐름이란? (프로그램이 생각하는 방식)

코드를 작성할 때 기본적으로 프로그램은 위에서 아래로 한 줄씩 순서대로 실행돼요. 이걸 순차적 실행이라고 부르는데요. 하지만 우리가 만드는 실제 프로그램이 항상 이렇게 일직선으로만 움직인다면 복잡한 문제를 절대 해결할 수 없어요.

예를 들어, 로그인을 시도할 때 비밀번호가 맞으면 환영 화면을 보여주고, 틀리면 경고창을 띄워야 하잖아요? 혹은 게시판에 있는 글 수백 개를 화면에 뿌려줘야 할 때 글을 띄우는 코드를 수백 번 직접 쓸 수는 없죠. 이렇게 조건에 따라 다르게 동작하게 하거나, 똑같은 작업을 여러 번 반복시키는 등 실행 순서를 우리 마음대로 조작하는 것을 바로 제어흐름이라고 불러요.

파이썬 기초 1-04 반복문 같은 입문 자료를 찾아보시면, 코드를 일일이 복사해서 붙여넣는 수작업이 실무에서 얼마나 끔찍한 비효율을 낳는지 아주 생생하게 설명되어 있어요. 만약 1부터 10까지 숫자를 출력해야 한다고 생각해 볼까요? 직접 10번 타이핑하는 것과 반복문을 사용하는 것의 차이를 눈으로 직접 비교해 보세요.

python
# Before: 직접 1부터 10까지 출력 (수작업)
print(1)
print(2)
# ... 이렇게 10번을 다 써야 해요.

# After: for 반복문을 사용해 10번 출력
for i in range(1, 11): # 1부터 10까지 범위를 만들어서 반복해요
    print(i) # 숫자를 화면에 보여줘요

코드가 놀라울 정도로 짧아졌죠? 10번 출력하는 건 손으로 할 수 있어도, 나중에 10만 번으로 대상을 바꿔야 한다면 반복문을 쓴 코드는 숫자 딱 하나만 수정하면 끝납니다. 이게 바로 코딩을 하는 진정한 이유예요.

홀로그램 학점이 떠 있는 시험지를 든 학생

2. 조건문 — if / elif / else와 동적 입력

“점수가 90점 이상이면 A, 80점 이상이면 B를 주자.” 일상생활에서 흔히 하는 이런 생각의 흐름을 컴퓨터에게 그대로 가르쳐주는 문법이 바로 조건문이에요. 파이썬에서는 아주 직관적인 영어 단어인 if, elif, else를 사용해서 이 분기 처리를 구현해요.

이때 파이썬만의 독특하고 정말 중요한 규칙이 있어요. 파이썬은 조건이 맞을 때 실행할 코드 덩어리, 즉 블록을 구분할 때 중괄호 {}를 쓰지 않고 무조건 들여쓰기를 사용해요. 스페이스바 4칸을 띄우는 것이 암묵적인 룰이에요.

⚠️ Warning

들여쓰기 칸 수가 1칸이라도 어긋나면 코드가 실행되다 말고 IndentationError를 뿜어내며 멈춰버려요. 조건문 뒤에는 항상 콜론(:)을 붙이고, 그 아래 실행할 코드는 반드시 4칸 들여쓰기 하는 것을 잊지 마세요.

조건식 자리에 대해 한 가지 팁을 드릴게요. 여기에는 무조건 TrueFalse 같은 불리언(Boolean) 값만 들어가야 하는 건 아니에요. 파이썬은 숫자 0, 비어 있는 문자열 "", 아무것도 없는 리스트 [] 같은 데이터들을 거짓(False)으로 취급해요. 그리고 비어있지 않은 나머지 값들은 전부 참(True)으로 평가한답니다. 이걸 현업에서는 Truthy / Falsy 속성이라고 불러요. 코드를 간결하게 짤 때 아주 유용해요.

이제 매번 코드를 직접 뜯어고칠 필요 없이, 파이썬 내장 함수 input()을 사용해서 터미널에서 직접 값을 입력받는 방식을 체험해 볼까요? 사용자가 점수를 직접 입력하고, 그 점수에 맞는 학점을 알려주는 깔끔한 프로그램이에요.

python
grade_calculator.py
# 사용자에게 점수를 입력받아 정수형(int)으로 변환해요
score_str = input("점수를 입력하세요: ")
score = int(score_str)

# 점수에 따라 다른 코드가 실행돼요
if score >= 90:
    grade = "A"  # 90점 이상이면 A
elif score >= 80:
    grade = "B"  # 90점 미만이고 80점 이상이면 B
else:
    grade = "F"  # 80점 미만이면 F

print("학점:", grade)
무한 루프 쳇바퀴를 도는 로봇 햄스터

3. while 반복문 — 조건이 참인 동안 계속

조건문을 확실히 잡았으니 이제 반복할 차례예요. 파이썬 반복문에는 크게 두 가지가 있는데, 먼저 살펴볼 것은 while문이에요. 이 문법은 주어진 조건이 True인 동안 블록 안의 코드를 끊임없이 반복해서 실행해요.

정확히 몇 번을 반복해야 할지 모르거나, 특정 상태에 도달할 때까지 무언가를 계속 동작시켜야 할 때 아주 요긴하게 쓰입니다. 예를 들어 게임에서 유저의 체력이 0이 될 때까지 게임을 계속 진행시키는 코드를 짤 때 딱이죠.

하지만 while문을 쓸 때 여러분이 목숨처럼 지켜야 할 철칙이 하나 있어요. 반복을 한 턴 마칠 때마다 조건을 변화시켜 주는 카운터 증가 로직을 반드시 챙겨야 한다는 점이에요. 이걸 빠뜨리면 끔찍한 일이 벌어집니다.

❗ 중요

카운터를 올리거나 조건을 거짓으로 만드는 장치가 없으면, 조건이 영원히 참이 되어 프로그램이 끝을 맺지 못하고 영영 갇혀버리는 무한 루프에 빠집니다. 컴퓨터 팬이 윙윙 돌아가며 터미널이 멈추는 걸 피하고 싶다면 꼭 확인하세요.

1부터 100까지의 숫자를 계속 더해나가는 안전한 코드를 함께 살펴볼게요.

python
sum_numbers.py
total = 0  # 합계를 저장할 빈 공간이에요
num = 1    # 1부터 시작할 거예요

# num이 100보다 작거나 같은 동안 계속 반복해요
while num <= 100:
    total += num  # total에 현재 num 값을 더해요
    num += 1      # num을 1 증가시켜요 (이게 없으면 영원히 1이라 무한히 반복돼요!)

print("1부터 100까지의 합:", total)

만약 실습을 하시다가 num += 1을 빼먹어서 실수로 무한 루프에 빠졌더라도 너무 당황하지 마세요. 터미널 창을 마우스로 클릭한 뒤, 키보드에서 Ctrl + C를 꾹 누르시면 됩니다. 그러면 파이썬이 즉시 KeyboardInterrupt 예외를 발생시켜서 폭주하던 프로그램을 강제로 종료해 줘요.

바구니에서 과일을 순서대로 꺼내는 기계 팔

4. for 반복문 — 리스트와 범위 순서대로 처리하기

while문을 알아봤으니, 이번에는 실무에서 압도적으로 훨씬 자주 쓰이는 for문에 대해 파헤쳐 볼게요. for문은 리스트나 문자열처럼 여러 개의 데이터를 담아둔 꾸러미에서 값을 하나씩 순서대로 꺼내서 처리할 때 쓰는 강력한 반복문이에요.

while문처럼 카운터를 직접 챙기지 않아도 되어서 초보자가 무한 루프를 낼 확률이 훨씬 적어요. 만약 당장 꺼내 쓸 데이터 꾸러미가 없는데 딱 정해진 횟수만큼만 반복하고 싶다면 파이썬 내장 함수인 range()를 활용하면 깔끔하게 해결됩니다.

📌 Note

range(시작, 끝)을 사용할 때 절대 잊지 말아야 할 점이 있어요. 뒤에 적는 '끝나는 숫자'는 범위에 포함되지 않습니다. 예를 들어 range(1, 6)이라고 적으면 1, 2, 3, 4, 5까지만 출력되고 6은 나오지 않아요.

데이터를 꺼낼 때 값뿐만 아니라 그 데이터가 몇 번째 위치에 있는지 순서 번호, 즉 인덱스도 같이 필요할 때가 많아요. 그럴 때는 enumerate() 함수를 감싸주면 아주 우아하게 처리할 수 있어요. 딕셔너리처럼 키(Key)와 값(Value)이 쌍으로 존재하는 데이터는 .items()를 붙여서 순회하면 양쪽 데이터를 동시에 편하게 꺼낼 수 있답니다.

python
for_loops.py
# 1. 리스트 순회: 리스트 안의 데이터를 하나씩 꺼내요
fruits = ["사과", "바나나", "포도"]
for fruit in fruits:
    print(fruit)

# 2. range() 함수: 1부터 5까지 숫자를 만들어요 (6은 포함 안 됨)
for i in range(1, 6):
    print(i)

# 3. enumerate(): 순서(인덱스)와 값을 같이 꺼내요
for index, fruit in enumerate(fruits):
    print(index, fruit)  # 0 사과, 1 바나나 ...

# 4. 딕셔너리 순회: 키(key)와 값(value)을 동시에 꺼내요
person = {"이름": "김파이썬", "나이": 25}
for key, value in person.items():
    print(key, value)
첨단 트랙에서 허들을 넘고 결승선을 통과하는 육상 선수
두 개의 문과 경고 표지판 앞에서 고민하는 프로그래머

5. 반복문 흐름 제어 및 응용

지금까지는 반복문이 시작되면 끝날 때까지 얌전히 돌아가게 두는 법만 살펴봤어요. 하지만 실전에서는 반복문을 중간에 멈추거나, 특정 상황에서만 건너뛰고 싶을 때가 빈번하게 발생해요. 이럴 때 코드의 흐름을 통제해 줄 세 가지 마법의 단어가 있습니다.

  • break: 반복문 안에서 이 단어를 만나면 그 즉시 반복문을 완전히 탈출해 버려요. 수많은 데이터 속에서 원하는 값을 딱 찾았을 때 더 반복할 필요가 없으니 효율을 높여주죠.
  • continue: 반복을 아예 끝내는 건 아니에요. 이번 턴의 남은 코드만 건너뛰고 바로 다음 반복으로 넘어가게 해줘요.
  • pass: 흐름을 바꾸지는 않고 아무것도 안 하며 자리만 채워둬요. 문법상 코드가 필요하지만 나중에 작성하려고 비워둘 때 유용한 임시 방편입니다.

파이썬에만 존재하는 독특하고 멋진 문법으로 for/else 구조도 있어요. 보통 else는 if 뒤에 붙지만, for문 뒤에 붙일 수도 있거든요. for문이 중간에 break로 멈추지 않고 끝까지 무사히 다 돌았을 때만 else 블록이 실행됩니다. 리스트에서 특정 값을 검색하다가 결국 못 찾았을 때 "결과 없음"을 처리하기에 아주 제격이에요.

또한, 엑셀 표를 처리하거나 게시판의 페이지를 넘기며 안의 글들을 확인해야 할 때처럼 반복문 안에 또 다른 반복문을 넣어야 하는 상황이 오는데, 이를 중첩 반복문이라고 부릅니다. 원리는 하나예요. 바깥쪽 반복문이 한 번 돌아갈 때, 안쪽 반복문은 처음부터 끝까지 전체를 다 돈다는 흐름만 기억하시면 절대 헷갈리지 않아요.

python
loop_control.py
# break 예제: 4를 만나면 반복을 아예 끝내버려요
numbers = [1, 3, 4, 5]
for n in numbers:
    if n == 4:
        break  # 여기서 반복문 탈출!
    print("숫자:", n)

# continue 예제: 짝수면 이번 턴을 건너뛰고 다음 숫자로 넘어가요
for i in range(1, 6):
    if i % 2 == 0:  # 짝수인지 확인해요
        continue
    print("홀수:", i)

# 중첩 반복문: 구구단 2단부터 3단까지 출력해요
for dan in range(2, 4):         # 바깥쪽 반복 (2, 3)
    for num in range(1, 10):    # 안쪽 반복 (1~9)
        print(f"{dan} x {num} = {dan * num}")

6. while vs for 선택 기준과 초보자 단골 실수

"어떨 때 for를 쓰고, 어떨 때 while을 써야 하나요?" 파이썬을 처음 배우시는 분들이 가장 많이 묻는 질문 중 하나예요. 명확한 기준을 세워드릴게요. 반복할 횟수가 정해져 있거나, 처리해야 할 리스트 같은 데이터 꾸러미가 있다면 무조건 for문을 쓰세요. 반대로 특정 조건이 만족될 때까지 기약 없이 계속해야 하거나, 몇 번 반복할지 알 수 없다면 while문을 선택하시면 됩니다.

이 두 가지를 활용하면서 초보자 시절에 누구나 한 번쯤 마주치는 악명 높은 실수 3가지가 있어요. 에러가 났을 때 당황하지 말고 아래 순서대로 차근차근 점검해 보세요.

1
무한 루프 점검하기

while문을 썼다면 내부에 카운터 증가 코드(예: count += 1)를 빼먹지 않았는지 가장 먼저 확인하세요.

2
들여쓰기 4칸 맞추기

에러 메시지에 IndentationError가 보인다면, 블록 내부의 들여쓰기 스페이스바 개수가 정확히 4칸으로 일치하는지 눈을 크게 뜨고 살펴보세요.

3
range 범위의 끝점 다시 생각하기

for문이 내가 원하는 횟수보다 한 번 덜 돌았다면 십중팔구 range()의 끝 숫자가 포함되지 않는다는 사실을 깜빡한 거예요.

python
common_mistakes.py
# 실수 1: while문 카운터 증가 누락 (무한 루프)
# count = 0
# while count < 5:
#     print(count)
#     # count += 1 이 줄이 없으면 무한 루프에 빠져요!

# 실수 2: 들여쓰기 불일치 (IndentationError)
score = 95
if score > 90:
    print("합격")
  # print("축하합니다") # 위 줄과 들여쓰기 칸 수가 안 맞아서 에러가 나요

# 실수 3: range 끝점 미포함
for i in range(5):
    pass  # 0, 1, 2, 3, 4 까지만 나옵니다. 5는 절대 안 나와요.

💡 Tip

코드를 작성하실 때 에디터(VSCode 등)를 사용하면 들여쓰기 오류를 시각적으로 미리 경고해 줍니다. 눈으로 찾기 힘들 땐 편집기의 도움을 적극적으로 받아보세요.

자주 묻는 질문

Q. 반복문을 쓰지 않고 복사-붙여넣기로 코드를 길게 쓰면 안 되나요?

1번 섹션에서 살펴본 Before & After 비교를 다시 한번 떠올려 보세요. 2번이나 3번 정도는 단순히 복사해서 쓰는 게 빠를지도 모릅니다. 하지만 100번, 1,000번 반복해야 하거나, 중간에 출력하는 내용을 조금 수정해야 한다면 어떨까요? 복사-붙여넣기 방식은 코드가 길어질수록 오류를 찾기도 기하급수적으로 힘들어지고, 나중에 유지보수하는 게 사실상 불가능에 가까워져요. 반복문을 쓰면 코드 단 몇 줄만으로 모든 걸 깔끔하게 해결할 수 있으니 무조건 익숙해지셔야 해요.

Q. 실습 중에 프로그램이 멈추지 않고 계속 돌아가요. 컴퓨터를 껐다 켜야 하나요?

아니요, 컴퓨터 전원을 끄실 필요는 전혀 없어요. 이건 while문에서 카운터 증가(예를 들어 count += 1) 구문을 빠뜨려서 조건이 영원히 참이 되는 '무한 루프'에 빠진 전형적인 상황이에요. 터미널이나 코드 에디터 창을 마우스로 클릭해서 활성화한 다음, 키보드에서 Ctrl + C를 동시에 누르세요. 그러면 파이썬이 강제로 KeyboardInterrupt를 발생시켜 프로그램을 아주 안전하게 멈춰줍니다.

Q. 예제 코드의 변수에 값이 고정되어 있는데, 제가 매번 원하는 값을 다르게 넣어서 테스트해 볼 수는 없나요?

물론 가능해요! 변수에 값을 고정해두지 않고 파이썬의 input() 함수를 사용하면, 프로그램을 실행할 때마다 사용자가 직접 값을 타자로 입력할 수 있게 만들 수 있어요. 2번 섹션에서 본 학점 계산기 예제처럼, 입력받은 값에 따라 조건문이 어떻게 다른 결과를 보여주는지 직접 코드를 고쳐보면서 확인해 보세요. 눈으로만 읽는 것보다 훨씬 재미있고 빠르게 실력이 늘어날 거예요.

이 글이 마음에 드세요?

RSS 피드를 구독하세요!

댓글 남기기