5강. 디버깅 — 중단점으로 코드 흐름 따라가기

0. 학습 목표
→ 중단점으로 코드를 멈춰 세우고, 변수 값을 직접 확인하며 버그를 찾습니다.
0.1 이번 글에서 다룰 내용
이번 글은 구현 중심 강의이자, 이 시리즈의 핵심입니다.
지금까지는 코드가 잘 동작했습니다.
하지만 실제 개발에서는 "실행은 되는데 결과가 이상한" 상황이 훨씬 많습니다.
지난 시리즈에서는 이럴 때 print를 여기저기 넣어 값을 찍어 보는 것이 전부였습니다.
이번 강의에서는 코드를 원하는 지점에서 멈춰 세우고, 그 순간 변수에 어떤 값이 들어 있는지 화면에서 직접 들여다보는 디버깅을 배웁니다.
실습에는 지금까지 쓰던 GUI 프로그램 대신, 버그가 하나 숨어 있는 작은 계산 스크립트를 새로 만듭니다.
창을 띄우는 프로그램은 실행 흐름을 멈춰 관찰하기에 적합하지 않기 때문입니다.
이 스크립트의 잘못된 결과를 디버깅으로 추적해 원인을 찾는 것이 목표입니다.
버그 있는 스크립트 실행 → 결과가 이상함
↓
중단점(breakpoint) 설정 → F5로 디버그 실행
↓
멈춘 지점에서 변수 값 확인 → 한 줄씩 실행하며 추적
↓
값이 어긋나는 순간 발견 → 버그 원인 확인 ← 이번 강의의 성공 지점
| 구분 | 내용 |
| 이해할 것 | 중단점·단계 실행·변수 패널의 역할과, print 방식보다 나은 이유 |
| 만들 것 | 디버깅 실습용 debug_practice.py |
| 확인할 것 | 중단점에서 실행이 멈추고, 변수 패널에 그 순간의 값이 보이는지 |
0.2 이번 강의에서 직접 다루는 구조
~/Dev/Project/
├── .venv/ ← 유지 (4강에서 연결한 가상환경)
├── main.py ← 유지
├── requirements.txt ← 유지
└── debug_practice.py ← ➕ 이번 강의에서 생성 (디버깅 실습용)
(➕ 새로 생성 · ✏️ 수정 · 표시 없음은 변경 없음)
1. 문제 상황 — print만으로는 힘든 버그
→ 결과가 이상한 스크립트를 만들고, print 방식의 한계를 확인합니다.
사이드바에서 새 파일 debug_practice.py를 만들고(파일 탐색기 상단의 새 파일 아이콘 또는 우클릭 → New File), 아래 코드를 입력합니다. 점수 목록의 평균을 구하는 짧은 프로그램입니다.
def calculate_average(scores):
total = 0
count = 0
for score in scores:
total = total + score # 점수를 하나씩 더한다
count = count + 1 # 개수를 센다
average = total / count
# total = total + scores[-1] # ✏️ 실수로 들어간 줄 — 마지막 점수를 한 번 더 더함
return average
scores = [80, 90, 100] # 평균은 90이어야 한다
result = calculate_average(scores)
print("평균:", result)
80, 90, 100의 평균이니 90이 나와야 합니다. 4강에서 배운 실행 버튼(▷)으로 실행해 봅니다.
평균: 90.0
이 코드는 사실 정상입니다. 여기에 버그를 하나 심어 문제 상황을 만들어 보겠습니다.
합계를 구한 뒤 마지막 점수를 한 번 더 더하는 실수가 있다고 가정합니다. 반복문 아래에 다음 한 줄을 추가합니다.
average = total / count
total = total + scores[-1] # ✏️ 실수로 들어간 줄 — 마지막 점수를 한 번 더 더함
return average
이제 다시 실행하면 결과가 이상해야 할 것 같은데, 실행하면 여전히 90.0이 나옵니다.
값이 이미 계산된 뒤에 더했기 때문입니다.
이처럼 "어디서 무엇이 잘못됐는지" 눈에 안 보이는 상황이 실제 버그의 모습입니다. print로 찾으려면 이렇게 됩니다.
for score in scores:
total = total + score
count = count + 1
print("중간 total:", total, "count:", count) # 값을 보려고 print를 심는다
print("최종 total:", total, "count:", count) # 또 심는다
값을 볼 때마다 print를 넣고, 확인이 끝나면 다시 지워야 합니다.
줄이 많아지면 print도 늘어나고, 지우다가 실수하기도 쉽습니다.
디버깅은 이 과정을 코드를 고치지 않고 대신해 줍니다.
방금 넣은 print 줄들은 지우고, 버그 한 줄(total = total + scores[-1])은 남긴 채로 다음으로 넘어갑니다.
2. 중단점 설정하고 디버그 실행하기
→ 코드에 멈출 지점을 표시하고, 디버그 모드로 실행합니다.
2.1 중단점 설정하기
중단점(breakpoint)은 "여기서 실행을 잠깐 멈춰라"라고 표시하는 지점입니다.
편집 영역에서 줄 번호 왼쪽 여백에 마우스를 올리면 흐릿한 빨간 점이 나타나고, 클릭하면 빨간 점이 고정됩니다.
이 점이 찍힌 줄에서 실행이 멈춥니다.
반복문 안의 total = total + score 줄에 중단점을 찍습니다.
반복이 돌 때마다 값이 어떻게 변하는지 보기 위해서입니다.

2.2 F5로 디버그 실행하기
4강에서 실행 버튼으로 실행했을 때는 코드를 끝까지 한 번에 돌렸지만, 디버그 실행은 중단점에서 멈춥니다.
키보드 F5를 누릅니다. (또는 명령 팔레트에서 Debug: Start Debugging.)
처음 실행하면 어떤 방식으로 디버그할지 물어볼 수 있는데, Python File을 선택하면 됩니다.

