Menu
Coddy logo textTech

검색 기능

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

challenge icon

챌린지

쉬움

강력한 검색 기능을 추가하여 도서 관리 시스템을 개선해 봅시다! 사용자가 원하는 책을 찾을 수 없다면 도서관은 큰 도움이 되지 않을 것입니다. 제목과 저자로 검색하는 메서드를 추가하여 도서관을 진정으로 기능적으로 만들어 보겠습니다.

기존에 작성한 네 개의 파일에 코드를 계속해서 빌드하게 됩니다:

  • Book.java: isbn, title, author, isAvailable, borrowedBy, getDetails() 및 적절한 getter/setter를 포함한 기존의 모든 기능을 갖춘 Book 클래스를 유지합니다. 아직 추가하지 않았다면 titleauthor에 대한 getter 메서드가 있는지 확인하세요.
  • User.java: id, name, borrowedBooks ArrayList, borrowBook(), returnBook(), getBorrowedCount() 및 toString()을 포함한 User 클래스를 변경 없이 유지합니다.
  • Library.java: 검색 기능을 추가하여 Library 클래스를 확장합니다. 기존의 모든 메서드(addBook, registerUser, findBookByIsbn, findUserById, borrowBook, returnBook)를 유지하고 다음의 새로운 검색 메서드들을 추가합니다:

    searchByTitle(String keyword) - 제목에 키워드가 포함된 모든 도서를 포함하는 ArrayList<Book>을 반환합니다(대소문자 구분 없음). 비교를 위해 제목과 키워드 모두에 toLowerCase()를 사용하세요.

    searchByAuthor(String keyword) - 저자 이름에 키워드가 포함된 모든 도서를 포함하는 ArrayList<Book>을 반환합니다(대소문자 구분 없음).

    getAvailableBooks() - 현재 대출 가능한 도서들만 포함하는 ArrayList<Book>을 반환합니다.

  • Main.java: 검색 시스템을 시연해 보세요! 세 권의 도서 정보(각각 ISBN, 제목, 저자), 사용자 정보(ID, 이름), 대출 작업 및 두 개의 검색 쿼리를 입력받습니다.

    Library를 생성하고, 세 권의 도서를 모두 추가한 후 사용자를 등록합니다. 대출 작업(userId:isbn 형식)을 처리합니다. 그런 다음 두 가지 검색을 수행합니다. 첫 번째 입력은 제목 키워드이고, 두 번째는 저자 키워드입니다.

    결과를 다음 순서대로 출력하세요:

    • 대출 후, 대출 확인 메시지를 출력합니다.
    • Title search '[keyword]':를 출력한 후, 일치하는 각 도서의 상세 정보를 별도의 줄에 출력합니다(getDetails() 사용). 일치하는 항목이 없으면 No books found를 출력합니다.
    • Author search '[keyword]':를 출력한 후, 일치하는 각 도서의 상세 정보를 출력합니다. 일치하는 항목이 없으면 No books found를 출력합니다.
    • Available books:를 출력한 후, 대출 가능한 각 도서의 상세 정보를 출력합니다.

입력은 다음 순서대로 제공됩니다: book1 ISBN, book1 title, book1 author, book2 ISBN, book2 title, book2 author, book3 ISBN, book3 title, book3 author, user ID, user name, borrow operation, title search keyword, author search keyword.

예를 들어, 입력값이 ISBN-001, Clean Code, Robert Martin, ISBN-002, The Clean Coder, Robert Martin, ISBN-003, Design Patterns, Gang of Four, U001, Alice, U001:ISBN-001, clean, martin인 경우, 출력은 다음과 같습니다:

Alice borrowed Clean Code
Title search 'clean':
[ISBN-001] Clean Code by Robert Martin
[ISBN-002] The Clean Coder by Robert Martin
Author search 'martin':
[ISBN-001] Clean Code by Robert Martin
[ISBN-002] The Clean Coder by Robert Martin
Available books:
[ISBN-002] The Clean Coder by Robert Martin
[ISBN-003] Design Patterns by Gang of Four

검색 메서드가 대소문자를 구분하지 않고 일치하는 항목을 찾는 방식에 주목하세요. "clean"을 검색하면 "Clean Code"와 "The Clean Coder"가 모두 검색됩니다. 대출 가능한 도서 목록에서는 대출된 도서가 올바르게 제외됩니다. 이러한 검색 기능은 여러분의 도서관을 단순한 수집함에서 진정으로 사용 가능한 시스템으로 변화시킵니다!

직접 해보기

import java.util.Scanner;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 도서 1 정보 읽기
        String isbn1 = scanner.nextLine();
        String title1 = scanner.nextLine();
        String author1 = scanner.nextLine();
        
        // 도서 2 정보 읽기
        String isbn2 = scanner.nextLine();
        String title2 = scanner.nextLine();
        String author2 = scanner.nextLine();
        
        // 도서 3 정보 읽기
        String isbn3 = scanner.nextLine();
        String title3 = scanner.nextLine();
        String author3 = scanner.nextLine();
        
        // 사용자 정보 읽기
        String userId = scanner.nextLine();
        String userName = scanner.nextLine();
        
        // 대출 작업 읽기
        String borrowOp = scanner.nextLine();
        
        // 검색 키워드 읽기
        String titleKeyword = scanner.nextLine();
        String authorKeyword = scanner.nextLine();
        
        // Book 객체 생성
        Book book1 = new Book(isbn1, title1, author1);
        Book book2 = new Book(isbn2, title2, author2);
        Book book3 = new Book(isbn3, title3, author3);
        
        // User 객체 생성
        User user = new User(userId, userName);
        
        // Library 생성 및 도서와 사용자 추가
        Library library = new Library();
        library.addBook(book1);
        library.addBook(book2);
        library.addBook(book3);
        library.registerUser(user);
        
        // 대출 작업 처리
        String[] parts = borrowOp.split(":");
        String opUserId = parts[0];
        String opIsbn = parts[1];
        library.borrowBook(opUserId, opIsbn);
        
        // TODO: 제목 검색
        // "Title search '[titleKeyword]':" 출력
        // library.searchByTitle(titleKeyword) 사용
        // 각 도서의 getDetails()를 출력하거나, 비어있을 경우 "No books found" 출력
        
        // TODO: 저자 검색
        // "Author search '[authorKeyword]':" 출력
        // library.searchByAuthor(authorKeyword) 사용
        // 각 도서의 getDetails()를 출력하거나, 비어있을 경우 "No books found" 출력
        
        // TODO: 대출 가능한 도서
        // "Available books:" 출력
        // library.getAvailableBooks() 사용
        // 각 도서의 getDetails() 출력
    }
}

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