Menu
Coddy logo textTech

대출 시스템

Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 57번째.

challenge icon

챌린지

중급

이 챌린지에서는 대출 기능이 포함된 도서관 관리 시스템을 구현합니다.

다음 파일들에 필요한 기능을 구현하세요:

  • book.py - Book 클래스 정의를 포함합니다
  • user.py - User 클래스 정의를 포함합니다
  • library.py - borrow_book 메서드를 구현할 Library 클래스를 포함합니다

단계별 구현 안내를 위해 각 파일의 TODO 주석을 따르세요. borrow_book 메서드는 도서/사용자를 찾을 수 없는 경우와 대출 가능 여부 확인을 포함한 다양한 시나리오를 처리해야 합니다.

치트 시트

이 챌린지는 객체 지향 프로그래밍 원칙을 사용하여 도서 관리 시스템을 구현하는 데 중점을 둡니다. 이 시스템은 세 가지 주요 클래스로 구성됩니다:

  • Book 클래스 - 도서관의 개별 도서를 나타냅니다
  • User 클래스 - 도서를 대출할 수 있는 도서관 사용자를 나타냅니다
  • Library 클래스 - 도서 컬렉션을 관리하고 대출 작업을 처리합니다

주요 기능은 다음을 처리하는 borrow_book 메서드를 구현하는 것입니다:

  • 시스템에 도서와 사용자가 존재하는지 확인
  • 대출 전 도서 가용성 확인
  • 사용자와 도서 간의 대출 프로세스 관리

직접 해보기

from book import Book
from user import User
from library import Library
import random

# 종합 테스트 케이스 처리기
test_case = input()

# 기본 기능 테스트
if test_case == "borrow_success":
    library = Library("Community Library")
    
    # 도서 및 사용자 추가
    book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
    library.add_book(book)
    
    user = User("U001", "Alice")
    library.add_user(user)
    
    # 도서 대출
    result = library.borrow_book("123456", "U001")
    print(result)
    print(f"Book available: {book.available}")
    print(f"Books borrowed by user: {len(user.books_borrowed)}")

elif test_case == "book_not_found":
    library = Library("Community Library")
    user = User("U001", "Alice")
    library.add_user(user)
    
    result = library.borrow_book("nonexistent", "U001")
    print(result)

elif test_case == "user_not_found":
    library = Library("Community Library")
    book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
    library.add_book(book)
    
    result = library.borrow_book("123456", "nonexistent")
    print(result)
    
elif test_case == "book_not_available":
    library = Library("Community Library")
    
    # 도서 및 사용자 추가
    book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
    book.available = False  # 도서가 이미 대출됨
    library.add_book(book)
    
    user = User("U001", "Alice")
    library.add_user(user)
    
    # 대출 불가능한 도서 대출 시도
    result = library.borrow_book("123456", "U001")
    print(result)

# 예외 케이스 및 추가 테스트
elif test_case == "multiple_books":
    library = Library("Community Library")
    user = User("U001", "Alice")
    library.add_user(user)
    
    # 여러 권의 도서 생성
    books = [
        Book("Book 1", "Author 1", "111"),
        Book("Book 2", "Author 2", "222"),
        Book("Book 3", "Author 3", "333")
    ]
    
    for book in books:
        library.add_book(book)
    
    # 여러 권의 도서 대출
    results = []
    for book in books:
        results.append(library.borrow_book(book.isbn, "U001"))
    
    for result in results:
        print(result)
    
    print(f"Total books borrowed: {len(user.books_borrowed)}")

elif test_case == "multiple_users":
    library = Library("Community Library")
    book = Book("Popular Book", "Famous Author", "999")
    library.add_book(book)
    
    # 여러 명의 사용자 생성
    users = [
        User("U001", "Alice"),
        User("U002", "Bob"),
        User("U003", "Charlie")
    ]
    
    for user in users:
        library.add_user(user)
    
    # 동일한 도서를 서로 다른 사용자가 대출 시도
    result1 = library.borrow_book("999", "U001")
    result2 = library.borrow_book("999", "U002")  # 실패해야 함
    
    print(result1)
    print(result2)
    print(f"Book's borrower: {book.borrower.name}")

elif test_case == "return_book":
    library = Library("Community Library")
    book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
    library.add_book(book)
    
    user = User("U001", "Alice")
    library.add_user(user)
    
    # 도서 대출
    borrow_result = library.borrow_book("123456", "U001")
    print(borrow_result)
    
    # 도서 상태 확인
    print(f"Book available: {book.available}")
    print(f"Book borrower: {book.borrower.name}")
    print(f"User's borrowed books: {len(user.books_borrowed)}")
    print(f"First borrowed book title: {user.books_borrowed[0].title}")

elif test_case == "empty_library":
    library = Library("Empty Library")
    result = library.borrow_book("any_isbn", "any_user_id")
    print(result)

elif test_case == "stress_test":
    library = Library("Large Library")
    
    # 100권의 도서 생성 및 추가
    for i in range(1, 101):
        book = Book(f"Book {i}", f"Author {i}", f"ISBN-{i}")
        library.add_book(book)
    
    # 50명의 사용자 생성 및 추가
    for i in range(1, 51):
        user = User(f"U{i:03d}", f"User {i}")
        library.add_user(user)
    
    # 200번의 대출 작업 수행
    successful = 0
    book_not_found = 0
    user_not_found = 0
    not_available = 0
    
    for _ in range(200):
        # 무작위 ISBN 및 사용자 ID 생성 (일부는 유효하고 일부는 유효하지 않음)
        isbn = f"ISBN-{random.randint(1, 120)}"  # 일부는 유효하지 않음
        user_id = f"U{random.randint(1, 60):03d}"  # 일부는 유효하지 않음
        
        result = library.borrow_book(isbn, user_id)
        
        if result == "Book borrowed successfully":
            successful += 1
        elif result == "Book not found":
            book_not_found += 1
        elif result == "User not found":
            user_not_found += 1
        elif result == "Book is not available":
            not_available += 1
    
    print(f"Successful borrows: {successful}")
    print(f"Book not found: {book_not_found}")
    print(f"User not found: {user_not_found}")
    print(f"Book not available: {not_available}")

elif test_case == "borrower_reference":
    library = Library("Community Library")
    book = Book("The Great Gatsby", "F. Scott Fitzgerald", "123456")
    library.add_book(book)
    
    user = User("U001", "Alice")
    library.add_user(user)
    
    # 도서 대출
    library.borrow_book("123456", "U001")
    
    # 참조 확인
    print(f"Book's borrower name: {book.borrower.name}")
    print(f"First book in user's borrowed list: {user.books_borrowed[0].title}")

Object Oriented Programming의 모든 레슨