Skip to Content
💻 코리아IT아카데미 신촌 - 프로그래밍 학습 자료

Topic 3: 디버깅 기초 🐛

🎯 학습 목표

프로그램의 버그를 찾고 수정하는 기본적인 방법을 배워요!

  • 디버깅이 무엇인지 이해하기
  • print()를 활용한 디버깅 방법 익히기
  • 체계적으로 문제를 해결하는 방법 배우기

🔍 디버깅이란?

**디버깅(Debugging)**은 프로그램의 **버그(bug, 오류)**를 찾아서 수정하는 과정이에요.

왜 버그라고 부를까요? 1940년대에 실제로 컴퓨터에 나방이 들어가서 오작동을 일으킨 사건에서 유래했다고 해요! 🦋

🖨️ print() 디버깅: 가장 기본적인 방법

변수 값 확인하기

프로그램이 예상과 다르게 동작할 때, print()로 변수 값을 확인해보세요!

# 문제가 있는 코드 def calculate_discount(price, discount_rate): discount = price * discount_rate final_price = price - discount return final_price # 왜 결과가 이상할까? result = calculate_discount(10000, 20) print(f"최종 가격: {result}원") # 예상: 8000원, 실제: -190000원?

디버깅해보기:

def calculate_discount(price, discount_rate): print(f"가격: {price}") # 디버깅용 print print(f"할인율: {discount_rate}") # 디버깅용 print discount = price * discount_rate print(f"할인 금액: {discount}") # 디버깅용 print final_price = price - discount print(f"최종 가격: {final_price}") # 디버깅용 print return final_price # 실행해보면 문제를 발견! result = calculate_discount(10000, 20) # 할인율이 20%가 아니라 20배로 계산됨!

수정된 코드:

def calculate_discount(price, discount_rate): discount = price * (discount_rate / 100) # 퍼센트로 변환 final_price = price - discount return final_price result = calculate_discount(10000, 20) print(f"최종 가격: {result}원") # 8000원 정상 출력!

🎯 체계적인 디버깅 방법

1. 문제 재현하기

# 가끔 작동하지 않는 코드 import random def lottery(): numbers = [1, 2, 3, 4, 5] choice = random.randint(0, 5) # 버그! return numbers[choice] # 여러 번 실행해서 문제 재현 for i in range(10): try: print(f"시도 {i+1}: {lottery()}") except IndexError: print(f"시도 {i+1}: 에러 발생!") # 언제 에러가 나는지 확인

2. 가정 확인하기

# 평균을 계산하는 함수 def calculate_average(numbers): # 가정: numbers는 리스트이고, 비어있지 않다 print(f"입력값 타입: {type(numbers)}") # 타입 확인 print(f"입력값 길이: {len(numbers)}") # 길이 확인 print(f"입력값 내용: {numbers}") # 내용 확인 total = sum(numbers) average = total / len(numbers) return average # 테스트 calculate_average([1, 2, 3, 4, 5]) # 정상 # calculate_average([]) # 에러 발생!

3. 단계별로 확인하기

# 복잡한 계산 디버깅 def complex_calculation(x, y): print(f"=== 시작: x={x}, y={y} ===") step1 = x + y print(f"Step 1 (x + y): {step1}") step2 = step1 * 2 print(f"Step 2 (step1 * 2): {step2}") step3 = step2 - x print(f"Step 3 (step2 - x): {step3}") result = step3 / y print(f"최종 결과 (step3 / y): {result}") return result # 실행하면서 각 단계 확인 complex_calculation(10, 5)

💡 디버깅 팁 모음

1. 주석 활용하기

def find_max_value(numbers): # TODO: 빈 리스트 처리 추가 # BUG: 음수만 있을 때 문제 발생 max_value = 0 # 문제: 초기값이 0이면 음수를 못 찾음 for num in numbers: if num > max_value: max_value = num return max_value

2. 작은 부분부터 테스트

# 큰 함수를 작은 부분으로 나누어 테스트 def process_data(data): # 1단계: 데이터 정리 cleaned_data = clean_data(data) print("정리된 데이터:", cleaned_data) # 2단계: 계산 result = calculate(cleaned_data) print("계산 결과:", result) # 3단계: 포맷팅 formatted = format_result(result) print("최종 결과:", formatted) return formatted

3. 에러 메시지 활용

# 에러 메시지를 잘 읽어보세요! def divide_numbers(a, b): try: result = a / b return result except ZeroDivisionError as e: print(f"에러 발생: {e}") print(f"입력값: a={a}, b={b}") return None

💡 퀴즈: 디버깅 이해도 체크

Q1. 다음 코드의 버그를 찾아보세요

def count_vowels(text): vowels = "aeiou" count = 0 for char in text: if char in vowels: count += 1 return count print(count_vowels("Hello World")) # 2가 나와야 하는데 1이 나옴

💡 정답 확인

정답: 대문자를 처리하지 못해요!

  • “Hello”의 ‘e’는 찾지만 ‘E’는 못 찾아요
  • 해결: text.lower()로 소문자 변환하거나 vowels = "aeiouAEIOU"

Q2. print() 디버깅의 장점은?

정답:

  1. 간단하고 빠르게 사용할 수 있어요
  2. 변수의 실제 값을 확인할 수 있어요
  3. 프로그램의 실행 흐름을 추적할 수 있어요
  4. 별도의 도구가 필요 없어요

✅ 디버깅 기초 마스터 체크리스트

✅ 디버깅 기초 마스터 체크리스트

🚀 다음 단계

디버깅 기초를 익혔나요? 마지막으로 지금까지 배운 예외처리와 디버깅을 활용해서 안전한 프로그램을 만드는 방법을 배워볼게요!

Last updated on