Exception-도서 대출 프로그램

JK·2022년 12월 28일
0

JAVA

목록 보기
25/28
post-thumbnail
  • 도서관의 책을 대출, 반납, 책목록 확인이 가능한 프로그램 만들기
  1. interface에 대출중, 대출가능 변수와 대출, 반납 메소드 생성
  2. interfaceimplements한 class
  • private 데이터 = 책번호, 책이름, 저자, 대출인, 대출일, 대출상대
  • 책번호, 책이름, 저자를 매개변수로 한 생성자
  • interface의 대출, 반납 메소드 Override
  • toString 생성
  • 대출, 반납 등 생기는 예외 처리하기
  1. 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
종료
profile
씨앗 개발자

0개의 댓글