앞에서 print() 를 이용해 실행 흐름과 변수값을 확인했다면,

이제는 PyCharm 디버거를 사용해 프로그램을 원하는 지점에서 멈추고, 그 시점의 상태를 직접 확인하는 방법을 학습합니다.

 

PyCharm 디버깅의 핵심은 단순히 코드를 실행하는 것이 아니라, 

breakpoint에서 멈춘 뒤 현재 변수값, 호출 흐름, 실행 위치를 분석하는 것입니다.

 

1. 학습 목표

  • PyCharm 디버깅의 기본 개념을 이해합니다.
  • print 디버깅과 IDE 디버깅의 차이를 이해합니다.
  • breakpoint를 기준으로 프로그램 상태를 확인하는 방법을 익힙니다.
  • PyCharm Debug 창에서 변수, 호출 흐름, 현재 실행 위치를 읽는 방법을 학습합니다.
  • Step Over, Step Into, Step Out, Resume, Run to Cursor 등 기본 디버깅 조작법을 익힙니다.
  • Evaluate Expression, Watches 등을 활용해 코드 수정 없이 상태를 점검하는 방법을 학습합니다.
  • 반복문 / 예외 / 조건부 breakpoint까지 확장하기

 

 

2. 디버깅이란?

디버깅은 프로그램을 특정 지점에서 멈춘 뒤, 현재 상태를 직접 확인하면서 실행 흐름을 추적하는 방식입니다.

 

print 디버깅이 “출력해서 확인하는 방식”이라면,

PyCharm 디버깅은 멈춘 상태를 분석하는 방식이라고 이해하면 됩니다.

 

단순히 실행 결과만 보는 것이 아니라, 현재 줄이 실행되기 전 상태, 변수값, 함수 호출 흐름, 식 평가 결과를 확인할 수 있습니다.

 

 

3. 단계별 PyCharm 디버깅 실습 (공식 링크)

3.1 실습 파일 구성

이번 실습에서는 같은 파일에 있는 함수와, 다른 모듈에 있는 함수를 함께 호출하면서 디버깅 흐름을 비교합니다. 

 

파일 1 : calc_module.py

def multiply(a, b):
    result = a * b
    return result


def divide(a, b):
    result = a / b
    return result

 

파일 2 : main.py

from calc_module import multiply, divide


def add(a, b):
    result = a + b
    return result


def subtract(a, b):
    result = a - b
    return result


def main():
    x = 10
    y = 5

    plus_result = add(x, y)
    minus_result = subtract(x, y)
    multiply_result = multiply(x, y)
    divide_result = divide(x, y)

    print("덧셈 결과:", plus_result)
    print("뺄셈 결과:", minus_result)
    print("곱셈 결과:", multiply_result)
    print("나눗셈 결과:", divide_result)


if __name__ == "__main__":
    main()

이 예제의 장점은 다음과 같습니다.

  • add(), subtract() 는 같은 파일에 있는 함수입니다.
  • multiply(), divide() 는 다른 모듈에 있는 함수입니다.
  • 즉, Step Into를 사용할 때 같은 파일 내부 이동 다른 파일로 이동을 모두 확인할 수 있습니다.

 

 

3.2 첫 breakpoint 실습

breakpoint는 프로그램을 특정 줄에서 잠깐 멈추게 하는 표시입니다.

중요한 점은, breakpoint에서 멈췄다는 것은 해당 줄이 아직 실행되기 전이라는 뜻입니다.
따라서 그 줄에서 새로 만들어질 값은 아직 존재하지 않을 수 있고, 이전 줄까지 만들어진 값들만 확인할 수 있습니다.

즉, “여기서 멈추고 현재 상태를 확인하자”라는 의미입니다.

 

추천 breakpoint 위치

plus_result = add(x, y)
minus_result = subtract(x, y)
multiply_result = multiply(x, y)
divide_result = divide(x, y)

 

실습 순서

  1. plus_result = add(x, y) 줄 왼쪽 여백을 클릭해 breakpoint를 찍습니다.
  2. PyCharm에서 Debug로 실행합니다.
  3. 프로그램이 해당 줄에서 멈추는지 확인합니다.
  4. 이때 Variables 창에서 x, y 값을 확인합니다.
  5. 아직 plus_result는 만들어지지 않았다는 점을 확인합니다.

 

 

3.3 디버그 창 확인할 영역: 어디를 봐야 하는가? (공식 링크)

① Sessions : 현재 실행 중인 디버깅 세션

② Console : 멈춘 상태에서 값 확인 및 간단한 테스트

③ Variables : 현재 사용할 수 있는 변수값 확인

Watches : 내가 계속 추적하고 싶은 식 등록

④ Frames : 현재 어떤 함수 안에서 멈췄는지 확인

⑤ Debugger toolbar : Resume, Step Over, Step Into, Step Out, Run to Cursor 같은 조작 버튼

 

 

3.4  Debugger toolbar 조작 실습 

가장 많이 사용하는 조작은 아래 5가지입니다.

아이콘 기능명 단축키 설명
Resume F9 프로그램이 멈춘 상태에서 다시 실행을 이어 갑니다.
보통 다음 breakpoint까지 계속 실행하는 기능으로 이해하면 됩니다.
Step Over F8 현재 줄을 실행하고 다음 줄로 이동합니다.
현재 줄에 함수 호출이 있어도 함수 내부로 들어가지 않고 결과만 지나갑니다. 
Step Into F7 현재 실행 위치에서 호출되는 함수 내부로 들어가 실제 동작을 확인합니다.
함수가 어떻게 실행되는지 자세히 볼 때 사용합니다.
Step Out Shift+F8 현재 들어와 있는 함수 실행을 마치고, 이 함수를 호출한 위치 바로 다음 줄로 돌아갑니다. 함수 안에 너무 깊이 들어갔을 때 자주 사용합니다.
Run to Cursor Alt+F9 에디터에서 커서를 둔 줄까지 빠르게 실행합니다. 중간의 여러 줄을 하나씩 Step 하지 않고 원하는 위치까지 바로 이동할 때 유용합니다. 

