C10.파이썬 고급 프로젝트

학습 목표

이번 강의에서는 이전에 배운 내용을 바탕으로 고급 수준의 파이썬 프로젝트를 진행합니다. 이 프로젝트를 통해 객체지향 프로그래밍, 데이터 저장, 예외 처리, 단위 테스트 등 다양한 개념을 통합하여 실제로 작동하는 애플리케이션을 만들어보겠습니다.

프로젝트 개요

프로젝트의 목표는 간단한 도서 관리 시스템을 구현하는 것입니다. 이 시스템은 사용자가 도서 정보를 추가, 삭제, 검색, 및 목록을 출력할 수 있는 기능을 제공합니다. 또한, 도서 데이터는 파일에 저장되어 프로그램이 종료되더라도 유지될 수 있도록 합니다.

필요한 기능

  • 도서 추가하기
  • 도서 삭제하기
  • 도서 목록 보기
  • 도서 제목으로 검색하기
  • 프로그램 종료 시 데이터 파일에 저장하기
  • 프로그램 시작 시 저장된 데이터 불러오기

예제 코드

import json

class Book:
    def __init__(self, title, author, year):
        self.title = title
        self.author = author
        self.year = year

    def __str__(self):
        return f"{self.title} by {self.author} ({self.year})"

class Library:
    def __init__(self, filename='library.json'):
        self.filename = filename
        self.books = self.load_books()

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

    def save_books(self):
        """도서 목록을 파일에 저장"""
        with open(self.filename, 'w') as file:
            json.dump([book.__dict__ for book in self.books], file)

    def add_book(self, title, author, year):
        """도서 추가"""
        new_book = Book(title, author, year)
        self.books.append(new_book)
        self.save_books()

    def remove_book(self, title):
        """도서 삭제하기"""
        self.books = [book for book in self.books if book.title != title]
        self.save_books()

    def list_books(self):
        """도서 목록 출력"""
        if not self.books:
            print("도서 목록이 비어 있습니다.")
        for book in self.books:
            print(book)

    def search_books(self, title):
        """도서 제목으로 검색하기"""
        found_books = [book for book in self.books if title.lower() in book.title.lower()]
        if found_books:
            for book in found_books:
                print(book)
        else:
            print("찾는 도서가 없습니다.")

def main():
    library = Library()  # 도서관 객체 생성
    while True:
        print("\n1. 도서 추가")
        print("2. 도서 삭제")
        print("3. 도서 목록 보기")
        print("4. 도서 검색")
        print("5. 종료")
        
        choice = input("원하는 작업을 선택하세요 (1-5): ")
        if choice == '1':
            title = input("도서 제목을 입력하세요: ")
            author = input("저자를 입력하세요: ")
            year = input("출판 연도를 입력하세요: ")
            library.add_book(title, author, year)
        elif choice == '2':
            title = input("삭제할 도서 제목을 입력하세요: ")
            library.remove_book(title)
        elif choice == '3':
            library.list_books()
        elif choice == '4':
            title = input("검색할 도서 제목을 입력하세요: ")
            library.search_books(title)
        elif choice == '5':
            print("프로그램을 종료합니다.")
            break
        else:
            print("잘못된 선택입니다. 다시 시도하세요.")

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

코드 설명

  • Book 클래스: 도서의 속성을 정의합니다 (제목, 저자, 연도).
  • Library 클래스: 도서 목록을 관리하며, 도서를 추가, 삭제, 검색 및 파일에 저장하는 메서드를 포함합니다.
  • 도서 정보를 library.json 파일에 JSON 형식으로 저장합니다.
  • 메인 루프: 사용자 입력을 통해 도서 관련 작업을 처리합니다.

연습 문제

1. 도서의 대출 기능을 추가하여 도서를 대출하고 반납하는 기능을 구현해 보세요.

2. 도서의 저자 또는 출판 연도로 검색하는 기능을 추가하세요.

연습 문제 해답

# 도서 대출 기능 추가
class Book:
    def __init__(self, title, author, year):
        self.title = title
        self.author = author
        self.year = year
        self.is_checked_out = False  # 대출 상태 추가

    def checkout(self):
        """도서를 대출하는 메서드"""
        if self.is_checked_out:
            return f"{self.title}은(는) 이미 대출중입니다."
        self.is_checked_out = True
        return f"{self.title}이(가) 대출되었습니다."

    def return_book(self):
        """도서를 반납하는 메서드"""
        if not self.is_checked_out:
            return f"{self.title}은(는) 대출되지 않았습니다."
        self.is_checked_out = False
        return f"{self.title}이(가) 반납되었습니다."

class Library:
    def checkout_book(self, title):
        """도서 대출 기능"""
        for book in self.books:
            if book.title == title:
                return book.checkout()
        return "해당 도서를 찾을 수 없습니다."
    
    def return_book(self, title):
        """도서 반납 기능"""
        for book in self.books:
            if book.title == title:
                return book.return_book()
        return "해당 도서를 찾을 수 없습니다."

# 도서관 관리 메인 프로그램 수정하기
def main():
    library = Library()  # 도서관 객체 생성
    while True:
        print("\n1. 도서 추가")
        print("2. 도서 삭제")
        print("3. 도서 목록 보기")
        print("4. 도서 검색")
        print("5. 도서 대출")
        print("6. 도서 반납")
        print("7. 종료")
        
        choice = input("원하는 작업을 선택하세요 (1-7): ")
        if choice == '1':
            title = input("도서 제목을 입력하세요: ")
            author = input("저자를 입력하세요: ")
            year = input("출판 연도를 입력하세요: ")
            library.add_book(title, author, year)
        elif choice == '2':
            title = input("삭제할 도서 제목을 입력하세요: ")
            library.remove_book(title)
        elif choice == '3':
            library.list_books()
        elif choice == '4':
            title = input("검색할 도서 제목을 입력하세요: ")
            library.search_books(title)
        elif choice == '5':
            title = input("대출할 도서 제목을 입력하세요: ")
            print(library.checkout_book(title))  # 대출 실행
        elif choice == '6':
            title = input("반납할 도서 제목을 입력하세요: ")
            print(library.return_book(title))  # 반납 실행
        elif choice == '7':
            print("프로그램을 종료합니다.")
            break
        else:
            print("잘못된 선택입니다. 다시 시도하세요.")

if __name__ == "__main__":
    main()  # 프로그램 시작
### 설명 - **고급 프로젝트**로 도서 관리 시스템을 구현하여 새로운 기능과 객체지향 프로그래밍 개념을 통합하는 방법을 보여줍니다. - **기능 설명**: 도서 추가, 삭제, 검색, 대출 및 반납 기능을 포함하여 사용자 요구를 충족할 수 있는 과정에 대해 설명합니다. - **연습 문제**를 제공하여 사용자가 프로그램을 확장할 수 있는 기회를 제공하며, 이는 실제 소프트웨어 개발 과정에서 요구되는 문제 해결 능력을 기르는 데 도움을 줍니다. - 사용자는 자신만의 로직과 기능을 추가하여 학습한 개념을 깊이 있게 발전시킬 수 있습니다.

댓글 쓰기

0 댓글