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() 디버깅의 장점은?
정답:
- 간단하고 빠르게 사용할 수 있어요
- 변수의 실제 값을 확인할 수 있어요
- 프로그램의 실행 흐름을 추적할 수 있어요
- 별도의 도구가 필요 없어요
✅ 디버깅 기초 마스터 체크리스트
✅ 디버깅 기초 마스터 체크리스트
🚀 다음 단계
디버깅 기초를 익혔나요? 마지막으로 지금까지 배운 예외처리와 디버깅을 활용해서 안전한 프로그램을 만드는 방법을 배워볼게요!
Last updated on