실행이 시작되고, 곧 중단점을 찍은 줄에서 멈춥니다.
그 줄이 노란색으로 강조되는데, 이는 "이 줄을 아직 실행하지 않았고, 지금 여기서 멈춰 있다"는 뜻입니다.
디버깅은 4강에서 연결한 .venv를 그대로 사용하므로, 인터프리터를 따로 지정할 필요는 없습니다.
✔ 확인 기준: F5를 눌렀을 때 중단점 줄이 노랗게 강조되며 실행이 멈추면 디버그가 시작된 것입니다. 멈추지 않고 끝까지 실행된다면 중단점(빨간 점)이 제대로 찍혔는지 확인하세요. 실행이 아예 안 되면 4강처럼 상태 바의 인터프리터가 .venv인지 확인합니다.
3. 변수 값 보며 한 줄씩 따라가기
→ 멈춘 상태에서 변수 값을 확인하고, 한 줄씩 실행하며 버그를 추적합니다.
3.1 변수 패널 읽기
실행이 멈춘 지금, 왼쪽 사이드바가 디버그 화면으로 바뀌어 있습니다. 여기 변수(Variables) 패널에 현재 시점의 모든 변수와 그 값이 표시됩니다. print를 심지 않아도, 멈춘 순간의 값이 그대로 보이는 것입니다.

변수(Variables) 패널 — 첫 번째 멈춤 시점
scores = [80, 90, 100]
total = 0 ← 아직 total = total + score 줄을 실행하기 전이라 0
count = 0
score = 80 ← 이번 반복에서 처리할 값
각 변수에 어떤 값이 들어 있는지 한눈에 보입니다. 이것이 디버깅의 핵심입니다 — 코드를 멈춘 그 순간의 상태를 있는 그대로 들여다볼 수 있습니다.
3.2 한 줄씩 실행하기
멈춘 상태에서 화면 위쪽에 디버그 도구 막대가 나타납니다.
여기서 코드를 한 줄씩 진행시킬 수 있습니다. 가장 많이 쓰는 세 가지만 알면 됩니다.
| 동작 | 단축키 | 하는 일 |
| 한 줄 실행 (Step Over) | F10 | 현재 줄을 실행하고 다음 줄로 이동 |
| 계속 실행 (Continue) | F5 | 다음 중단점까지 한 번에 진행 (반복문에서는 다음 반복으로) |
| 중지 (Stop) | Shift+F5 | 디버깅 종료 |
F10을 눌러 한 줄씩 진행하며 변수 패널을 지켜봅니다. total = total + score를 실행하는 순간 total이 0에서 80으로 바뀌는 것이 패널에 즉시 반영됩니다. 반복이 돌 때마다 값이 어떻게 쌓이는지 눈으로 따라갈 수 있습니다.

F10을 누르며 변수 패널 관찰
1번째 반복 후: total = 80, count = 1
2번째 반복 후: total = 170, count = 2
3번째 반복 후: total = 270, count = 3 ← 여기까지는 정상 (합계 270)
average = total / count 실행 후: average = 90.0 ← 평균도 정상!
그다음 줄 total = total + scores[-1] 실행 후:
total = 370 ← total이 갑자기 바뀐다! 버그 발견
버그의 정체가 드러났습니다.
average는 이미 90으로 정상 계산되었는데, 그 뒤에 total을 다시 건드리는 줄이 있었던 것입니다.
그래서 결과(90.0)는 멀쩡했지만 total에는 엉뚱한 값이 남았습니다.
만약 이 함수가 나중에 total도 반환하도록 바뀐다면 곧바로 문제가 될 코드입니다.
print로는 "결과가 90이니 괜찮네"하고 넘어갔을 문제를, 디버깅은 값이 변하는 순간을 잡아 드러낸 것입니다.
원인을 찾았으니 디버깅을 멈추고(Shift+F5) 버그 줄(total = total + scores[-1])을 지우면 됩니다.
3.3 print 디버깅과 무엇이 다른가
| 비교 | print 방식 | 중단점 디버깅 |
| 코드 수정 | print를 넣었다 지워야 함 | 코드를 건드리지 않음 |
| 볼 수 있는 값 | print로 찍은 것만 | 그 순간 모든 변수 |
| 진행 방식 | 한 번에 끝까지 실행 | 원하는 지점에서 멈춰 한 줄씩 |
- 중단점 = "여기서 멈춰라" 표시 (줄 번호 왼쪽 여백 클릭)
- F5로 디버그 실행 → 중단점에서 멈춤 / F10으로 한 줄씩 진행
- 변수 패널에서 그 순간의 모든 변수 값을 print 없이 확인
- 디버깅은 코드를 고치지 않고, 값이 변하는 순간을 잡아낸다
✔ 확인 기준: 중단점에서 멈춘 뒤 F10으로 한 줄씩 진행하며, 변수 패널에서 total·count 값이 반복마다 바뀌는 것을 눈으로 확인했다면 — 이 시리즈의 핵심 목표를 달성한 것입니다. 0강에서 약속한 "중단점을 걸어 변수 값을 확인하는" 성공 기준이 바로 이것입니다.
→ 다음 강의 (6강, 선택): 지금은 F5를 누를 때마다 VSCode가 알아서 실행했지만, 실행할 때 값을 전달하거나 특정 설정으로 디버그하고 싶을 때가 있습니다. 이런 디버그 설정을 launch.json 파일에 저장해 재사용하는 방법을 다룹니다. 초급 단계에서 당장 필요하지는 않으므로 선택 강의입니다.