UE5 부트캠프(TIL)

[TIL] 도서관 기능 구현

Yellow Kirin 2025. 6. 13. 21:14

 

#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>

using namespace std; // namespace std 사용

class Book {
public:
    string title;
    string author;

    Book(const string& title, const string& author)
        : title(title), author(author) {
    }
};

class BookManager {
private:
    vector<Book> books; // 책 목록 저장

public:
    // 책 추가 메서드
    void addBook(const string& title, const string& author) {
        books.push_back(Book(title, author)); // push_back 사용
        cout << "책이 추가되었습니다: " << title << " by " << author << endl;
    }

    // 모든 책 출력 메서드
    void displayAllBooks() const {
        if (books.empty()) {
            cout << "현재 등록된 책이 없습니다." << endl;
            return;
        }

        cout << "현재 도서 목록:" << endl;
        for (size_t i = 0; i < books.size(); i++) { // 일반적인 for문 사용
            cout << "- " << books[i].title << " by " << books[i].author << endl;
        }
    }
    //타이틀 검색 매서드
    void searchTitle(const string& title)  {
        bool found = false;
        cout << "[검색 결과 - 제목: " << title << "]" << endl;
        for (const Book& book : books) {
            if (book.title == title) {
                cout << "- " << book.title << " by " << book.author << endl;
                found = true;
            }
        }
        if (!found) {
            cout << "입력한 제목과 일치하는 도서를 찾지 못했습니다." << endl;
        }
        

    }
    //
    void searchAuthor(const string& author) {
        bool found = false;
        cout << "[검색 결과 - 저자: " << author << "]" << endl;
        for (const Book& book : books) {
            if (book.author == author) {
                cout << "- " << book.title << " by " << book.author << endl;
                found = true;
            }
        }
        if (!found) {
            cout << "입력한 저자와 일치하는 도서를 찾지 못했습니다." << endl;
        }

    }

    vector<Book>& getBooks()  {
        return books;
    }
};

class borrowManager {
private:
    unordered_map<string, int> stock;

public:
    void initializeStock(Book& book,int quantity = 3) {
        string title = book.title;
        stock[title] = quantity;

    }
    void borrowBook(string& title) {
        if (stock.find(title) == stock.end()) {
            cout << "해당 도서는 재고에 없습니다." << endl;
            return;
        }
        if (stock[title] <= 0) {
            cout << "해당 도서는 모두 대여 중입니다." << endl;
            return;
        }
        stock[title]--;
        cout << title << " 도서가 대여되었습니다." << endl;

    }
    void returnBook(string& title) {
        if (stock.find(title) == stock.end()) {
            cout << "해당 도서는 이 도서관에서 관리하지 않습니다." << endl;
            return;
        }
        stock[title]++;
        cout << title << " 도서가 반납되었습니다." << endl;
    }
    void displayStock() {

        cout << "도서 재고 목록:" << endl;
        for (const auto& pair : stock) {
            cout << "- " << pair.first << ": " << pair.second << "권 남음" << endl;
        }

    }

};

int main() {
    BookManager manager;
    borrowManager bookSellManager;


    // 도서관 관리 프로그램의 기본 메뉴를 반복적으로 출력하여 사용자 입력을 처리합니다.
    // 프로그램 종료를 선택하기 전까지 계속 동작합니다.
    while (true) {
        cout << "\n도서관 관리 프로그램" << endl;
        cout << "1. 책 추가" << endl; // 책 정보를 입력받아 책 목록에 추가
        cout << "2. 모든 책 출력" << endl; // 현재 책 목록에 있는 모든 책 출력
        cout << "3. 종료" << endl; // 프로그램 종료
        cout << "4. 책 타이틀로 검색" << endl;
        cout << "5. 책 저자로 검색" << endl;
        cout << "6. 책 대여" << endl;
        cout << "7. 책 반납" << endl;


        cout << "선택: ";

        int choice; // 사용자의 메뉴 선택을 저장
        cin >> choice;

        if (choice == 1) {
            // 1번 선택: 책 추가
            // 사용자로부터 책 제목과 저자명을 입력받아 BookManager에 추가합니다.
            string title, author;
            cout << "책 제목: ";
            cin.ignore(); // 이전 입력의 잔여 버퍼를 제거
            getline(cin, title); // 제목 입력 (공백 포함)
            cout << "책 저자: ";
            getline(cin, author); // 저자명 입력 (공백 포함)
            manager.addBook(title, author);
            vector<Book>& allBooks = manager.getBooks();
            // 책마다 BorrowManager에 재고 등록
            for (Book& book : allBooks) {
                bookSellManager.initializeStock(book);
            }
        }
        else if (choice == 2) { 
            // 2번 선택: 모든 책 출력
            // 현재 BookManager에 저장된 책 목록을 출력합니다.
            manager.displayAllBooks();
        }
        else if (choice == 3) {
            // 3번 선택: 종료
            // 프로그램을 종료하고 사용자에게 메시지를 출력합니다.
            cout << "프로그램을 종료합니다." << endl;
            break; // while 루프 종료
        }
        else if (choice == 4) {
            string title;
            cout << "검색하고 싶은 제목을 입력하십쇼" << endl;
            cin.ignore(); // 이전 입력의 잔여 버퍼를 제거
            getline(cin, title); // 제목 입력 (공백 포함)
            manager.searchTitle(title);
            
        }
        else if (choice == 5) {

            string author;
            cout << "검색하고 싶은 책의 저자를 입력하십쇼" << endl;
            cin.ignore(); // 이전 입력의 잔여 버퍼를 제거
            getline(cin, author); // 제목 입력 (공백 포함)
            manager.searchAuthor(author);
        }
        else if (choice == 6) {
            string title;
            bookSellManager.displayStock();

            cout << "대여하고 싶은 책 제목을 입력하십쇼" << endl;
            cin.ignore();
            getline(cin, title);
            bookSellManager.borrowBook(title);
            
        }
        else if (choice == 7) {

            string title;
            bookSellManager.displayStock();
            cout << "반납하고 싶은 책을 입력하십쇼 " << endl;
            cin.ignore();
            getline(cin, title);
            bookSellManager.returnBook(title);
        }
        else {
            // 잘못된 입력 처리
            // 메뉴에 없는 번호를 입력했을 경우 경고 메시지를 출력합니다.
            cout << "잘못된 입력입니다. 다시 시도하세요." << endl;
        }
    }

    return 0; // 프로그램 정상 종료
}