관리자 인터페이스
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 81번째.
챌린지
쉬움관리자 인터페이스를 추가하여 도서 관리 시스템을 확장해 봅시다! 실제 도서관에는 컬렉션에 새 도서를 추가하고, 오래된 도서를 제거하며, 새 회원을 등록하는 등의 관리 기능이 필요합니다. 이러한 관리 작업을 정의하는 인터페이스를 만들고 이를 전용 관리 클래스에서 구현하게 됩니다.
다음 다섯 개의 파일에 걸쳐 기존 코드를 계속해서 빌드하게 됩니다:
Book.java: isbn, title, author, isAvailable, borrowedBy, getDetails() 및 적절한 getter/setter를 포함한 모든 기존 기능을 가진 Book 클래스를 유지합니다.User.java: id, name, borrowedBooks ArrayList, borrowBook(), returnBook(), getBorrowedCount() 및 toString()을 포함한 User 클래스를 변경 없이 유지합니다.Library.java: 모든 기존 메서드를 포함한 Library 클래스를 유지합니다. ISBN으로 컬렉션에서 도서를 찾아 제거하는 새로운 메서드removeBook(String isbn)을 추가합니다. 도서를 찾아 제거한 경우true를 반환하고, 그렇지 않으면false를 반환해야 합니다. 도서는 현재 대출 가능 상태(대출 중이 아님)인 경우에만 제거할 수 있습니다.LibraryAdmin.java: 관리 작업에 대한 계약을 정의하는LibraryAdmin이라는 인터페이스를 생성합니다. 인터페이스는 다음 세 가지 메서드를 선언해야 합니다:addBook(String isbn, String title, String author)- 성공 여부를 나타내는 boolean 반환removeBook(String isbn)- 성공 여부를 나타내는 boolean 반환registerUser(String id, String name)- 성공 여부를 나타내는 boolean 반환
그런 다음 이 인터페이스를 구현하는
AdminService라는 클래스를 생성합니다. AdminService는 Library에 대한 참조를 보유해야 하며(생성자를 통해 전달됨), 적절한 피드백을 추가하면서 Library에 위임하여 세 가지 메서드를 모두 구현해야 합니다. 도서를 추가할 때는 새 Book을 생성하여 도서관에 추가합니다. 사용자를 등록할 때는 새 User를 생성하여 등록합니다.Main.java: 관리 시스템을 시연합니다! 쉼표로 구분된 단일 문자열로 일련의 관리 명령을 받게 됩니다. 각 명령은 다음 형식 중 하나를 따릅니다:ADD_BOOK:isbn:title:authorREMOVE_BOOK:isbnREGISTER_USER:id:nameBORROW:userId:isbn
Library와 AdminService를 생성합니다. 각 명령을 처리하고 결과를 출력합니다:
- ADD_BOOK의 경우: 성공 시
Added: [title]출력 - REMOVE_BOOK의 경우: 성공 시
Removed: [isbn]출력, 도서가 존재하지 않거나 대출 중인 경우Cannot remove: [isbn]출력 - REGISTER_USER의 경우:
Registered: [name]출력 - BORROW의 경우: 기존 도서관 대출 기능을 사용
모든 명령을 처리한 후,
Library status:를 출력하고 이어서 각 도서의 상세 정보와 대출 가능 상태를[details] - [Available/Borrowed]형식으로 출력합니다.
하나의 입력을 받습니다: 쉼표로 구분된 명령 문자열입니다.
예를 들어, 입력이 REGISTER_USER:U001:Alice,ADD_BOOK:ISBN-001:Clean Code:Robert Martin,ADD_BOOK:ISBN-002:Design Patterns:Gang of Four,BORROW:U001:ISBN-001,REMOVE_BOOK:ISBN-001,REMOVE_BOOK:ISBN-002인 경우, 출력은 다음과 같습니다:
Registered: Alice
Added: Clean Code
Added: Design Patterns
Alice borrowed Clean Code
Cannot remove: ISBN-001
Removed: ISBN-002
Library status:
[ISBN-001] Clean Code by Robert Martin - Borrowed관리 인터페이스가 관리 작업을 위한 깔끔한 계약을 제공하는 반면, AdminService 구현이 실제 로직을 처리하는 방식에 주목하세요. 시스템은 대출 중인 도서의 제거를 올바르게 방지하면서 대출 가능한 도서의 제거는 허용합니다. 이러한 인터페이스와 구현의 분리는 코드를 더 유지 관리하기 쉽고 테스트 가능하게 만드는 핵심 OOP 원칙입니다!
직접 해보기
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];
library.borrowBook(userId, isbn);
}
}
// 도서관 상태를 출력합니다
System.out.println("Library status:");
ArrayList<Book> allBooks = library.getAllBooks();
for (Book book : allBooks) {
String status = book.isAvailable() ? "Available" : "Borrowed";
System.out.println(book.getDetails() + " - " + status);
}
}
}
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조