예외 처리 통합
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 82번째.
챌린지
쉬움적절한 예외 처리를 통합하여 도서 관리 시스템을 더욱 견고하게 만들어 봅시다! 실제 도서관 시스템은 오류 상황을 우아하게 처리해야 합니다. 존재하지 않는 책을 대출하려고 하거나, 사용자가 허용된 것보다 더 많은 책을 대출하려고 하면 어떻게 될까요? 이러한 시나리오에 대해 의미 있는 피드백을 제공하는 사용자 정의 예외를 생성하게 됩니다.
여러분은 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:authorREGISTER_USER:id:nameBORROW: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" 출력
}
}객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조