Topic 4: 안전한 프로그램 만들기 🛡️
🎯 학습 목표
지금까지 배운 예외처리와 디버깅을 활용해서 사용자 친화적이고 안전한 프로그램을 만들어요!
- 사용자 입력을 안전하게 처리하기
- 프로그램이 멈추지 않도록 설계하기
- 친절한 에러 메시지 작성하기
🏗️ 안전한 프로그램의 특징
좋은 프로그램은:
- 예상치 못한 입력에도 멈추지 않아요
- 친절한 안내 메시지를 제공해요
- 다시 시도할 기회를 줘요
- 데이터를 안전하게 보호해요
💪 실전 예제 1: 안전한 숫자 입력받기
기본 버전 (위험!)
# 문제가 있는 코드
age = int(input("나이를 입력하세요: "))
print(f"당신은 {age}살입니다.")
개선된 버전
def get_age():
while True:
try:
age = int(input("나이를 입력하세요: "))
if age < 0:
print("나이는 음수일 수 없어요!")
continue
elif age > 150:
print("정말 그렇게 나이가 많으신가요? 다시 입력해주세요.")
continue
return age
except ValueError:
print("숫자로 입력해주세요!")
# 사용하기
age = get_age()
print(f"당신은 {age}살입니다.")
🎮 실전 예제 2: 메뉴 선택 시스템
def show_menu():
"""안전한 메뉴 시스템"""
menu_items = {
"1": "게임 시작",
"2": "점수 보기",
"3": "설정",
"4": "종료"
}
while True:
print("\n=== 게임 메뉴 ===")
for key, value in menu_items.items():
print(f"{key}. {value}")
choice = input("\n메뉴를 선택하세요: ")
if choice in menu_items:
return choice
else:
print("잘못된 선택입니다. 1-4 중에서 선택해주세요!")
def run_game():
while True:
choice = show_menu()
if choice == "1":
print("게임을 시작합니다! 🎮")
# 게임 로직
elif choice == "2":
print("현재 점수: 100점 🏆")
elif choice == "3":
print("설정 메뉴입니다 ⚙️")
elif choice == "4":
print("게임을 종료합니다. 안녕히 가세요! 👋")
break
# 프로그램 실행
run_game()
📁 실전 예제 3: 파일 안전하게 다루기
def read_file_safely(filename):
"""파일을 안전하게 읽는 함수"""
try:
with open(filename, 'r', encoding='utf-8') as file:
content = file.read()
return content
except FileNotFoundError:
print(f"'{filename}' 파일을 찾을 수 없어요.")
return None
except PermissionError:
print(f"'{filename}' 파일을 읽을 권한이 없어요.")
return None
except Exception as e:
print(f"파일을 읽는 중 오류가 발생했어요: {e}")
return None
def save_file_safely(filename, content):
"""파일을 안전하게 저장하는 함수"""
try:
# 백업 먼저 만들기
backup_name = filename + ".backup"
# 기존 파일이 있으면 백업
try:
with open(filename, 'r', encoding='utf-8') as f:
backup_content = f.read()
with open(backup_name, 'w', encoding='utf-8') as f:
f.write(backup_content)
except:
pass # 기존 파일이 없으면 백업 안 함
# 새 내용 저장
with open(filename, 'w', encoding='utf-8') as file:
file.write(content)
print(f"파일이 성공적으로 저장되었어요!")
return True
except PermissionError:
print("파일을 저장할 권한이 없어요.")
return False
except Exception as e:
print(f"파일 저장 중 오류가 발생했어요: {e}")
return False
🔒 실전 예제 4: 로그인 시스템
def login_system():
"""안전한 로그인 시스템"""
# 실제로는 데이터베이스를 사용하지만, 예제를 위해 딕셔너리 사용
users = {
"user1": "password123",
"admin": "admin456"
}
max_attempts = 3
attempts = 0
while attempts < max_attempts:
try:
username = input("사용자 이름: ")
password = input("비밀번호: ")
if not username or not password:
print("사용자 이름과 비밀번호를 모두 입력해주세요!")
continue
if username in users and users[username] == password:
print(f"환영합니다, {username}님! 🎉")
return True
else:
attempts += 1
remaining = max_attempts - attempts
if remaining > 0:
print(f"로그인 실패. {remaining}번의 기회가 남았습니다.")
else:
print("로그인 시도 횟수를 초과했습니다. 😔")
except KeyboardInterrupt:
print("\n로그인을 취소했습니다.")
return False
except Exception as e:
print(f"오류가 발생했습니다: {e}")
attempts += 1
return False
# 사용 예시
if login_system():
print("프로그램을 시작합니다...")
else:
print("로그인에 실패했습니다.")
🎯 안전한 프로그래밍 체크리스트
✅ 입력 처리
- 모든 사용자 입력을 검증하기
- 범위와 타입 확인하기
- 재시도 기회 제공하기
✅ 에러 처리
- 예상 가능한 모든 에러 처리하기
- 사용자 친화적인 메시지 제공하기
- 프로그램이 멈추지 않도록 하기
✅ 데이터 보호
- 중요한 작업 전 백업하기
- 파일 작업 시 권한 확인하기
- 민감한 정보 보호하기
💡 퀴즈: 안전한 프로그래밍 이해도 체크
Q1. 왜 while True와 try-except를 함께 사용할까요?
정답:
while True
: 올바른 입력을 받을 때까지 계속 시도try-except
: 잘못된 입력이 들어와도 프로그램이 멈추지 않음- 함께 사용하면 사용자가 실수해도 다시 입력할 기회를 줄 수 있어요!
Q2. 파일을 저장할 때 백업을 만드는 이유는?
정답:
- 저장 중 오류가 발생하면 원본 데이터가 손실될 수 있어요
- 백업이 있으면 문제가 생겨도 복구할 수 있어요
- 사용자의 소중한 데이터를 보호하는 것이 중요해요!
✅ 안전한 프로그램 만들기 마스터 체크리스트
✅ 안전한 프로그램 만들기 마스터 체크리스트
🚀 다음 단계
축하합니다! 예외처리와 디버깅을 마스터했어요! 🎉
이제 여러분은:
- 에러 메시지를 읽고 이해할 수 있어요
- try-except로 에러를 우아하게 처리할 수 있어요
- 디버깅으로 버그를 찾고 수정할 수 있어요
- 안전하고 사용자 친화적인 프로그램을 만들 수 있어요
다음 유닛에서는 파일을 다루는 방법을 배워볼게요! 📁
Last updated on