관리자 인터페이스
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 81번째.
챌린지
쉬움Library Management System을 Admin Interface로 확장해 봅시다! 실제 도서관에는 새로운 도서를 컬렉션에 추가하고, 오래된 도서를 제거하며, 새로운 회원을 등록하는 등의 관리 기능이 필요합니다. 이러한 관리 작업을 정의하는 인터페이스를 만들고, 전용 관리자 class에서 이를 구현하게 됩니다.
기존 코드를 다음 다섯 개 파일에서 계속 확장합니다:
Book.java: isbn, title, author, isAvailable, borrowedBy, getDetails() 및 적절한 getter/setter를 포함한 기존 Book class를 그대로 유지합니다.User.java: id, name, borrowedBooks ArrayList, borrowBook(), returnBook(), getBorrowedCount() 및 toString()을 포함한 User class를 변경하지 않고 그대로 유지합니다.Library.java: 기존의 모든 메서드를 포함한 Library class를 그대로 유지합니다. 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이라는 class를 만듭니다. AdminService는 Library에 대한 참조를 보유해야 하며(생성자를 통해 전달됨), 적절한 피드백을 추가하면서 Library에 위임하여 세 메서드를 모두 구현해야 합니다. 도서를 추가할 때는 새로운 Book을 생성하여 Library에 추가합니다. 사용자를 등록할 때는 새로운 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의 대출 기능을 사용
모든 명령을 처리한 후
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 - BorrowedAdmin 인터페이스가 관리 작업에 대한 깔끔한 계약을 제공하는 동안 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);
}
}
// Print library status
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 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러