실습 순서

  1. multiply_result = multiply(x, y) 줄에 breakpoint를 찍습니다.
  2. 디버그 실행 후 해당 줄에서 멈춥니다.
  3. Step Over를 눌러봅니다.
  4. 이번에는 같은 위치에서 다시 시작한 뒤 Step Into를 눌러봅니다.
  5. calc_module.py 안으로 들어가면 Step Out을 눌러 호출한 위치로 다시 돌아옵니다.

 

 

3.5 Debug Console 실습 (공식 링크)

프로그램이 멈춘 상태에서 Debug Console을 활용하면, 코드를 수정하지 않고 현재 값과 간단한 식을 테스트할 수 있습니다.

 

실습 순서

  1. divide_result = divide(x, y) 줄에서 멈춘 상태를 만듭니다.
  2. Debug Console에서 아래 식을 하나씩 입력합니다.
x
y
x + y
x - y
x * y
x / y
type(x)

 

학습 포인트

  • 코드를 직접 수정하지 않아도 현재 상태를 바로 시험해볼 수 있습니다.
  • 현재 줄이 실행되기 전, 어떤 결과가 나올지 미리 확인할 수 있습니다.

 

 

3.6 Evaluate Expression 사용하기 (공식 링크)

Variables 창은 현재 존재하는 값을 보는 영역이고, Evaluate Expression은 현재 상태에서 식을 직접 계산해 보는 기능입니다.

 

실습 순서

  1. Variables에서 x, y 값을 확인합니다.
  2. Evaluate Expression을 열어 아래 식을 하나씩 계산해 봅니다.
x + y
x - y
x * y
x / y
max(x, y)

 

학습 포인트

  • 단순 값 확인과 식 평가는 다릅니다.
  • 실제 코드에 없는 계산도 현재 상태를 기준으로 시험해볼 수 있습니다.

 

 

3.7 Watches 사용하기 (공식 링크)

Watches는 계속 보고 싶은 식을 등록해 두는 기능입니다.

 

등록할 Watch 예시

x
y
x + y
x * y
x / y

 

학습 포인트

  • Variables는 현재 존재하는 값 위주로 보는 영역입니다.
  • Watches는 내가 원하는 식을 계속 등록해서 추적하는 영역입니다.

 

 

3.8 반복문 디버깅하기

이제 같은 코드가 여러 번 실행되는 반복문을 디버깅해 봅니다.

 

실습 파일 : loop_debug.py

from calc_module import multiply, divide


def add(a, b):
    result = a + b
    return result


def subtract(a, b):
    result = a - b
    return result


number_pairs = [
    (10, 5),
    (20, 4),
    (30, 0),
    (8, 2),
]

for index, (x, y) in enumerate(number_pairs):
    plus_result = add(x, y)
    minus_result = subtract(x, y)
    multiply_result = multiply(x, y)

    if y != 0:
        divide_result = divide(x, y)
    else:
        divide_result = "0으로 나눌 수 없음"

    print(index, plus_result, minus_result, multiply_result, divide_result)

 

추천 breakpoint 위치

for index, (x, y) in enumerate(number_pairs):
plus_result = add(x, y)
if y != 0:

 

학습 포인트

  • 같은 줄이 반복해서 실행되더라도, 매번 변수값은 달라질 수 있습니다.
  • 반복문 디버깅에서는 index, x, y 값을 함께 확인하는 것이 중요합니다.
  • 조건문이 반복문 안에 있을 때는 어느 반복에서 if / else로 가는지도 확인해야 합니다.

 

 

3.9 예외 디버깅하기

나눗셈은 디버깅 입문 예제로 좋습니다. 특히 0으로 나누는 경우를 통해 예외 상황을 쉽게 만들 수 있습니다.

 

예를 들어 y = 0 인 상태에서 아래 코드가 실행되면 오류가 발생합니다.

divide_result = divide(x, y)

 

이때 PyCharm의 Exception Breakpoint 를 사용하면, 오류가 실제로 발생한 시점에서 프로그램을 멈추고 주변 상태를 함께 확인할 수 있습니다.

  • x 값은 무엇인가?
  • y 값은 무엇인가?
  • 어느 함수 안에서 예외가 발생했는가?
  • 반복문 몇 번째 실행에서 문제가 생겼는가?

 

 

3.10 breakpoint 확장 기능

기본 breakpoint에 익숙해졌다면, 아래 확장 기능도 함께 학습할 수 있습니다.

  • 조건부 breakpoint
  • exception breakpoint
  • log breakpoint
  • remove once hit

이 기능들은 반복문이나 특정 조건에서만 멈추고 싶은 상황에서 특히 유용합니다.

 

 

4. 마무리 정리

디버깅은 감으로 고치는 작업이 아니라, 현재 상태를 근거로 확인하는 과정입니다.

핵심 흐름은 다음과 같습니다.

  • 멈춘다
  • 본다
  • 이동한다
  • 다시 본다

PyCharm 디버깅은 print 디버깅보다 훨씬 구조적으로 프로그램 상태를 분석할 수 있게 도와줍니다.

초보자는 breakpoint와 Step 조작, Debug 창 읽기만 익혀도 디버깅 이해도가 크게 올라갑니다.