Menu
Coddy logo textTech

예외 처리 통합

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

challenge icon

챌린지

쉬움

적절한 예외 처리를 통합하여 도서 관리 시스템을 더욱 견고하게 만들어 봅시다! 실제 도서관 시스템은 오류 상황을 우아하게 처리해야 합니다. 존재하지 않는 책을 대출하려고 하거나, 사용자가 허용된 것보다 더 많은 책을 대출하려고 하면 어떻게 될까요? 이러한 시나리오에 대해 의미 있는 피드백을 제공하는 사용자 정의 예외를 생성하게 됩니다.

여러분은 6개의 파일에 걸쳐 기존 코드를 계속해서 구축해 나갈 것입니다:

  • Book.java: isbn, title, author, isAvailable, borrowedBy, getDetails() 및 적절한 getter/setter를 포함한 모든 기존 기능을 갖춘 Book 클래스를 유지합니다.
  • User.java: id, name, borrowedBooks ArrayList, borrowBook(), returnBook(), getBorrowedCount() 및 toString()을 포함한 User 클래스를 유지합니다.
  • LibraryException.java: Exception을 상속받는 LibraryException이라는 기본 사용자 정의 예외 클래스를 생성합니다. 이 클래스는 모든 도서관 관련 예외의 부모 클래스가 됩니다. 메시지를 받아 부모 클래스로 전달하는 생성자를 포함하세요.
  • BookNotAvailableException.java: LibraryException을 상속받는 사용자 정의 예외를 생성합니다. 이 예외는 이미 대출된 책을 대출하려고 할 때 발생해야 합니다. 책의 ISBN을 받아 Book not available: [isbn]과 같은 의미 있는 메시지를 생성하는 생성자를 포함하세요.
  • Library.java: 오류 메시지를 출력하는 대신 예외를 던지도록 Library 클래스를 업데이트합니다. borrowBook(String userId, String isbn) 메서드를 다음과 같이 수정하세요:
    • 사용자가 존재하지 않으면 User not found: [userId] 메시지와 함께 LibraryException을 던집니다.
    • 책이 존재하지 않으면 Book not found: [isbn] 메시지와 함께 LibraryException을 던집니다.
    • 책이 이미 대출 중이면 BookNotAvailableException을 던집니다.
    • 성공하면 사용자가 책을 대출하게 하고 확인 메시지 [userName] borrowed [bookTitle]를 반환합니다.

    메서드 시그니처를 throws LibraryException으로 변경하고 반환 타입을 String으로 변경하세요.

    다른 모든 메서드(addBook, registerUser, findBookByIsbn, findUserById, returnBook, removeBook, searchByTitle, searchByAuthor, getAvailableBooks)는 이전과 동일하게 작동하도록 유지합니다.

  • Main.java: 예외 처리를 시연해 보세요! 쉼표로 구분된 명령 문자열을 받게 됩니다. 각 명령은 다음 형식 중 하나를 따릅니다:
    • ADD_BOOK:isbn:title:author
    • REGISTER_USER:id:name
    • BORROW:userId:isbn

    각 명령을 처리합니다. ADD_BOOK의 경우 Added: [title]을 출력합니다. REGISTER_USER의 경우 Registered: [name]을 출력합니다. BORROW 명령의 경우 try-catch 블록을 사용하여 예외를 처리합니다. 성공 시 확인 메시지를 출력하고, LibraryException이 발생하면 Error: [exception message]를 출력합니다.

    모든 명령을 처리한 후 Operations completed를 출력합니다.

하나의 입력을 받게 됩니다: 쉼표로 구분된 명령 문자열입니다.

예를 들어, 입력이 ADD_BOOK:ISBN-001:Clean Code:Robert Martin,REGISTER_USER:U001:Alice,BORROW:U001:ISBN-001,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001인 경우, 출력은 다음과 같습니다:

Added: Clean Code
Registered: Alice
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Error: User not found: U002
Operations completed

사용자 정의 예외가 어떻게 명확하고 구체적인 오류 메시지를 제공하는지 확인해 보세요. 첫 번째 대출은 성공하고, 두 번째는 책이 이미 대출되었기 때문에 실패하며(BookNotAvailableException), 세 번째는 사용자 U002가 존재하지 않기 때문에 실패합니다(LibraryException). 이러한 접근 방식은 일반적인 오류 메시지보다 도서관 시스템을 훨씬 더 유익하고 디버깅하기 쉽게 만들어 줍니다!

직접 해보기

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

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 쉼표로 구분된 명령 읽기
        String input = scanner.nextLine();
        String[] commands = input.split(",");
        
        // Library 및 AdminService 생성
        Library library = new Library();
        AdminService adminService = new AdminService(library);
        
        // 각 명령 처리
        for (String command : commands) {
            String[] parts = command.split(":");
            String operation = parts[0];
            
            if (operation.equals("ADD_BOOK")) {
                String isbn = parts[1];
                String title = parts[2];
                String author = parts[3];
                if (adminService.addBook(isbn, title, author)) {
                    System.out.println("Added: " + title);
                }
            } else if (operation.equals("REMOVE_BOOK")) {
                String isbn = parts[1];
                if (adminService.removeBook(isbn)) {
                    System.out.println("Removed: " + isbn);
                } else {
                    System.out.println("Cannot remove: " + isbn);
                }
            } else if (operation.equals("REGISTER_USER")) {
                String id = parts[1];
                String name = parts[2];
                if (adminService.registerUser(id, name)) {
                    System.out.println("Registered: " + name);
                }
            } else if (operation.equals("BORROW")) {
                String userId = parts[1];
                String isbn = parts[2];
                // TODO: try-catch 블록을 사용하여 library.borrowBook(userId, isbn) 호출
                // 성공 시, 반환된 확인 메시지 출력
                // LibraryException 발생 시, "Error: " + e.getMessage() 출력
            }
        }
        
        // TODO: "Operations completed" 출력
    }
}

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