중첩 반복문과 별 찍기 — 반복문 안의 반복문
반복문 안에 또 다른 반복문을 넣는 중첩 반복문을 배웁니다.
행과 열로 이루어진 표구조(2차원 구조) 를 순회하는 원리를 이해하고, 이 원리를 그대로 활용해 다양한 모양의 별을 출력해봐요.
요즘은 고등학교에서도 코딩을 정규 과목으로 가르치는 시대입니다. 전공자가 아니어도 바이브 코딩(Vibe Coding)이나 생성형 AI(Generative AI)를 활용하면 누구나 그럴듯한 코드 결과물을 만들어낼 수 있게 되었죠.
개발 언어를 접하는, 전공자가 아닌 일반인 입문자가 많아진 것입니다.
이 시리즈는 글쓴이가 실제로 일반인, 고등학생 등 비전공자·입문자에게 파이썬을 가르치면서 정리한 내용들을 교재 형식으로 엮은 글입니다.최대한 쉽고 친절하게 설명하면서도, 컴퓨터와 프로그래밍 언어에 대한 기초 이론까지 함께 짚고 넘어가려 합니다.
고등학생, 비전공자, 완전 입문자도 따라올 수 있게끔 만든 시리즈이고, 실제 과외 수업 자료를 바탕으로 만들어서 학교 시험처럼 개념 확인 문제도 그대로 들어있어요.
중간중간 빈칸 채우기랑 학교 시험 유형 문제가 나오는데, 정답은 바로 안 보이게 접어뒀습니다. 먼저 스스로 생각해본 다음 "보기"를 눌러서 확인해보세요.

