테스트 및 통합
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 83번째.
챌린지
쉬움도서 관리 시스템 구축을 축하합니다! 이제 모든 구성 요소를 하나로 모아 통합 시스템으로서 올바르게 작동하는지 확인할 시간입니다. 이 프로젝트 전반에 걸쳐 구축한 모든 기능을 실행하는 포괄적인 테스트 시나리오를 작성하게 됩니다.
완성된 시스템의 7개 파일 모두를 사용하여 작업하게 됩니다:
Book.java: isbn, title, author, isAvailable, borrowedBy 필드와getDetails()를 포함한 모든 관련 메서드가 있는 Book 클래스입니다.User.java: id, name, borrowedBooks 리스트, 그리고 도서 대출/반납 메서드가 있는 User 클래스입니다.LibraryException.java: 기본 사용자 정의 예외 클래스입니다.BookNotAvailableException.java: 대출 불가능한 도서에 대한 예외 클래스입니다.LibraryAdmin.java: 관리자 인터페이스 및 AdminService 구현체입니다.Library.java: 도서 추가/삭제, 사용자 등록, 대출/반납, 검색 및 예외 처리를 포함한 모든 메서드가 있는 완성된 Library 클래스입니다.Main.java: 전체 시스템이 함께 작동하는 것을 보여주는 통합 테스트입니다.
Main 클래스에서 도서 시스템의 모든 주요 기능을 테스트하는 일련의 명령을 처리합니다. 명령은 다음과 같은 형식의 쉼표로 구분된 단일 문자열로 제공됩니다:
ADD_BOOK:isbn:title:author- AdminService를 통해 도서 추가REGISTER_USER:id:name- AdminService를 통해 사용자 등록BORROW:userId:isbn- 도서 대출 (예외 처리 포함)RETURN:userId:isbn- 도서 반납SEARCH_TITLE:keyword- 제목으로 도서 검색SEARCH_AUTHOR:keyword- 저자로 도서 검색REMOVE_BOOK:isbn- AdminService를 통해 도서 삭제
각 명령을 처리하고 적절한 출력을 인쇄하세요:
- ADD_BOOK:
Added: [title] - REGISTER_USER:
Registered: [name] - BORROW: 성공 메시지 또는
Error: [exception message]출력 - RETURN:
[userName] returned [bookTitle] - SEARCH_TITLE:
Search '[keyword]':를 출력한 후 일치하는 각 도서의 상세 정보를 출력하거나, 결과가 없으면No results출력 - SEARCH_AUTHOR: 제목 검색과 동일한 형식
- REMOVE_BOOK:
Removed: [isbn]또는Cannot remove: [isbn]
모든 명령이 끝난 후, 최종 요약을 출력하세요:
--- Final Status ---Books: [count]Users: [count]- 각 사용자에 대해
[name]: [borrowedCount] book(s)출력
입력으로 쉼표로 구분된 명령 문자열 하나를 받게 됩니다.
예를 들어, 입력이 ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Effective Java:Joshua Bloch,REGISTER_USER:U001:Alice,REGISTER_USER:U002:Bob,BORROW:U001:ISBN-001,BORROW:U002:ISBN-001,SEARCH_TITLE:java,RETURN:U001:ISBN-001,REMOVE_BOOK:ISBN-001인 경우, 출력은 다음과 같습니다:
Added: Clean Code
Added: Effective Java
Registered: Alice
Registered: Bob
Alice borrowed Clean Code
Error: Book not available: ISBN-001
Search 'java':
[ISBN-002] Effective Java by Joshua Bloch
Alice returned Clean Code
Removed: ISBN-001
--- Final Status ---
Books: 1
Users: 2
Alice: 0 book(s)
Bob: 0 book(s)이 마지막 챌린지는 클래스, 인터페이스, 예외 및 라이브러리 로직과 같은 모든 구성 요소가 원활하게 함께 작동하는지 검증합니다. 여러분은 완전하고 견고한 도서 관리 시스템을 구축했습니다!
직접 해보기
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];
try {
String result = library.borrowBook(userId, isbn);
System.out.println(result);
} catch (LibraryException e) {
System.out.println("Error: " + e.getMessage());
}
}
// TODO: RETURN 명령에 대한 처리를 추가합니다
// TODO: SEARCH_TITLE 명령에 대한 처리를 추가합니다
// TODO: SEARCH_AUTHOR 명령에 대한 처리를 추가합니다
}
// TODO: 최종 상태를 출력합니다
// --- 최종 상태 ---
// Books: [count]
// Users: [count]
// 각 사용자별: [name]: [borrowedCount] book(s)
System.out.println("Operations completed");
}
}
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조