조건문과 반복문: 흐름을 설계하기

if, elif, else로 상황에 따라 다르게 움직이고, for와 while로 같은 일을 반복하는 법을 익혀요. 들여쓰기, 무한 반복, break와 continue, 그리고 숫자 맞히기 게임까지 만들어 봐요.

입문강의 3 / 6약 7분

지금까지 만든 프로그램은 위에서 아래로 한 번 흐르고 끝났어요. 현실의 일은 그렇지 않죠. "비가 오면 우산을 챙긴다", "숙제를 다 할 때까지 반복한다"처럼 조건에 따라 갈라지고 반복돼요. 이번 강의에서 배우는 조건문과 반복문은 프로그램에 판단력과 지구력을 주는 도구예요.

조건문: 갈림길 만들기

if

temperature = 31
if temperature >= 30:
    print("폭염이에요. 물을 자주 드세요.")
print("오늘의 날씨 안내를 마칩니다.")

if 뒤의 조건이 참(True)이면 아래에 들여쓴 줄을 실행하고, 거짓이면 건너뛰어요. 마지막 print는 들여쓰지 않았으니 조건과 상관없이 항상 실행돼요.

들여쓰기가 곧 문법이다

다른 언어는 중괄호로 범위를 묶지만, 파이썬은 들여쓰기로 묶어요. 같은 깊이로 들여쓴 줄들이 한 덩어리(블록)예요.

  • 콜론(:) 다음 줄부터 들여써요.
  • 관례는 공백 4칸이에요. VS Code에서 Tab을 누르면 자동으로 4칸이 들어가요.
  • 공백과 탭을 섞으면 IndentationError가 나요.

else와 elif

score = 82

if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "F"

print(f"점수 {score}점은 {grade}등급입니다.")

elif는 "앞의 조건이 거짓이면 이것도 확인해 봐"예요. 위에서부터 차례로 확인하다가 처음으로 참인 곳 하나만 실행하고 나머지는 건너뛰어요. 그래서 순서가 중요해요. 위 코드에서 score >= 70을 맨 앞에 두면 90점도 C가 돼요.

팁 조건이 여러 개일 때는 범위가 좁은(까다로운) 조건부터 위에 두세요. 넓은 조건이 먼저 오면 뒤의 조건은 영영 실행되지 않아요.

참으로 취급되는 값

조건에는 비교식이 아닌 값도 올 수 있어요. 파이썬은 이런 값들을 거짓으로 봐요.

  • 0, 0.0
  • 빈 문자열 ""
  • 빈 리스트 [], 빈 딕셔너리 등 빈 묶음
  • None, False

나머지는 모두 참이에요. 그래서 이런 코드가 자연스러워요.

name = input("이름: ")
if name:
    print(f"안녕하세요, {name}님")
else:
    print("이름을 입력하지 않았어요.")

for 반복문: 정해진 만큼 반복하기

range와 함께 쓰기

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

0, 1, 2, 3, 4가 찍혀요. range(5)는 0부터 5 앞까지의 숫자를 차례로 만들어 줘요. for는 그 숫자를 하나씩 i에 담아 블록을 실행해요.

쓰는 법만들어지는 숫자
range(5)0, 1, 2, 3, 4
range(1, 6)1, 2, 3, 4, 5
range(0, 10, 2)0, 2, 4, 6, 8
range(5, 0, -1)5, 4, 3, 2, 1

묶음을 하나씩 꺼내기

for는 숫자뿐 아니라 문자열, 리스트처럼 여러 값이 든 것이면 무엇이든 하나씩 꺼낼 수 있어요.

for ch in "파이썬":
    print(ch)

fruits = ["사과", "바나나", "포도"]
for fruit in fruits:
    print(f"{fruit} 좋아요")

번호도 같이 필요하면 enumerate를 써요.

for idx, fruit in enumerate(fruits, start=1):
    print(f"{idx}. {fruit}")

누적하기

반복문의 가장 흔한 쓰임은 값을 모으는 거예요.

total = 0
for n in range(1, 101):
    total += n        # total = total + n 과 같아요
print(total)          # 5050

+= 같은 축약 연산자는 -=, *=, /=도 있어요.

while 반복문: 조건이 참인 동안 반복하기

for는 몇 번 반복할지 알 때, while은 언제 끝날지 모를 때 써요.

balance = 10000
months = 0
while balance < 20000:
    balance = balance * 1.05   # 매달 5%씩 늘어난다면
    months += 1
print(f"{months}개월 뒤 두 배가 됩니다.")

무한 반복 조심하기

count = 0
while count < 5:
    print(count)
    # count += 1 을 빼먹으면 영원히 0을 찍어요

조건을 바꾸는 코드를 빼먹으면 프로그램이 끝나지 않아요. 터미널에서 Ctrl + C를 누르면 강제로 멈출 수 있어요. while을 쓸 때는 "이 반복은 무엇 때문에 언젠가 끝나는가"를 늘 확인하세요.