중첩(Nested)이란 하나의 반복문 안에 또 다른 반복문이 들어있는 것을 말합니다.
학교에 1학년~3학년이 있고, 각 학년마다 1반~3반이 있다고 생각해봅시다. 학년이 하나 바뀔 때마다 반은 다시 처음(1반)부터 시작하죠. 이것이 중첩 반복문의 핵심입니다.
for j in range(2):
print(i, j)
0 1
1 0
1 1
2 0
2 1
처음엔 i = 0입니다. 그러면 안쪽 반복문이 j = 0부터 j = 1까지 전부 실행된 뒤에야, 바깥쪽이 i = 1로 넘어갑니다. 그리고 안쪽 반복문은 다시 j = 0부터 시작해요. 즉 바깥쪽이 한 번 움직일 때마다 안쪽은 처음부터 끝까지 전부 실행됩니다.
중첩 for문에서 바깥쪽 반복문은 행(row), 안쪽 반복문은 열(column)에 해당합니다. 이렇게 행과 열로 이루어진 구조를 2차원 배열(2D array) 또는 행렬(Matrix)이라고 불러요. 나중에 배울 "리스트 안에 리스트" 구조도 결국 이 중첩 반복문으로 순회하게 됩니다.
| i \ j | 0열 | 1열 | 2열 |
|---|---|---|---|
| 0행 | (0,0) | (0,1) | (0,2) |
| 1행 | (1,0) | (1,1) | (1,2) |
| 2행 | (2,0) | (2,1) | (2,2) |
for j in range(3):
print("*", end="")
print()
***
***
기본적으로 print()는 내용을 출력한 후 줄바꿈을 수행합니다. 하지만 print("*", end="")처럼 쓰면 줄을 바꾸지 않고 한 줄에 이어서 출력해요. 그 뒤에 print()만 단독으로 쓰면 그때 비로소 다음 줄로 이동합니다. 줄바꿈용 print()는 반드시 바깥 for문 안, 안쪽 for문 밖에 두어야 해요.
print("======", dan, "단 ======")
for num in range(1, 10):
print(dan, "x", num, "=", dan * num)
print()
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
====== 3 단 ======
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
바깥 반복문(dan)은 몇 단인지 결정하고, 안쪽 반복문(num)은 그 단의 1~9까지 계산을 담당합니다. 이렇게 range(2, 10)으로 범위를 늘리면 2단부터 9단까지 똑같은 방식으로 이어집니다.
for row in rows:
for seat in range(1, 5):
print(row + str(seat), end=" ")
print()
B1 B2 B3 B4
C1 C2 C3 C4
row(행)가 바깥, seat(열)이 안쪽인 전형적인 2차원 좌석 배치예요.
["A", "B", "C"]처럼 대괄호로 값을 묶어놓은 것을 리스트(list)라고 하는데, for row in rows:는 리스트 안의 값을 앞에서부터 하나씩 꺼내 씁니다. 리스트는 다음 화에서 자세히 배워요.
row + str(seat)는 + 기호를 이용하여 문자열끼리 이어 붙여줄 텐데, seat는 숫자이므로 str()로 먼저 문자열로 바꿔줘야 합니다.
중첩 반복문에서는 바깥과 안쪽 변수 이름을 다르게 지어야 헷갈리지 않습니다. 보통 i, j처럼 짝을 지어 사용해요.
- 다음 코드가 각 줄에 "***"를 출력하도록 빈칸을 채우시오.
for i in range(2):
for j in range(3):
print("*", )
print()
정답
- 다음 코드의 실행 결과를 작성하시오.
for i in range(2):
for j in range(2):
print(i, j) - 중첩 반복문에서 바깥 반복문과 안쪽 반복문의 관계를 서술하시오.
정답
0 1
1 0
1 1
2. 바깥 반복문이 한 번 움직일 때마다, 안쪽 반복문은 처음부터 끝까지 전부 실행됩니다.
별 찍기는 반복문의 실행 순서를 연습하기 위한 가장 좋은 예제입니다.
실제로 별을 출력하는 게 목적이 아니라, 반복문이 어떻게 동작하는지 이해하는 것이 목적이에요.
벽돌을 한 줄에 5개씩 3줄 쌓는다고 생각해봅시다. 바깥 반복문은 줄(행), 안쪽 반복문은 그 줄에 놓일 별(열)을 담당합니다.
for j in range(5):
print("*", end="")
print()
*****
*****
for j in range(i):
print("*", end="")
print()
**
***
****
*****
i=1일 때 별 1개, i=2일 때 별 2개... 이렇게 안쪽 반복문의 반복 횟수가 바깥 반복문의 값(i)에 따라 달라집니다. range()의 숫자로 직접 상수를 쓰는 대신 바깥 변수 i를 넣은 것이 핵심이에요.
for j in range(i):
print("*", end="")
print()
****
***
**
*
end="" 없이 안쪽에서 print("*")만 쓰면 별이 한 줄에 하나씩, 세로로 출력됩니다. 그리고 range(i)와 range(i+1)은 결과가 다르니, 몇 번째 줄까지 포함해야 하는지 항상 확인해야 해요.
지금까지 배운 중첩 반복문을 조금 더 실전처럼 응용해볼게요. 예전에 배운 구구단은 한 단씩 세로로 출력했는데, 이번엔 2단부터 9단까지를 가로로 나란히, 표처럼 정리해서 출력해봅시다.
① "\t" — 탭(tab) 문자입니다. 스페이스바4개에 해당하고 키보드 Tab키를 눌렀을때 동작과 동일해요. 넓은 공백을 넣어주는 역할입니다.
② sep="" — print()에서 ,를 이용해서 여러 개의 값을 넣으면 기본적으로 그 값들 사이 사이마다 공백이 하나씩 들어갑니다(sep=" "가 기본값). sep=""를 쓰면 그 공백을 없애서 값들을 딱 붙여 출력해요. 예를 들어 print(2, "x", 1, sep="")는 2x1을 출력합니다.
for dan in range(2, 10):
print(dan, "단", end="\t")
print()
for num in range(1, 10):
print(num, end="\t")
for dan in range(2, 10):
print(dan, "x", num, end="=", sep="")
print(dan * num, end="\t")
print()
1 2x1=2 3x1=3 4x1=4 5x1=5 6x1=6 7x1=7 8x1=8 9x1=9
2 2x2=4 3x2=6 4x2=8 5x2=10 6x2=12 7x2=14 8x2=16 9x2=18
3 2x3=6 3x3=9 4x3=12 5x3=15 6x3=18 7x3=21 8x3=24 9x3=27
4 2x4=8 3x4=12 4x4=16 5x4=20 6x4=24 7x4=28 8x4=32 9x4=36
5 2x5=10 3x5=15 4x5=20 5x5=25 6x5=30 7x5=35 8x5=40 9x5=45
6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 7x6=42 8x6=48 9x6=54
7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 8x7=56 9x7=63
8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 9x8=72
9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
맨 윗줄(제목 행) — print("\t", end="")로 맨 앞에 빈 칸 하나를 만든 뒤(1~9 숫자가 들어갈 왼쪽 칸을 비워두기 위해), for dan in range(2, 10):으로 2단부터 9단까지 "2 단", "3 단"...을 탭으로 구분해 한 줄에 이어 출력합니다.
바깥 for문 (num) — num은 1부터 9까지, 곱셈에서 단 뒤에 곱해지는 수(행 번호)입니다. 각 행 맨 앞에 print(num, end="\t")로 행 번호를 출력해요.
안쪽 for문 (dan) — 한 행 안에서 2단부터 9단까지의 곱셈식을 만듭니다. print(dan, "x", num, end="=", sep="")가 "2x1="처럼 곱셈식과 등호까지 출력하고, 이어서 print(dan * num, end="\t")가 계산 결과와 탭을 출력해요. 이렇게 중첩 for문(바깥=행, 안쪽=열)과 end, sep 옵션을 함께 활용하면, 지금까지 배운 반복문 개념을 종합적으로 적용해볼 수 있습니다.
- 별이 점점 많아지게 하려면 안쪽 반복문의 range()에 무엇을 넣어야 하는가?
정답
- 다음 코드의 실행 결과를 작성하시오.
for i in range(2, 5):
for j in range(i):
print("*", end="")
print()
정답
***
****
'Language > Python' 카테고리의 다른 글
| [고등학생부터, 파이썬] 11. 튜플(Tuple)과 세트(Set) (0) | 2026.08.20 |
|---|---|
| [고등학생부터, 파이썬] 10. 리스트(List) (0) | 2026.08.20 |
| [고등학생부터, 파이썬] 08. 반복문 for (0) | 2026.08.19 |
| [고등학생부터, 파이썬] 07. 반복문 while (0) | 2026.08.10 |
| [고등학생부터, 파이썬] 06. 논리연산자와 중첩 if (0) | 2026.08.05 |
댓글