- 도서관의 책을 대출, 반납, 책목록 확인이 가능한 프로그램 만들기
interface
에 대출중, 대출가능 변수와 대출, 반납 메소드 생성
interface
를 implements
한 class
- private 데이터 = 책번호, 책이름, 저자, 대출인, 대출일, 대출상대
- 책번호, 책이름, 저자를 매개변수로 한 생성자
interface
의 대출, 반납 메소드 Override
- toString 생성
- 대출, 반납 등 생기는 예외 처리하기
- Main class
- 배열에 책 데이터 입력
- 사용자에게 원하는 기능 입력받기
1. ILendable(interface)
package com.lec.ex5_booklib;
public interface ILendable {
public byte STATE_BOOROWED = 1; //대출중
public byte STATE_NORMAL = 0; //대출가능
public void checkOut(String borrower); //대출
public void checkIn() throws Exception; // 반납
}
2. Book
package com.lec.ex5_booklib;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Book implements ILendable {
private String bookNo; // 책번호
private String bookTitle; // 책이름
private String writer; // 저자
private String borrower; // 대출인
private Date checkOutDate;
private byte state; // 대충 상태 : 대출중(1), 대출가능(0)
public Book(String bookNo, String bookTitle, String writer) {
this.bookNo = bookNo;
this.bookTitle = bookTitle;
this.writer = writer;
}
@Override
public void checkOut(String borrower) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일(E) HH시 mm분");
if (state == STATE_BOOROWED) { // 대출중이면 메세지 뿌리고 끝
System.out.println(bookTitle + "은 대출중입니다");
return; // void 이기에 return 뒤에 값 입력 불가
}
// state가 0(STATE_NORMAL)이라서 대출 진행
this.borrower = borrower;
checkOutDate = new Date();
state = STATE_BOOROWED; // 대출중 상태로 전환
System.out.println(bookTitle + "도서가 대출 처리 되었습니다");
System.out.println("대출인 : " + borrower + "\t대출일 : " + sdf.format(checkOutDate));
}
@Override
public void checkIn() throws Exception {
if (state == STATE_NORMAL) {
throw new Exception("반납 완료된 책입니다");
}
Date now = new Date();
// checkOutDate와 현재시점간의 날짜 계산
long chk = now.getTime() - checkOutDate.getTime();
long day = chk/(1000*60*60*24); // 빌린날
// 연체료 부과 -> 연체료 받았는지 여부에 따라 반납 처리 진행
if (day > 14) {
long i = (day) * 100; //연체료
System.out.printf("%d일 연체되어 연체금은 %d원입니다. 연체료를 받으셨습니까(Y/N)? ", day, i);
Scanner scanner = new Scanner(System.in);
if(!scanner.next().trim().toUpperCase().equalsIgnoreCase("Y")) {
System.out.println(bookTitle + "연체료를 내야 반납 처리가 됩니다");
return;
}
}
// state가 대출중(1)이라 반납 처리
borrower = null;
checkOutDate = null;
state = STATE_NORMAL;
System.out.println(bookTitle + "도서가 반납 완료되었습니다");
}
@Override
public String toString() {
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일(E) HH시 mm분");
String msg = bookNo + "\t" + bookTitle + "\t" + "(" + writer + "著)-";
msg += state == STATE_NORMAL ? "대출가능 " : "대출 중 "+ sdf.format(checkOutDate);
return msg;
}
public String getBookTitle() {
return bookTitle;
}
public byte getState() {
return state;
}
public void setCheckOutDate(Date checkOutDate) {
this.checkOutDate = checkOutDate;
}
}
3. Main
package com.lec.ex5_booklib;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;
public class BookMain {
public static void main(String[] args) {
Book[] books = { new Book("890ㅁ-01-11", "java", "홍길동"),
new Book("890ㅁ-01-12", "oracle", "오길동"),
new Book("890ㅁ-02-01", "mysql", "마길동"),
new Book("890ㅁ-01-01", "jdbc", "제이디"),
new Book("890ㅁ-01-01", "html", "이에이") };
Scanner scanner = new Scanner(System.in);
String fn; // 기능번호 (1:대출/2:반납/3:책list/0:종료)
int idx; // 대출하거나 반납 시 조회된 책의 index
String bTitle, borrower; // 사용자에게 받을 책 이름, 대출인
do {
System.out.print("1:대출/ 2:반납/ 3:책list/ 0:종료");
fn = scanner.next();
switch (fn) {
case "1": // 대출 : 1.책이름입력 2.책조회 3.책상태확인 4.대출인입력 5.대출메소드 호출
// 1.책이름입력
System.out.print("대출하고자 하는 책 이름은?");
scanner.nextLine();
bTitle = scanner.nextLine().trim();
// 2.책조회
for (idx = 0; idx < books.length; idx++) {
if (bTitle.equals(books[idx].getBookTitle())) {
break;
}
} // for
// idx번째 책으로 진행
if (idx == books.length) {
System.out.println("현재 보유하지 않은 도서입니다");
} else { // books[idx] 도서를 대출
// 3.책상태확인
if (books[idx].getState() == Book.STATE_BOOROWED) {
System.out.println("현재 대출 중인 도서입니다");
} else {
// 4.대출인입력
System.out.println("대출인은 ?");
borrower = scanner.next();
// 6.대출메소드 호출
books[idx].checkOut(borrower);
} // if 상태확인
} // if 도서조회
break;
case "2": // 반납 : 1.책이름입력 2.책조회 3.반납메소드 호출
System.out.print("반납하고자 하는 책 이름은?");
bTitle = scanner.next(); // white-space 앞까지의 스트링만 받음
// 2.책조회
for (idx = 0; idx < books.length; idx++) {
if (bTitle.equals(books[idx].getBookTitle())) {
break;
}
}
if (idx == books.length) {
System.out.println("해당 도서는 본 도서관의 책이 아닙니다");
} else {
// 3.반납 메소드 호출
try {
books[idx].checkIn();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
break;
case "3": // 책list 출력
for (Book book : books) {
System.out.println(book);
}
}// switch
} while (!fn.equalsIgnoreCase("0"));
System.out.println("종료");
}
}
결과
1:대출/ 2:반납/ 3:책list/ 0:종료 3
890ㅁ-01-11 java (홍길동著)-대출가능
890ㅁ-01-12 oracle (오길동著)-대출가능
890ㅁ-02-01 mysql (마길동著)-대출가능
890ㅁ-01-01 jdbc (제이디著)-대출가능
890ㅁ-01-01 html (이에이著)-대출가능
1:대출/ 2:반납/ 3:책list/ 0:종료 1
대출하고자 하는 책 이름은?java
대출인은 ?
팽수
java도서가 대출 처리 되었습니다
대출인 : 팽수 대출일 : 2022년 12월 28일(수) 22시 13분
1:대출/ 2:반납/ 3:책list/ 0:종료 2
반납하고자 하는 책 이름은?java
java도서가 반납 완료되었습니다
1:대출/ 2:반납/ 3:책list/ 0:종료 0
종료