B10.파이썬 중급 프로젝트

학습 목표

이번 강의에서는 지금까지 배운 내용들을 종합하여 중급 수준의 프로젝트를 진행해 보겠습니다. 이 프로젝트를 통해 파이썬의 다양한 기능을 실제로 활용하고, 소프트웨어 개발의 전체적인 흐름을 이해할 수 있는 기회를 제공합니다.

프로젝트 개요

이번 프로젝트에서는 간단한 할 일 목록 관리 프로그램을 구현합니다. 이 프로그램은 사용자로부터 할 일을 입력받아 목록에 추가하고, 목록을 표시하며, 항목을 삭제하는 기능을 갖출 것입니다. 데이터를 파일에 저장하여 프로그램이 종료된 후에도 할 일을 유지할 수 있도록 합니다.

필요한 기능

  • 할 일 추가하기
  • 할 일 목록 표시하기
  • 할 일 삭제하기
  • 프로그램 종료 시 데이터 파일에 저장하기
  • 프로그램 시작 시 저장된 데이터 불러오기

예제 코드

import json

# 할 일 목록 관리 클래스
class TodoList:
    def __init__(self, filename='todo_list.json'):
        self.filename = filename
        self.tasks = self.load_tasks()

    def load_tasks(self):
        """파일에서 할 일 목록을 로드"""
        try:
            with open(self.filename, 'r') as file:
                return json.load(file)
        except (FileNotFoundError, json.JSONDecodeError):
            return []  # 파일이 없거나 비어있으면 빈 리스트 반환

    def save_tasks(self):
        """할 일 목록을 파일에 저장"""
        with open(self.filename, 'w') as file:
            json.dump(self.tasks, file)

    def add_task(self, task):
        """할 일 추가"""
        self.tasks.append(task)
        self.save_tasks()

    def display_tasks(self):
        """할 일 목록 출력"""
        print("\n할 일 목록:")
        for i, task in enumerate(self.tasks, 1):
            print(f"{i}. {task}")

    def remove_task(self, index):
        """할 일 삭제"""
        if 0 <= index < len(self.tasks):
            removed_task = self.tasks.pop(index)
            print(f"'{removed_task}'이(가) 삭제되었습니다.")
            self.save_tasks()
        else:
            print("유효하지 않은 번호입니다.")

# 메인 프로그램
def main():
    todo_list = TodoList()  # TodoList 객체 생성
    while True:
        print("\n1. 할 일 추가")
        print("2. 할 일 목록 보기")
        print("3. 할 일 삭제")
        print("4. 종료")
        
        choice = input("원하는 작업을 선택하세요 (1-4): ")
        if choice == '1':
            task = input("추가할 할 일을 입력하세요: ")
            todo_list.add_task(task)
        elif choice == '2':
            todo_list.display_tasks()
        elif choice == '3':
            todo_list.display_tasks()
            try:
                index = int(input("삭제할 할 일의 번호를 입력하세요: ")) - 1
                todo_list.remove_task(index)
            except ValueError:
                print("숫자를 입력해야 합니다.")
        elif choice == '4':
            print("프로그램을 종료합니다.")
            break
        else:
            print("잘못된 선택입니다. 다시 시도하세요.")

if __name__ == "__main__":
    main()  # 프로그램 시작

코드 설명

  • TodoList 클래스: 할 일을 관리하는 클래스로, JSON 파일을 통해 데이터를 저장하고 로드합니다.
  • 메서드:
    • load_tasks: 저장된 할 일 목록을 로드합니다.
    • save_tasks: 현재 할 일 목록을 파일에 저장합니다.
    • add_task: 새로운 할 일을 추가하고 저장합니다.
    • display_tasks: 현재 할 일 목록을 출력합니다.
    • remove_task: 선택한 할 일을 삭제합니다.
  • 메인 프로그램: 사용자로부터 입력을 받아 할 일을 추가, 표시 및 삭제하는 기능을 구현합니다.

연습 문제

1. 사용자가 할 일에 기한을 추가할 수 있도록 기능을 확장해 보세요. 기한이 지난 할 일은 별도로 표시하세요.

2. 사용자가 할 일을 우선순위에 따라 추가할 수 있도록 기능을 추가하고, 우선순위에 따라 리스트를 정렬하여 표시하세요.

연습 문제 해답

# 1번 문제: 기한 추가 기능 확대
class TodoListWithDeadline(TodoList):
    def add_task(self, task, deadline=None):
        """기한이 포함된 할 일 추가"""
        if deadline:
            task = f"{task} (기한: {deadline})"
        super().add_task(task)

    def display_tasks(self):
        """할 일 목록 출력 (기한 포함)"""
        print("\n할 일 목록:")
        for i, task in enumerate(self.tasks, 1):
            print(f"{i}. {task}")
        print("\n기한이 지난 할 일:")
        for task in self.tasks:
            if "기한:" in task:
                parts = task.split(" (기한: ")
                task_name = parts[0]
                task_deadline = parts[1][:-1]  # ')' 지우기
                if task_deadline < '2023-12-31':  # 예시 날짜 비교
                    print(f"{task_name} (기한: {task_deadline})")

# 우선순위 기능 추가 가능
# 2번 문제를 위한 수정 사항 추가
### 설명 - **중급 프로젝트**로 할 일 목록 관리 프로그램을 구현하여 실제 응용 프로그램에서 필요한 다양한 기능을 익힐 수 있도록 합니다. - **JSON 파일**을 사용하여 데이터를 영구적으로 저장함으로써 구현의 실제적인 사용 사례를 보여줍니다. - **연습 문제**를 통해 사용자가 프로젝트의 기능을 확장하는 과정에서 코드의 이해도를 높이고, 실제 기능을 구현하는 능력을 기를 수 있도록 하였습니다. - 프로그램을 확장하는 방법을 학습하는 것은 실무에서 발생할 수 있는 다양한 요구 사항을 처리하는 데 도움이 됩니다.

댓글 쓰기

0 댓글