대출 시스템 로직
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 64번째.
챌린지
쉬움핵심 대출 로직을 구현하여 도서관 시스템(Library System)에 생명력을 불어넣어 봅시다! 도서와 사용자 사이를 조율하고, 대출 제한과 같은 도서관 규칙을 적용하며, 도서가 대출 가능할 때만 대출될 수 있도록 보장하는 중앙 집중식 시스템을 만들 것입니다.
기존의 4개 파일 구조를 계속해서 구축해 나갈 것입니다:
Book.cs:Id,Title,Author,IsAvailable속성과 이전 레슨에서 작성한Borrow()및Return()메서드가 포함된 Book 클래스를 유지합니다.User.cs:Name,MemberId,BorrowedCount속성과 대출된 도서를 관리하는 메서드가 포함된 User 클래스를 유지합니다. 사용자가 한 번에 대출할 수 있는 최대 도서 수를 나타내는 상수MaxBooks를 3으로 설정하여 추가합니다. 사용자가MaxBooks보다 적게 대출한 경우에만 true를 반환하는CanBorrow()메서드를 추가합니다.Library.cs: 대출 시스템 로직이 하나로 모이는 곳입니다. Library 클래스는 도서 및 사용자 컬렉션을 가져야 하며, 이를 추가하는 메서드도 있어야 합니다. 다음 두 가지 핵심 메서드를 구현하세요:BorrowBook(string bookId, int memberId)- 대출 프로세스를 조율합니다. 도서가 존재하는지, 사용자가 존재하는지, 도서가 대출 가능한지, 사용자가 더 대출할 수 있는지 확인해야 합니다. 각 실패 사례 또는 성공에 대해 적절한 메시지를 반환합니다.ReturnBook(string bookId, int memberId)- 반납을 처리하기 전에 사용자가 실제로 해당 도서를 가지고 있는지 확인하여 반납을 처리합니다.
Program.cs: 도서관 운영을 처리하고 결과를 표시합니다.
BorrowBook 메서드는 상황에 따라 다음 메시지들을 반환해야 합니다:
Book not found- 도서 ID가 존재하지 않을 때User not found- 회원 ID가 존재하지 않을 때{Title} is not available- 도서가 이미 대출 중일 때{Name} has reached the borrowing limit- 사용자가 이미 3권의 책을 가지고 있을 때{Name} borrowed {Title}- 대출 성공 시
ReturnBook 메서드는 다음을 반환해야 합니다:
Book not found또는User not found- 유효하지 않은 ID인 경우{Name} did not borrow {Title}- 사용자가 가지고 있지 않은 도서를 반납하려고 할 때{Name} returned {Title}- 반납 성공 시
다음 입력을 받게 됩니다:
- 도서관 이름
- 도서 수, 이어서 각 도서 정보
id|title|author - 사용자 수, 이어서 각 사용자 정보
name|memberId - 작업 수, 이어서 각 작업 정보
action|bookId|memberId
각 작업의 결과를 개별 줄에 출력하세요.
예를 들어, 입력이 다음과 같다면:
Central Library
4
B001|The Hobbit|Tolkien
B002|1984|Orwell
B003|Dune|Herbert
B004|Foundation|Asimov
2
Alice|101
Bob|102
6
borrow|B001|101
borrow|B002|101
borrow|B003|101
borrow|B004|101
borrow|B001|102
return|B002|101출력은 다음과 같아야 합니다:
Alice borrowed The Hobbit
Alice borrowed 1984
Alice borrowed Dune
Alice has reached the borrowing limit
The Hobbit is not available
Alice returned 1984Library 클래스가 어떻게 코디네이터 역할을 하는지 주목하세요. 작업을 허용하기 전에 모든 조건을 검증하여 Book 및 User 클래스가 각자의 책임에 집중할 수 있도록 유지합니다. 이러한 분리는 코드를 유지 관리하고 테스트하기 쉽게 만들어 줍니다!
직접 해보기
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// 도서관 이름을 읽습니다
string libraryName = Console.ReadLine();
// 도서관 이름으로 Library 인스턴스를 생성합니다
Library library = new Library(libraryName);
// 도서 수를 읽습니다
int numBooks = Convert.ToInt32(Console.ReadLine());
// 도서를 읽고 추가합니다
for (int i = 0; i < numBooks; i++)
{
string bookInput = Console.ReadLine();
string[] bookParts = bookInput.Split('|');
string bookId = bookParts[0];
string bookTitle = bookParts[1];
string bookAuthor = bookParts[2];
Book book = new Book(bookId, bookTitle, bookAuthor);
library.AddBook(book);
}
// 사용자 수를 읽습니다
int numUsers = Convert.ToInt32(Console.ReadLine());
// 사용자를 읽고 등록합니다
for (int i = 0; i < numUsers; i++)
{
string userInput = Console.ReadLine();
string[] userParts = userInput.Split('|');
string userName = userParts[0];
int memberId = Convert.ToInt32(userParts[1]);
User user = new User(userName, memberId);
library.RegisterUser(user);
}
// 작업 수를 읽습니다
int numOperations = Convert.ToInt32(Console.ReadLine());
// 작업을 처리합니다
for (int i = 0; i < numOperations; i++)
{
string operationInput = Console.ReadLine();
string[] opParts = operationInput.Split('|');
string action = opParts[0];
string bookId = opParts[1];
int memberId = Convert.ToInt32(opParts[2]);
if (action == "borrow")
{
string result = library.BorrowBook(bookId, memberId);
Console.WriteLine(result);
}
else if (action == "return")
{
string result = library.ReturnBook(bookId, memberId);
Console.WriteLine(result);
}
}
}
}
}