Menu
Coddy logo textTech

대출 시스템

Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 84번째.

challenge icon

챌린지

쉬움

모든 대출 작업을 조율하는 Library 클래스를 생성하여 도서 관리 시스템을 완성해 봅시다. 이 중앙 조정자는 도서 컬렉션을 관리하고 도서관이 원활하게 운영되도록 규칙을 시행합니다.

코드는 네 개의 파일로 구성됩니다:

  • Book.php — 이전 레슨에서 작성한 Book 클래스입니다. 읽기 전용 속성(isbn, title, author), true로 시작하는 private $isAvailable 속성, 그리고 isAvailable(), markAsBorrowed(), markAsReturned() 메서드를 포함합니다.
  • User.php — Book 파일을 포함합니다. 읽기 전용 속성(id, name), private $borrowedBooks 배열, 값이 3MAX_BOOKS 상수, 그리고 getBorrowedBooks(), canBorrow(), addBook(Book $book), removeBook(string $isbn) 메서드를 포함하는 User 클래스입니다.
  • Library.php — User 파일을 포함합니다. 도서 컬렉션을 관리하는 Library 클래스를 생성합니다. 라이브러리에는 다음이 포함되어야 합니다:
    • ISBN을 키로 하여 도서를 저장하는 private $books 배열
    • addBook(Book $book): void — 컬렉션에 도서를 추가합니다.
    • findBook(string $isbn): ?Book — 도서를 반환하거나 찾지 못한 경우 null을 반환합니다.
    • borrowBook(User $user, string $isbn): string — 대출 가능 여부를 검증하고 처리하며, 적절한 메시지를 반환합니다.
    • returnBook(User $user, string $isbn): string — 반납을 처리하고 도서와 사용자 상태를 모두 업데이트합니다.

    borrowBook 메서드는 다음 세 가지 조건을 순서대로 확인하고 정확히 이 메시지들을 반환해야 합니다:

    • "Book not found" — 도서가 존재하지 않는 경우
    • "Book is not available" — 이미 대출 중인 경우
    • "Borrowing limit reached" — 사용자가 이미 3권의 책을 대출한 경우
    • "Successfully borrowed: [title]" — 대출 성공 시

    returnBook 메서드는 도서가 존재하지 않으면 "Book not found"를 반환하고, 성공 시 "Successfully returned: [title]"를 반환해야 합니다.

  • main.php — Library 파일을 포함합니다. ISBN과 도서 제목이라는 두 개의 입력을 받습니다.

    Library 인스턴스, ID가 1이고 이름이 "Alice"User, 그리고 제공된 ISBN, 제목, 저자 "Unknown"을 가진 Book을 생성합니다. 도서를 라이브러리에 추가한 후, 다음 작업을 수행하고 각 결과를 새 줄에 출력하세요:

    1. 도서 대출
    2. 동일한 도서 다시 대출 시도
    3. 도서 반납
    4. 도서 다시 한 번 대출

이 챌린지는 Library 클래스가 어떻게 비즈니스 로직을 중앙 집중화하는지 보여줍니다. 조건을 검증하고, BookUser 객체 간의 상태 변화를 조율하며, 각 작업에 대해 의미 있는 피드백을 반환합니다.

직접 해보기

<?php
require_once 'Library.php';

// 입력 읽기
$isbn = trim(fgets(STDIN));
$title = trim(fgets(STDIN));

// TODO: Library 인스턴스 생성

// TODO: ID가 1이고 이름이 "Alice"인 User 생성

// TODO: 제공된 ISBN, 제목 및 저자가 "Unknown"인 Book 생성

// TODO: 도서관에 책 추가

// TODO: 다음 작업을 수행하고 각 결과를 새 줄에 출력:
// 1. 책 대출
// 2. 동일한 책을 다시 대출 시도
// 3. 책 반납
// 4. 책을 한 번 더 대출

?>

객체 지향 프로그래밍의 모든 레슨