break와 continue

  • break: 반복을 즉시 끝내요.
  • continue: 이번 차례만 건너뛰고 다음 차례로 가요.
for n in range(1, 11):
    if n % 2 == 0:
        continue        # 짝수는 건너뛰기
    if n > 7:
        break           # 7보다 크면 그만
    print(n)            # 1, 3, 5, 7

while True와 break를 함께 쓰면 "원하는 입력이 들어올 때까지 계속 묻기" 같은 패턴을 만들 수 있어요.

while True:
    answer = input("계속할까요? (y/n): ")
    if answer in ("y", "n"):
        break
    print("y 또는 n으로 입력해 주세요.")

중첩: 반복 안의 반복

for dan in range(2, 10):
    for n in range(1, 10):
        print(f"{dan} x {n} = {dan * n}")
    print("-" * 12)

바깥 반복이 한 번 돌 때 안쪽 반복은 처음부터 끝까지 다 돌아요. 구구단은 8 × 9 = 72번 출력돼요. 중첩이 깊어질수록 반복 횟수가 곱으로 늘어나니, 데이터가 커지면 속도를 생각해야 해요. 이 감각은 알고리즘 트랙의 복잡도 강의로 이어져요.

실습: 숫자 맞히기 게임

컴퓨터가 1부터 100 사이의 숫자를 하나 정하고, 사용자가 맞힐 때까지 "더 커요", "더 작아요"를 알려 주는 게임을 만들어 봐요.

import random

secret = random.randint(1, 100)
tries = 0

print("1부터 100 사이의 숫자를 맞혀 보세요!")
while True:
    text = input("숫자: ")
    if not text.isdigit():
        print("숫자만 입력해 주세요.")
        continue
    guess = int(text)
    tries += 1
    if guess < secret:
        print("더 커요.")
    elif guess > secret:
        print("더 작아요.")
    else:
        print(f"정답! {tries}번 만에 맞혔어요.")
        break

새로 나온 것들을 짚어 볼게요.

  • import random: 파이썬에 기본으로 들어 있는 난수 도구를 불러와요. 모듈은 함수 강의에서 자세히 다뤄요.
  • random.randint(1, 100): 1 이상 100 이하의 정수 하나를 뽑아요.
  • text.isdigit(): 문자열이 숫자로만 되어 있는지 확인해요. 덕분에 "abc"를 입력해도 프로그램이 멈추지 않아요.

도전 과제

  1. 시도 횟수를 7번으로 제한하고, 넘으면 정답을 알려 주고 끝내 보세요.
  2. 게임이 끝나면 "한 판 더?"를 묻고, y면 새 숫자로 다시 시작하게 만들어 보세요.
  3. 매번 맞힐 수 있는 범위를 보여 주세요. 예를 들어 50을 불렀는데 더 크다면 "51 ~ 100 사이"처럼요.

생각해 볼 점 1부터 100 사이라면 최대 몇 번 만에 반드시 맞힐 수 있을까요? 매번 남은 범위의 한가운데를 부르면 7번이면 충분해요. 범위를 절반씩 줄이는 이 전략이 이진 탐색이고, 알고리즘 트랙에서 다시 만나요.

자주 하는 실수

  • 콜론 빠뜨리기. if, elif, else, for, while 줄 끝에는 반드시 :이 있어야 해요.
  • 들여쓰기 어긋남. 블록 안의 줄은 깊이가 정확히 같아야 해요.
  • range의 끝값 착각. range(1, 10)은 9까지예요. 10까지 원하면 range(1, 11)이에요.
  • while 조건을 바꾸지 않음. 무한 반복의 가장 흔한 원인이에요.
  • 반복 안에서 초기화. 합계 변수 total = 0을 반복 안에 두면 매번 0으로 돌아가요. 반복 밖, 위에 두세요.

점검 문제

  1. range(3, 12, 3)이 만드는 숫자는?
  2. 아래 코드는 무엇을 출력하나요?
x = 15
if x > 10:
    print("A")
elif x > 5:
    print("B")
else:
    print("C")
  1. 1부터 50까지 3의 배수의 합을 구하는 코드를 for로 써 보세요.
  2. break와 continue의 차이를 한 문장씩 설명해 보세요.

정답

  1. 3, 6, 9. 12는 포함되지 않아요.
  2. A만 출력돼요. 첫 조건이 참이라 나머지는 확인하지 않아요.
  3. 예시:
total = 0
for n in range(1, 51):
    if n % 3 == 0:
        total += n
print(total)   # 408
  1. break는 반복 전체를 끝내고, continue는 이번 차례만 건너뛰고 다음 차례로 넘어가요.

다음 강의

다음 강의에서는 함수와 모듈을 배워요. 같은 코드를 여러 번 복사해 붙이고 있다면 함수로 만들 때가 된 거예요. 코드를 이름 붙은 부품으로 나누면 프로그램이 커져도 길을 잃지 않아요.