A-3: 흐름 제어 — 조건에 따라 갈리고, 같은 일을 되풀이하기
목차 30
안녕하세요! 여러분의 파이썬 가이드, 홍순구 튜터입니다.
지난 시간엔 숫자로 계산하고, 글자를 자르고 다듬고 합쳤죠.
그리고 비교·논리 연산자로 True(참)·False(거짓)를 만들어냈고요.
"좋아요가 100 이상인가?" 같은 판단을 True/False 로 답하는 것까지 해봤어요.
그런데 그 참·거짓을 그냥 출력하고 끝내면 좀 아쉽죠. 오늘은 드디어 그 판단을 가지고 프로그램이 스스로 길을 고르게 만듭니다. "좋아요가 많으면 인기글로, 아니면 일반글로" 처럼요. 그리고 같은 일을 여러 번 되풀이하는 반복도 배웁니다. 오늘부터 프로그램이 판단하고 반복하기 시작해요.
오늘 우리는 이런 길을 따라갑니다.
오늘의 여정 — A-3 (총 8 단계)
1. 들여쓰기 = 블록 파이썬이 코드 묶음을 나누는 법
2. if · else 첫 갈림길
3. elif 여러 갈래로 (좋아요 등급)
4. in 안에 들어있나 확인
5. for · range 정해진 횟수만큼 반복
6. while 조건이 참인 동안 반복
7. break · continue 반복을 멈추거나 건너뛰기
8. 종합 — 피드 훑기 오늘 배운 걸 한데 모아
앞쪽 1~4단계는 '갈림길'(조건문), 뒤쪽 5~8단계는 '되풀이'(반복문)예요. 한꺼번에 외우려 하지 말고, 직접 실행해 보면서 하나씩 익혀가요.
💡 오늘 수업의 핵심 — "조건에 따라 갈림길을 만들고(if), 같은 일을 되풀이하기(for·while)"
🎯 학습 목표
- 파이썬의 들여쓰기 규칙을 이해하고,
if/elif/else로 조건에 따라 다른 길로 가는 프로그램을 만들 수 있다 in으로 어떤 값이 안에 들어있는지 확인할 수 있다for/range와while로 같은 일을 반복하고,break/continue로 반복을 제어할 수 있다- 반복과 조건문을 함께 써서 여러 게시물을 훑으며 처리하는 흐름을 만들 수 있다
Step 1: "파이썬이 코드를 묶는 법 — 들여쓰기 = 블록"
지금까지 우리가 짠 코드는 위에서 아래로 한 줄씩 순서대로 실행됐어요. 그런데 오늘부터는 "조건이 맞으면 이 줄들만 실행해라" 처럼 여러 줄을 한 묶음으로 다뤄야 해요. 이 묶음을 블록(block)이라고 부르는데, 파이썬은 이 블록을 아주 독특한 방법으로 표시합니다.
다른 많은 언어는 중괄호 {} 로 블록을 감싸요.
하지만 파이썬은 중괄호 대신 들여쓰기(앞 공백) 로 블록을 묶습니다.
같은 만큼 들여쓴 줄들이 한 블록이 되는 거예요.
코드부터 실행해 봅시다.
# src/a_intro/a3_indent_intro.py
# 흐름 제어: 코드가 "위에서 아래로 한 줄씩"을 넘어 갈림길과 반복으로 흐른다
# 파이썬은 중괄호 {} 대신 들여쓰기(4칸)로 블록을 묶는다
likes = 1200
# if 조건이 True이면, 아래로 들여쓴 블록이 실행된다
if likes >= 1000:
print("인기 게시물!") # 4칸 들여쓰기 = if에 속한 블록
print("많은 분이 좋아했어요") # 같은 들여쓰기 = 같은 블록
print("게시물 확인 끝") # 들여쓰기 없음 = if 바깥, 항상 실행됨
▶ 버튼으로 실행하거나 터미널에서 uv run python src/a_intro/a3_indent_intro.py 를 입력하면 이렇게 나와요.
인기 게시물!
많은 분이 좋아했어요
게시물 확인 끝
코드를 한 줄씩 읽어볼게요.
if likes >= 1000: 줄 끝에 콜론(:)이 붙었죠?
이 콜론은 "지금부터 아래 들여쓴 줄들을 묶겠다" 는 신호예요.
그 아래 4칸 들여쓴 두 줄(print 두 개)이 if 에 속한 블록이고요.
likes 가 1200이라 1000 이상 이 참(True)이니, 이 블록이 실행돼 두 줄이 찍혔어요.
마지막 print("게시물 확인 끝") 은 들여쓰기가 없죠?
그래서 if 와 상관없는 바깥 줄이고, 조건과 무관하게 항상 실행됩니다.
에러는 친구 — 들여쓰기를 빠뜨리면?
지난 시간에 "에러는 친구" 라고 했죠. 일부러 들여쓰기를 빼먹어 보고, 파이썬이 뭐라고 하는지 들어봅시다.
# src/a_intro/a3_indent_error.py
# 들여쓰기를 빠뜨리면 어떤 일이 생기는지 보여주는 에러 데모
# 실행하면 IndentationError로 멈춘다 (일부러 만든 에러예요)
likes = 1200
if likes >= 1000:
print("인기 게시물!") # if 다음 줄인데 들여쓰기를 안 해서 파이썬이 블록을 못 찾는다
실행하면 빨간 메시지가 떠요.
File ".../a3_indent_error.py", line 7
print("인기 게시물!") # if 다음 줄인데 들여쓰기를 안 해서 파이썬이 블록을 못 찾는다
^^^^^
IndentationError: expected an indented block after 'if' statement on line 6
IndentationError 는 "들여쓰기(Indentation)가 잘못됐어요" 라는 뜻이에요.
메시지 "expected an indented block after 'if' statement" 는 "if 다음에 들여쓴 블록이 와야 하는데 없네요" 라는 거고요.
콜론으로 끝난 줄 다음엔 반드시 들여쓴 블록이 따라와야 한다는 약속을 어겨서 난 에러예요.
💡 한 줄 정리
파이썬은 들여쓰기(4칸)로 코드 묶음(블록)을 표시해요. if 처럼 콜론(:)으로 끝나는 줄 다음엔 반드시 들여쓴 블록이 와야 합니다.
🙋 학생 질문 — "들여쓰기는 꼭 4칸이어야 하나요? 2칸은 안 되나요?"
사실 칸 수를 파이썬이 강제하진 않아요.
2칸이든 4칸이든 "한 블록 안에서 일정하기만" 하면 동작해요. 다만 파이썬 공식 권장이 4칸이고, 거의 모든 파이썬 코드가 4칸을 써요.
VS Code 에서 Tab 키를 누르면 자동으로 공백 4칸이 들어가니 그대로 쓰면 편해요. 한 블록 안에서 4칸과 2칸을 섞으면 에러가 나니 그것만 조심하면 됩니다.
Step 2: "첫 갈림길 — if 와 else"
지난 시간 비교·논리 연산자로 만든 True/False 기억하죠?
likes >= 100 같은 판단이 참 아니면 거짓을 돌려줬어요.
오늘 그 참·거짓으로 진짜 갈림길을 만듭니다.
조건이 참이면 이쪽 길, 거짓이면 저쪽 길로 가게요.
if(만약) 와 else(아니면) 를 쓰면 둘 중 하나는 반드시 실행되는 갈림길이 됩니다.
# src/a_intro/a3_if_else.py
# if / else — 조건이 True면 if 블록, 아니면 else 블록이 실행된다
# 둘 중 하나는 반드시 실행되는 갈림길
likes = 320
if likes >= 1000:
print("인기 게시물!")
else:
print("아직 성장 중인 게시물")
print("---")
# A-2에서 배운 비교 연산자(>=, <)가 그대로 if의 조건이 된다
followers = 5000
if followers >= 10000:
print("인플루언서 계정")
else:
print("일반 사용자 계정")
실행하면 이렇게 나와요.
아직 성장 중인 게시물
---
일반 사용자 계정
likes 가 320이죠.
320 >= 1000 은 거짓(False)이라, if 블록은 건너뛰고 else 블록이 실행돼 "아직 성장 중인 게시물" 이 찍혔어요.
else 에는 조건이 없죠?
if 조건이 거짓일 때 "그게 아니면 무조건" 실행되거든요.
여기서 핵심은, if 의 조건 likes >= 1000 이 바로 지난 시간 배운 비교 연산자라는 점이에요.
그때 만든 참·거짓이 오늘 갈림길의 재료가 된 거죠.
💡 한 줄 정리
if 조건: 은 조건이 참(True)일 때 그 아래 블록을, else: 는 거짓일 때 블록을 실행해요. 조건에는 지난 시간 비교·논리 연산자가 그대로 들어갑니다.
🙋 학생 질문 — "else 는 꼭 써야 하나요? if 만 쓰면 안 되나요?"
else 는 선택이에요!
"조건이 참일 때만 뭔가 하고, 아니면 아무것도 안 한다" 면 if 만 써도 돼요. 예를 들어 "좋아요가 1000 이상이면 축하 메시지만 띄운다" 라면 if 블록 하나면 충분하죠.
else 는 "거짓일 때 따로 할 일이 있을 때만" 붙이면 됩니다.
Step 3: "여러 갈래로 — elif 와 좋아요 등급"
if/else 는 길이 둘뿐이에요.
그런데 좋아요 수를 "인기 폭발 / 인기 / 성장 중 / 조용한 게시물" 처럼 네 등급으로 나누고 싶다면?
갈래가 셋 이상일 때 쓰는 게 elif 예요. "else if"(아니면 만약) 를 줄인 말이죠.
# src/a_intro/a3_elif_grade.py
# elif — 갈래가 셋 이상일 때. 위에서부터 차례로 검사해 처음 맞는 곳만 실행된다
# 한 번 맞으면 나머지 elif/else는 건너뛴다
likes = 4500
if likes >= 10000:
grade = "인기 폭발"
elif likes >= 1000:
grade = "인기"
elif likes >= 100:
grade = "성장 중"
else:
grade = "조용한 게시물"
print(f"좋아요 {likes}개 → {grade}")
# 주의: 조건은 위에서부터 순서대로 검사된다
# 만약 >= 100을 맨 위에 두면, 1000도 10000도 전부 거기서 걸려버린다
실행 결과예요.
좋아요 4500개 → 인기
파이썬은 위에서부터 차례로 조건을 검사해요.
likes 가 4500일 때, 먼저 10000 이상? 을 보는데 아니죠.
다음 1000 이상? 을 보니 참이에요. 그래서 grade = "인기" 가 실행되고, 나머지 elif/else 는 싹 건너뜁니다.
각 등급이 실제로 어떤 범위를 맡는지 정리하면 이래요.
| 좋아요 수 | 등급 |
|---|---|
| 10000 이상 | 인기 폭발 |
| 1000 ~ 9999 | 인기 |
| 100 ~ 999 | 성장 중 |
| 99 이하 | 조용한 게시물 |
여기서 조건의 순서가 아주 중요해요.
만약 100 이상? 을 맨 위에 두면, 4500도 100 이상이고 99999도 100 이상이라 전부 거기서 걸려 "성장 중" 이 돼버려요.
그래서 좁은 범위(큰 수)부터 위에 두는 게 안전합니다.
💡 한 줄 정리
elif 는 갈래가 셋 이상일 때 써요. 위에서부터 차례로 검사해 처음 참이 되는 블록 하나만 실행하고 나머지는 건너뜁니다. 그래서 조건의 순서가 중요해요.
🙋 학생 질문 — "elif 와 그냥 if 를 여러 개 쓰는 건 뭐가 달라요?"
큰 차이가 있어요!
if ... elif ... elif 는 하나로 묶인 갈림길이라, 처음 맞는 곳 하나만 실행하고 끝나요.
반면 if 를 따로따로 여러 개 쓰면 각각 독립적으로 전부 검사해요.
좋아요가 4500일 때, elif 로 묶으면 "인기" 하나만 나오지만, if 를 따로 쓰면 >= 1000 도 참이고 >= 100 도 참이라 둘 다 실행돼버려요.
"이 중 하나만 골라야" 하는 상황이면 elif 로 묶는 게 맞습니다.
Step 4: "안에 들어있나 확인 — in"
"이 캡션에 '광고' 라는 단어가 들어있나?" 같은 걸 확인하고 싶을 때가 있어요.
이때 쓰는 게 in 연산자예요.
어떤 값이 안에 들어있으면 True, 없으면 False 를 돌려줍니다.
# src/a_intro/a3_in_membership.py
# in — 어떤 값이 안에 들어있는지 확인한다 (결과는 True 또는 False)
# 문자열 안에 특정 글자/단어가 있는지 검사할 때 자주 쓴다
caption = "오늘 받은 신상 광고예요 #협찬"
if "광고" in caption:
print("광고가 포함된 캡션이에요")
else:
print("일반 캡션이에요")
# 글자 하나가 들어있는지도 똑같이 확인할 수 있다
if "#" in caption:
print("해시태그가 들어있네요")
# in의 결과 자체는 True / False 값이다 (A-2 비교 결과와 같은 종류)
print("광고 포함 여부:", "광고" in caption)
실행하면 이렇게 나와요.
광고가 포함된 캡션이에요
해시태그가 들어있네요
광고 포함 여부: True
"광고" in caption 은 "caption 안에 '광고' 가 있니?" 라고 묻는 거예요.
실제로 있으니 True → if 블록이 실행돼 "광고가 포함된 캡션이에요" 가 찍혔죠.
글자 하나("#")가 있는지도 똑같이 확인할 수 있고요.
맨 아래 줄을 보면, in 의 결과 자체가 True 라는 값이라는 게 보여요.
지난 시간 비교 연산자(==, >=)가 만든 참·거짓과 똑같은 종류라, in 도 if 와 짝지어 자주 씁니다.
참고로 print 에 콤마(,)로 여러 개를 넘기면, 사이에 띄어쓰기를 넣어 이어서 출력해 줘요.
💡 한 줄 정리
값 in 대상 은 대상 안에 값이 들어있으면 True, 없으면 False 를 줘요. 문자열에 특정 단어·글자가 있는지 확인할 때 if 와 자주 함께 씁니다.
🙋 학생 질문 — "in 은 문자열에서만 쓸 수 있나요?"
아니에요, in 은 "여러 개가 담긴 것" 이라면 두루 쓸 수 있어요.
지난 시간 split 으로 만든 그 조각 묶음(리스트)에서도 "이 태그가 목록에 있나?" 를 in 으로 확인할 수 있어요.
그런 그릇은 다음 카테고리에서 본격적으로 배우는데, 거기서도 in 이 똑같이 "안에 있나?" 를 물어보는 친구로 다시 등장해요.
지금은 "문자열 안에 단어가 있나" 정도로 익혀두면 충분합니다.
Step 5: "정해진 횟수만큼 반복 — for 와 range"
같은 일을 여러 번 해야 할 때, 코드를 복사-붙여넣기 하면 지저분하죠.
"게시물 3개를 차례로 불러와라", "해시태그를 하나씩 꺼내라" 처럼 되풀이할 땐 반복문을 써요.
가장 많이 쓰는 게 for 반복문입니다.
먼저 짝꿍인 range 부터 짚을게요.
range(n) 은 0부터 n 직전까지 숫자를 차례로 내주는 도구예요.
# src/a_intro/a3_for_range.py
# for + range — 정해진 횟수만큼 반복한다
# range(3)은 0, 1, 2를 차례로 내준다
for i in range(3):
print(f"{i}번째 게시물 불러오는 중...")
print("---")
# 문자열도 한 글자씩 순회할 수 있다
for char in "love":
print(char)
print("---")
# A-2에서 split()으로 쪼갠 해시태그를, 이제 for로 하나씩 꺼낸다
# 여러 개를 담는 "그릇"(리스트)은 다음 모듈에서 깊이 다룬다 — 지금은 순회만
caption = "#일상 #카페 #감성"
for tag in caption.split():
print(f"태그: {tag}")
실행하면 이렇게 나와요.
0번째 게시물 불러오는 중...
1번째 게시물 불러오는 중...
2번째 게시물 불러오는 중...
---
l
o
v
e
---
태그: #일상
태그: #카페
태그: #감성
for i in range(3): 은 i 가 0, 1, 2 로 바뀌며 블록을 세 번 반복해요.
range(3) 이 3이 아니라 2까지인 건, 지난 시간 슬라이싱 [0:4] 가 4 직전까지였던 것과 같은 약속이에요.
0부터 세니 0, 1, 2 해서 딱 3개죠.
for char in "love": 는 문자열을 한 글자씩 꺼내 와요.
그리고 마지막이 핵심이에요.
지난 시간 split() 으로 캡션을 조각냈는데, 그땐 for 를 안 배워서 통째로만 봤죠.
이제 for tag in caption.split(): 로 그 조각을 하나씩 꺼낼 수 있어요.
for 가 한 바퀴 돌 때마다 변수에 다음 값이 담기는 모습을 그려보면 이래요.
caption.split() = "#일상", "#카페", "#감성" (조각 3개)
for tag in ...: 한 바퀴마다 tag 에 다음 조각이 담긴다
1바퀴 → tag = "#일상" → "태그: #일상"
2바퀴 → tag = "#카페" → "태그: #카페"
3바퀴 → tag = "#감성" → "태그: #감성"
여러 개를 담는 그릇(리스트)은 다음 카테고리에서 깊이 다루니, 지금은 "for 로 하나씩 꺼내 순회한다" 만 익히면 충분해요.
💡 한 줄 정리
for 변수 in 대상: 은 대상에서 값을 하나씩 꺼내 변수에 담으며 블록을 반복해요. range(n) 은 0부터 n 직전까지 숫자를 내주고, 문자열이나 split 결과처럼 여러 개가 담긴 것도 하나씩 순회할 수 있어요.
🙋 학생 질문 — "for i in range(3) 의 i 는 꼭 i 여야 하나요?"
아니에요, 아무 이름이나 괜찮아요!
for count in range(3) 처럼 뜻이 담긴 이름을 써도 똑같이 동작해요.
다만 "그냥 횟수만 셀 때" 는 i(index 의 첫 글자) 를 쓰는 게 오래된 관습이라 많은 코드가 i 를 써요.
반대로 의미가 분명할 땐(for tag in ...) tag 처럼 내용을 알려주는 이름을 쓰면 코드가 훨씬 읽기 좋아진답니다.
Step 6: "조건이 참인 동안 반복 — while"
for 는 "정해진 횟수" 만큼 돌았죠.
그런데 "몇 번일지 모르지만 조건이 풀릴 때까지" 반복하고 싶을 때가 있어요.
"카운트다운이 0이 될 때까지", "좋아요가 목표치를 넘을 때까지" 처럼요.
이때 쓰는 게 while 이에요. while 조건: 은 조건이 참인 동안 블록을 계속 반복합니다.
# src/a_intro/a3_while.py
# while — 조건이 True인 동안 블록을 계속 반복한다
# for가 "정해진 횟수"라면, while은 "조건이 풀릴 때까지"
count = 3
while count > 0:
print(f"{count}초 후 업로드...")
count = count - 1 # 이 줄을 빠뜨리면 count가 영원히 3이라 무한 루프!
print("업로드 완료!")
print("---")
# 조건을 언젠가 False로 만드는 것이 핵심이다
# 아래는 좋아요가 목표치를 넘을 때까지 1씩 늘려보는 예
likes = 97
while likes < 100:
likes = likes + 1
print(f"드디어 좋아요 {likes}개 달성")
실행하면 이렇게 나와요.
3초 후 업로드...
2초 후 업로드...
1초 후 업로드...
업로드 완료!
---
드디어 좋아요 100개 달성
count 가 3에서 시작해요.
count > 0 이 참인 동안 블록을 반복하는데, 매 바퀴 count 를 1씩 줄여요.
그래서 3, 2, 1 을 찍고, count 가 0이 되면 조건이 거짓이 되어 반복이 멈춥니다.
여기서 가장 중요한 건, 조건을 언젠가 거짓으로 만들어야 한다 는 점이에요.
count 를 줄이는 줄을 빠뜨리면 조건이 영원히 참이라 끝없이 반복돼요.
⚠️ 무한 루프 주의:
while의 조건이 영원히 참이면 프로그램이 멈추지 않고 계속 돌아요. 위에서count를 줄이는 줄을 빼먹으면 "3초 후 업로드..." 가 끝없이 찍힙니다. 실수로 무한 루프에 빠지면 터미널에서 Ctrl + C 를 눌러 멈출 수 있어요.
for 와 while 을 언제 쓰는지 한눈에 정리하면 이래요.
| for | while | |
|---|---|---|
| 언제 쓰나 | 반복 횟수를 알 때 | 조건이 풀릴 때까지 |
| 예 | 게시물 3개, 글자 하나씩 | 좋아요 100 넘을 때까지 |
💡 한 줄 정리
while 조건: 은 조건이 참인 동안 블록을 계속 반복해요. 반드시 조건을 언젠가 거짓으로 만들어야 멈춥니다(안 그러면 무한 루프). 횟수를 알면 for, 조건으로 멈추려면 while 이 편해요.
🙋 학생 질문 — "for 로 할 수 있는 걸 while 로도 할 수 있나요? 뭘 써야 할지 모르겠어요."
네, 사실 둘은 서로 흉내 낼 수 있어요. 하지만 고르는 기준은 간단해요.
"몇 번 반복할지 미리 알면 for, 모르면 while".
게시물 3개를 처리하거나 글자를 하나씩 볼 땐 개수가 정해져 있으니 for 가 깔끔해요.
반대로 "사용자가 올바른 값을 넣을 때까지", "목표치를 넘을 때까지" 처럼 횟수를 모를 땐 while 이 자연스럽고요.
처음엔 헷갈려도 코드를 짜다 보면 금방 감이 옵니다.
Step 7: "반복을 멈추거나 건너뛰기 — break 와 continue"
반복을 돌다가 "어떤 조건이면 즉시 멈추고 싶다" 거나, "이번 것만 건너뛰고 다음으로 가고 싶다" 할 때가 있어요.
금지어를 발견하면 검사를 중단한다거나, 협찬 태그만 빼고 보여준다거나 하는 상황이죠.
이때 쓰는 게 break(멈춤) 와 continue(건너뛰기) 예요.
# src/a_intro/a3_break_continue.py
# break — 반복을 즉시 멈추고 빠져나온다
# continue — 이번 회차만 건너뛰고 다음 회차로 넘어간다
tags = "#일상 #광고 #카페 #협찬 #감성".split()
# break: 광고 태그를 만나면 검사를 중단한다
for tag in tags:
if tag == "#광고":
print("광고 태그 발견! 검사 중단")
break
print(f"검사 통과: {tag}")
print("---")
# continue: 협찬 태그는 건너뛰고 나머지만 보여준다
for tag in tags:
if tag == "#협찬":
continue
print(f"보여줄 태그: {tag}")
print("---")
# for-else (가볍게): break 없이 끝까지 다 돌면 else 블록이 실행된다
clean_tags = "#일상 #카페".split()
for tag in clean_tags:
if tag == "#광고":
print("광고 발견")
break
else:
print("광고 없는 깨끗한 게시물")
실행하면 이렇게 나와요.
검사 통과: #일상
광고 태그 발견! 검사 중단
---
보여줄 태그: #일상
보여줄 태그: #광고
보여줄 태그: #카페
보여줄 태그: #감성
---
광고 없는 깨끗한 게시물
첫 번째 반복은 break 예요.
#일상 은 통과 출력되고, #광고 를 만나는 순간 "발견! 중단" 을 찍고 break 로 반복을 통째로 끝내요.
그래서 뒤의 #카페, #협찬, #감성 은 검사조차 안 했죠.
두 번째는 continue 예요.
태그를 하나씩 보다가 #협찬 이면 continue 로 그 바퀴의 print 만 건너뛰고 다음 바퀴로 가요.
그래서 #협찬 하나만 빠지고 나머지 넷이 출력됐어요.
둘의 차이를 한 줄로 정리하면 이래요.
break → 반복을 통째로 끝내고 빠져나간다 (남은 바퀴는 안 돈다)
continue → 이번 바퀴만 건너뛰고 다음 바퀴로 넘어간다 (반복은 계속)
마지막은 for ... else 예요. 흔히 쓰진 않으니 가볍게만 봐두세요.
for 에 else 를 붙이면, 반복이 break 없이 끝까지 다 돌았을 때만 else 가 실행돼요.
clean_tags 엔 #광고 가 없어 break 가 안 걸리니, 끝까지 돈 뒤 "광고 없는 깨끗한 게시물" 이 찍혔습니다.
💡 한 줄 정리
break 는 반복을 즉시 끝내고 빠져나와요. continue 는 이번 바퀴만 건너뛰고 다음 바퀴로 넘어가요. for ... else 의 else 는 break 없이 끝까지 다 돌았을 때만 실행돼요(가볍게 알아두기).
🙋 학생 질문 — "break 랑 continue, 헷갈려요. 쉽게 외우는 법 없을까요?"
단어 뜻으로 기억하면 쉬워요.
break 는 "부수다 / 중단" 이라 반복 자체를 끝내버리고 빠져나와요.
continue 는 "계속하다" 라 반복은 이어가되 이번 바퀴만 건너뛰고 다음으로 가요.
영화로 비유하면, break 는 영화관을 아예 나가버리는 것, continue 는 지금 장면만 빨리감기로 넘기고 계속 보는 거예요.
Step 8: "종합 — 피드 훑으며 등급 매기기"
자, 오늘 배운 걸 한데 모아봅시다.
여러 게시물의 좋아요 수를 하나씩 훑으면서(for) 각각 등급을 매기는(if/elif/else) 프로그램이에요.
인스타 피드를 쭉 내리며 인기글을 가려내는 느낌이죠.
# src/a_intro/a3_feed_review.py
# 종합: 여러 게시물의 좋아요 수를 하나씩 훑으며 등급을 매긴다
# for(순회) + if/elif/else(갈림길) + split·int(A-2)를 한자리에 모았다
# 여러 개를 담는 "그릇"(리스트)은 다음 모듈에서 본격적으로 다룬다 — 지금은 순회만
likes_data = "8900 320 15000 87".split()
for likes_str in likes_data:
likes = int(likes_str) # split 결과는 글자라 계산하려면 int로 변환 (A-2)
if likes >= 10000:
grade = "인기 폭발"
elif likes >= 1000:
grade = "인기"
elif likes >= 100:
grade = "성장 중"
else:
grade = "조용한 게시물"
print(f"좋아요 {likes}개 → {grade}")
실행하면 이렇게 나와요.
좋아요 8900개 → 인기
좋아요 320개 → 성장 중
좋아요 15000개 → 인기 폭발
좋아요 87개 → 조용한 게시물
흐름을 따라가 볼게요.
likes_data 는 split 으로 만든 좋아요 수 조각들("8900", "320", ...)이에요.
for 로 하나씩 꺼낸 뒤, int() 로 숫자로 바꿔요. 지난 시간 배웠듯 split 결과는 글자라 계산하려면 변환이 필요하죠.
그리고 Step 3에서 만든 등급 매기기(if/elif/else)를 그대로 적용했어요.
오늘 배운 반복(for)과 갈림길(if/elif/else)이, 지난 시간의 split·int 와 자연스럽게 맞물려 하나의 흐름이 됐죠.
이게 바로 "목록을 훑으며 하나씩 처리하는" 실전 패턴이에요.
💡 한 줄 정리
반복(for)으로 여러 값을 하나씩 꺼내고, 갈림길(if/elif/else)로 각각을 판단하면 "목록을 훑으며 처리하는" 실전 흐름이 완성돼요. 여기에 지난 시간의 split·int 까지 자연스럽게 맞물립니다.
🙋 학생 질문 — "좋아요 수를 왜 '8900 320 ...' 글자로 묶어 split 하나요? 숫자 여러 개를 바로 못 쓰나요?"
좋은 눈썰미예요!
사실 여러 숫자를 한꺼번에 담는 더 자연스러운 그릇이 있어요. 바로 다음 카테고리에서 배울 '리스트' 랍니다.
지금은 아직 그 그릇을 정식으로 안 배웠으니, 지난 시간에 익힌 split 으로 "글자 하나를 여러 조각으로 나누는" 방법을 빌려 쓴 거예요.
다음 시간에 리스트를 배우면 [8900, 320, 15000, 87] 처럼 숫자를 바로 담아 더 깔끔하게 순회할 수 있어요.
오늘은 "for 로 여러 개를 훑는다" 는 흐름에 집중하면 충분합니다.
마무리
오늘 프로그램이 스스로 판단하고 반복하기 시작했어요. 조건문과 반복문은 앞으로 짜는 거의 모든 코드에 등장하는 뼈대랍니다. 고생 많으셨어요.
오늘 배운 핵심 세 가지
💡 하나: 파이썬은 들여쓰기(4칸)로 코드 묶음(블록)을 나누고, if/elif/else 로 조건에 따라 갈림길을 만들었어요. 지난 시간의 비교·논리 True/False 가 그 조건의 재료였죠.
💡 둘: in 으로 "안에 들어있나" 를 확인하고, for/range 와 while 로 같은 일을 되풀이했어요. 횟수를 알면 for, 조건으로 멈추려면 while.
💡 셋: break(멈춤)·continue(건너뛰기) 로 반복을 세밀하게 제어하고, 마지막엔 for + if/elif/else 를 모아 피드를 훑으며 등급을 매겼어요.
다음 시간 예고
다음 시간엔 "리스트(list)" 를 배웁니다.
오늘 좋아요 수를 "8900 320 ...".split() 으로 빙 둘러 만들었던 거 기억하죠?
다음 시간엔 [8900, 320, 15000, 87] 처럼 여러 값을 바로 담는 그릇을 정식으로 배워요.
값을 더하고(append), 정렬하고(sort), 꺼내는(pop) 방법까지요.
오늘 익힌 for 순회가 그 리스트와 만나면 진짜 강력해진답니다.
게시물 목록을 자유자재로 다루기 시작해요. 기대해 주세요!
과제
오늘 배운 조건문(if/elif/else)과 반복문(for/while)을 직접 손으로 익혀봅시다.
눈으로 본 것과 직접 짜보는 것은 완전히 다르답니다.
[기초] 좋아요 등급 판정기
좋아요 수 하나를 받아 등급을 출력하는 프로그램을 만들어 보세요.
- 좋아요 수를 변수에 담습니다 (또는
input()으로 받아int()로 변환합니다) if/elif/else로 등급을 나눕니다: 10000 이상 "인기 폭발", 1000 이상 "인기", 100 이상 "성장 중", 그 외 "조용한 게시물"- f-string 으로 "좋아요 N개 → 등급" 형태로 출력합니다
- 좋아요 수를 여러 값으로 바꿔가며 네 등급이 모두 나오는지 확인해 보세요
[응용] 캡션 금지어 검사기
캡션의 해시태그를 하나씩 검사해, 금지어가 있으면 즉시 잡아내는 프로그램을 만들어 보세요.
- 해시태그가 섞인 캡션을 하나 준비하고
split()으로 태그를 나눕니다 for로 태그를 하나씩 꺼내며, 금지어(예:"#광고")와 같은지if로 검사합니다- 금지어를 발견하면 "광고가 포함된 게시물이에요!" 를 출력하고
break로 검사를 멈춥니다 - (힌트)
for ... else를 쓰면, 끝까지 금지어가 없었을 때 "깨끗한 게시물이에요" 를 출력할 수 있어요
[심화] 피드 인기글 세기
여러 게시물의 좋아요 수를 훑으며 인기글이 몇 개인지 세는 프로그램을 만들어 보세요.
- 좋아요 수 여러 개를
"8900 320 15000 87 1200".split()처럼 준비합니다 - 개수를 셀 변수를
0으로 시작해 둡니다 (예:popular_count = 0) for로 하나씩 꺼내int()로 변환한 뒤, 좋아요가 1000 이상이면 카운트를 1 늘립니다- 반복이 끝난 뒤 "인기글은 총 N개" 를 출력합니다
생각해볼 주제
정답이 하나로 정해진 질문이 아니에요. 혼자 곰곰이 생각해 보거나, 함께 공부하는 동료와 이야기 나눠 보면 좋습니다.
1. 들여쓰기를 '문법'으로 강제한 파이썬의 선택
다른 많은 언어는 중괄호 {} 로 블록을 묶고, 들여쓰기는 '보기 좋으라고' 하는 선택일 뿐이에요.
파이썬은 반대로 들여쓰기 자체를 문법으로 못 박았죠. 들여쓰기가 틀리면 아예 실행이 안 돼요.
이렇게 강제하면 어떤 점이 좋을까요? 반대로 불편하거나 답답한 점은 없을까요?
2. for 와 while, 둘 다 되는데 왜 나눠 놨을까?
오늘 봤듯이 for 로 할 수 있는 일을 while 로도 흉내 낼 수 있고, 그 반대도 어느 정도 가능해요.
그런데도 파이썬은 둘을 따로 뒀어요.
만약 반복문이 하나뿐이었다면 어땠을까요? 두 개로 나뉘어 있어서 코드를 읽을 때 어떤 점이 좋아지는지 생각해 보세요.
3. break 없이도 같은 일을 할 수 있을까?
break 는 반복 중간에 빠져나오는 도구예요.
그런데 어떤 사람들은 "break 를 쓰지 말고 조건으로만 반복을 끝내는 게 더 깔끔하다" 고도 해요.
오늘 만든 '금지어 검사' 를 break 없이 while 과 조건만으로 만들 수 있을까요?
break 를 쓰는 쪽과 안 쓰는 쪽, 각각 어떤 장단점이 있을지 따져 보세요.
✅ 예시 답안정답 보기
과제 예시답안
🎯 [기초] 좋아요 등급 판정기 — 예시답안
채점 포인트
| 항목 | 배점 | 기준 |
|---|---|---|
if/elif/else 네 갈래 구성 |
40% | 10000/1000/100 경계로 네 등급을 나눴는가 |
| 조건 순서(큰 수부터) | 30% | 큰 수를 위에 두어 올바른 등급에 걸리는가 |
| f-string 출력 | 30% | "좋아요 N개 → 등급" 형태로 출력했는가 |
풀이 예시
# src/a_intro/a3_grade_judge_solution.py
# [기초] 좋아요 등급 판정기
likes = 4500 # 값을 바꿔가며 네 등급이 다 나오는지 확인해 보세요
if likes >= 10000:
grade = "인기 폭발"
elif likes >= 1000:
grade = "인기"
elif likes >= 100:
grade = "성장 중"
else:
grade = "조용한 게시물"
print(f"좋아요 {likes}개 → {grade}")
실행하면 이렇게 나옵니다.
좋아요 4500개 → 인기
💡 튜터의 한마디
elif 는 위에서부터 차례로 검사하니, 조건의 순서가 결과를 좌우해요.
좁은 범위(큰 수)부터 위에 두는 게 핵심이에요.
만약 100 이상 을 맨 위에 두면 4500도 99999도 전부 거기서 걸려 "성장 중" 만 나와버립니다.
자주 하는 실수
| 실수 | 무슨 일이 생기나 | 해결법 |
|---|---|---|
| 조건을 작은 수부터 나열 | 큰 값도 100 이상 에서 걸려 "성장 중" 만 나옴 |
큰 수(10000)부터 위에 둠 |
elif 대신 if 를 따로 나열 |
여러 조건이 동시에 참이 되어 등급이 겹침 | 하나만 고를 땐 elif 로 묶기 |
🎯 [응용] 캡션 금지어 검사기 — 예시답안
채점 포인트
| 항목 | 배점 | 기준 |
|---|---|---|
split() + for 순회 |
30% | 태그를 나눠 하나씩 검사하는가 |
if 비교 + break |
40% | 금지어 발견 시 break 로 멈추는가 |
for ... else 활용 |
30% | 끝까지 없으면 깨끗 메시지를 내는가 |
풀이 예시
# src/a_intro/a3_banned_word_solution.py
# [응용] 캡션 금지어 검사기
caption = "오늘 카페 다녀왔어요 #일상 #광고 #감성"
banned = "#광고"
for tag in caption.split():
if tag == banned:
print("광고가 포함된 게시물이에요!")
break
else:
print("깨끗한 게시물이에요")
실행하면 이렇게 나옵니다.
광고가 포함된 게시물이에요!
💡 튜터의 한마디
for ... else 의 else 는 반복이 break 없이 끝까지 다 돌았을 때만 실행돼요.
여기서는 #광고 를 만나 break 가 걸리니 else 는 건너뜁니다.
만약 캡션에 금지어가 하나도 없으면, break 없이 끝까지 돌고 "깨끗한 게시물이에요" 가 나와요.
자주 하는 실수
| 실수 | 무슨 일이 생기나 | 해결법 |
|---|---|---|
break 를 빠뜨림 |
금지어를 찾고도 뒤 태그까지 계속 검사함 | 발견 즉시 break |
else 를 for 가 아니라 if 에 붙임 |
태그마다 "깨끗" 메시지가 찍힘 | else 는 for 와 같은 들여쓰기 |
🎯 [심화] 피드 인기글 세기 — 예시답안
채점 포인트
| 항목 | 배점 | 기준 |
|---|---|---|
split() + for + int() 변환 |
30% | 글자 조각을 int 로 바꿔 순회하는가 |
| 카운터 변수 누적 | 40% | 0 에서 시작해 조건 만족 시 1씩 늘리는가 |
| 결과 출력 | 30% | 인기글 총 개수를 출력하는가 |
풀이 예시
# src/a_intro/a3_popular_count_solution.py
# [심화] 피드 인기글 세기
likes_data = "8900 320 15000 87 1200".split()
popular_count = 0
for likes_str in likes_data:
likes = int(likes_str)
if likes >= 1000:
popular_count = popular_count + 1
print(f"인기글은 총 {popular_count}개")
실행하면 이렇게 나옵니다.
인기글은 총 3개
💡 튜터의 한마디
카운터 변수(popular_count)를 반복 바깥에서 0 으로 시작해 두는 게 핵심이에요.
반복 안에서 0으로 두면 매 바퀴 초기화돼 버려 제대로 세지 못해요.
8900·15000·1200 세 개가 1000 이상이라 결과는 3 이 됩니다.
자주 하는 실수
| 실수 | 무슨 일이 생기나 | 해결법 |
|---|---|---|
카운터를 for 안에서 0 으로 초기화 |
매 바퀴 리셋돼 항상 0이나 1만 나옴 | 카운터는 for 바깥에서 0 |
int() 변환을 빠뜨림 |
글자와 숫자를 비교하다 TypeError 가 남 |
비교 전에 int(likes_str) |
생각해볼 주제 예시답안
🤔 [생각해볼 주제 1] 들여쓰기를 '문법'으로 강제한 파이썬의 선택
문제 상황 요약
다른 많은 언어는 중괄호 {} 로 블록을 묶고, 들여쓰기는 '보기 좋으라고' 하는 선택일 뿐이에요.
파이썬은 반대로 들여쓰기 자체를 문법으로 못 박았죠.
이렇게 강제하면 어떤 점이 좋을까요? 반대로 답답한 점은 없을까요?
튜터의 가이드 및 해설
가장 큰 장점은 "보이는 모양 = 실제 구조" 가 항상 일치한다는 거예요.
중괄호로 묶는 언어는 들여쓰기를 안 맞춰도 일단 돌아가요. 그래서 사람마다 정렬이 제각각이고, 보기엔 안쪽 블록 같은데 실제로는 아닌 헷갈리는 코드도 생길 수 있죠. 파이썬은 들여쓰기가 곧 문법이라, 누가 짜든 블록 구조가 눈에 보이는 그대로예요. 처음 코드를 읽는 사람도 "어디까지가 한 묶음인지" 를 정렬만 보고 바로 알 수 있고요.
물론 답답한 면도 있어요.
공백 한 칸 차이로 IndentationError 가 나고, 코드를 복사-붙여넣기 할 때 들여쓰기가 깨지면 골치 아프죠.
하지만 이 엄격함이 "보기엔 멀쩡한데 실제론 다르게 도는" 함정을 막아줍니다.
💡 핵심을 한마디로
"들여쓰기를 문법으로 만든 덕에, 눈에 보이는 모양이 곧 코드의 실제 구조예요. 누가 짜도 비슷하게 정렬돼 읽기 쉽죠. 대신 공백 하나에 민감하니, 한 블록은 4칸으로 일정하게 맞추는 습관이 필요해요."
🤔 [생각해볼 주제 2] for 와 while, 둘 다 되는데 왜 나눠 놨을까?
문제 상황 요약
for 로 할 수 있는 일을 while 로도 흉내 낼 수 있고, 그 반대도 어느 정도 가능해요.
그런데도 파이썬은 둘을 따로 뒀어요.
만약 반복문이 하나뿐이었다면 어땠을까요?
튜터의 가이드 및 해설
둘로 나뉜 덕에, 코드를 읽을 때 작성자의 의도가 드러나요.
for tag in tags: 를 보면 "정해진 것들을 하나씩 다 돈다" 가 한눈에 보여요.
while count > 0: 을 보면 "어떤 조건이 풀릴 때까지 돈다" 가 즉시 읽히고요.
도구를 고르는 것 자체가 "이 반복이 어떤 성격인지" 를 설명해주는 셈이에요.
만약 반복문이 하나뿐이었다면, 모든 반복을 같은 모양으로 써야 해서 "이게 횟수 반복인지 조건 반복인지" 를 코드 속을 들여다봐야 알 수 있었을 거예요.
그래서 for 로 무한 조건 반복을 억지로 흉내 내거나, while 로 정해진 횟수를 도는 건 동작은 해도 읽는 사람을 헷갈리게 만들어요.
"횟수를 알면 for, 조건으로 멈추면 while" 이라는 자연스러운 선택이 코드를 더 친절하게 합니다.
💡 핵심을 한마디로
"
for와while이 나뉜 건, 읽는 사람에게 '이건 정해진 횟수 반복' 인지 '조건이 풀릴 때까지' 인지를 한눈에 알려주기 위해서예요. 도구 선택 자체가 의도를 설명해주죠."
🤔 [생각해볼 주제 3] break 없이도 같은 일을 할 수 있을까?
문제 상황 요약
break 는 반복 중간에 빠져나오는 도구예요.
그런데 "break 를 쓰지 말고 조건으로만 반복을 끝내는 게 더 깔끔하다" 는 의견도 있어요.
'금지어 검사' 를 break 없이 만들 수 있을까요? 각각의 장단점은요?
튜터의 가이드 및 해설
break 없이도 만들 수 있어요. "찾았는지" 를 기억하는 변수와 while 조건을 쓰면 됩니다.
# src/a_intro/a3_banned_word_while_solution.py
tags = "오늘 카페 다녀왔어요 #일상 #광고 #감성".split()
found = False
i = 0
while i < len(tags) and not found:
if tags[i] == "#광고":
found = True
i = i + 1
if found:
print("광고가 포함된 게시물이에요!")
else:
print("깨끗한 게시물이에요")
found 가 참이 되면 while 조건(not found)이 거짓이 되어 반복이 자연스럽게 멈춰요.
break 로 튀어나가는 대신, "끝나는 조건" 을 반복문 머리에 모아둔 방식이죠.
두 방식엔 각각 매력이 있어요.
break 쪽은 짧고, "찾으면 즉시 멈춘다" 는 의도가 그 줄에 분명히 드러나요.
조건만 쓰는 쪽은 found 같은 변수를 따로 관리해 조금 길지만, "반복이 끝나는 지점이 조건 한 곳" 이라 흐름을 추적하기 쉽다는 장점이 있어요.
정답은 없어요. 짧고 명확함이 중요하면 break, 종료 흐름을 한곳에서 통제하고 싶으면 조건 방식이 어울립니다.
💡 핵심을 한마디로
"
break없이도 '찾았다' 를 기억하는 변수와while조건으로 같은 일을 할 수 있어요.break는 짧고 의도가 선명한 대신, 조건 방식은 끝나는 지점이 한곳에 모여 흐름이 또렷해요. 상황에 맞게 고르면 됩니다."