Hayden's Archive

[자바/Java] 도서관 사서 프로그램 작성하기 본문

Study/Java & Kotlin

[자바/Java] 도서관 사서 프로그램 작성하기

_hayden 2020. 4. 15. 22:32

- VO Class : Book, Magazine // Magazine은 Book으로부터 상속받는다

- Service Class : BookManager // BookManager는 Book과 Magazine을 관리한다. 그리고 여기에 Javadoc를 작성한다.

- Test Class : BookTest // 모든 출력은 BookTest에서 한다. BookManager의 요청을 처리할 수 있는 메뉴를 만들어본다.

- 위의 내용을 만족할 수 있는 Class Diagram을 작성하고 구현해본다.

package com.encore.book;

public class Book {
	private String isbn;
	private String title;
	private String author;
	private String publisher;
	private double price;
	private String desc; // description. 간단한 설명
	
	public Book() {};
	
	public Book(String isbn, String title, String author, String publisher, double price, String desc) {
		super();
		this.isbn = isbn;
		this.title = title;
		this.author = author;
		this.publisher = publisher;
		this.price = price;
		this.desc = desc;
	}
	
	public String getIsbn() {
		return isbn;
	}

	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getPublisher() {
		return publisher;
	}

	public void setPublisher(String publisher) {
		this.publisher = publisher;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public String getDesc() {
		return desc;
	}

	public void setDesc(String desc) {
		this.desc = desc;
	}

	public String toString() {
		return isbn +", "+title+", "+author+", "+publisher+", "+price+", "+desc;
	}
	
}
package com.encore.magazine;

import com.encore.book.Book;

public class Magazine extends Book {
	private int year;
	private int month;
	
	public Magazine(String isbn, String title, String author, String publisher, double price, String desc, int year, int month) {
		super(isbn, title, author, publisher, price, desc);
		this.year = year;
		this.month = month;
	}
	
	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public int getMonth() {
		return month;
	}

	public void setMonth(int month) {
		this.month = month;
	}

	public String toString() {
		return super.toString() + ", "+ year + ", "+ month; 
	}
}
package com.encore.bookmanager;

import com.encore.book.Book;
/**
 * 
 * @author Hayden Jones
 * @since JDK 1.8.5
 * @version Start Version level 1.
 *
 */
public class BookManager {
	Book[] bList;
	int numberOfBooks;
	
	public BookManager(int numberOfBooks) {
		bList = new Book[numberOfBooks];
	}

	/**
	 * 
	 * @return 책 목록 배열로 도서관 소장책 권수를 반환함
	 */
	public int getNumberOfBooks() {
		return numberOfBooks;
	}
	
	/**
	 * 새로운 도서를 배열 bList에 추가하고 책 권수를 1권 늘림
	 * 추가하려는 도서의 ISBN이 이미 보유하고 있는 도서의 ISBN과 같다면 추가하지 않음
	 * @param newBook 새로 추가할 Book 타입 책 객체
	 */
	public void insertBook(Book newBook) {
		for(int i = 0; i < bList.length; i++) {
			if(bList[i] == null) {
					bList[i] = newBook;
					numberOfBooks++;
					break;
			}
		}
	}
	
	/**
	 * 배열 bList에 있는 요소 b가 null이라면 지나침
	 * @return 모든 책 객체를 요소로 가지는 배열 temp를 반환함
	 */
	public Book[] getAllBook() {
		Book[] temp = new Book[numberOfBooks];
		int i = 0;
		for(Book b : bList) {
			if(b == null) {
				continue;
			}
			else if(b.equals(bList[i])) {
				temp[i] = b;
			}
			i++;
		}
		return temp;
	}
	
	/**
	 * 
	 * @param isbn ISBN을 입력함
	 * @return 해당하는 ISBN의 책 객체를 반환함
	 */
	public Book searchBook(String isbn) {
		Book temp = null;
		for(Book b : bList) {
			if(b != null) {
				if(b.getIsbn().equals(isbn)) {
					temp = b;
				}
			}
		}
		return temp;
	}
	
	/**
	 * 
	 * @param title 책 제목을 입력함
	 * @return 해당하는 제목의 책 객체들의 배열을 반환함
	 */
	public Book[] searchBookByTitle(String title) {
		int count = 0;
		int i = 0;
		Book[] temp1 = new Book[numberOfBooks]; // 임시로 담을 배열 생성
		for(Book b : bList) {
			if(b != null) {
				if(b.getTitle().equals(title)) {
					temp1[i++] = b;
					count++; 
				}
			}
		}
		Book[] temp2 = new Book[count]; // 반환할 배열을 따로 만듦
		for(int j = 0; j < count; j++) {
			if(temp1[j] != null) {
				temp2[j] = temp1[j]; 
			}
		}
		return temp2;
	}  
		
	
	/**
	 * 
	 * @param publisher 출판사를 입력함
	 * @return 해당하는 출판사의 책 객체들의 배열을 반환함
	 */
	public Book[] searchBookByPublisher(String publisher) {
		int count = 0;
		int i = 0;
		Book[] temp1 = new Book[numberOfBooks];
		for(Book b : bList) {
			if(b != null) {
				if(b.getPublisher().equals(publisher)) {
					temp1[i++] = b;
					count++;
				}
			}
		}
		Book[] temp2 = new Book[count];
		for(int j = 0; j < count; j++) {
			if(temp1[j] != null) {
				temp2[j] = temp1[j];
			}
		}
		return temp2;
	}
	
	/**
	 * 타입을 double로 달리하여 Method Overloading 기법을 씀.
	 * @param price 책 가격을 입력함
	 * @return 해당하는 가격의 책 객체들의 배열을 반환함
	 */
	public Book[] searchBook(double price) {
		int count = 0;
		int i = 0;
		Book[] temp1 = new Book[numberOfBooks];
		for(Book b : bList) {
			if(b != null) {
				if(b.getPrice() == price) {
					temp1[i++] = b;
					count++;
				}
			}
		}
		Book[] temp2 = new Book[count];
		for(int j = 0; j < count; j++) {
			temp2[j] = temp1[j];
		}
		return temp2;
	}
	
    /**
     * 
     * @return 모든 책의 가격을 합한 total을 반환함
     */
	public double getSumPriceOfBooks() {
		int total = 0;
		for(Book b : bList) {
			if(b != null) total += b.getPrice();
		}
		return total;
	}
	
	/**
	 * 
	 * @return 모든 책의 가격을 합하고 개수만큼 나눠서 평균을 반환함
	 */
	public double getAveragePriceOfBooks() {
		return getSumPriceOfBooks() / numberOfBooks;
	}
}
package test;

import java.util.Scanner;

import com.encore.book.Book;
import com.encore.bookmanager.BookManager;
import com.encore.magazine.Magazine;

public class BookTest {

	public static void main(String[] args) {// 소장책 DB
		
		Book a = new Book("9788954620512", "데미안", "헤르만 헤세", "민음사", 8500.0, "불안한 젊음에 바치는 영혼의 자서전");
		Book b = new Book("9788954620512", "데미안", "헤르만 헤세", "민음사", 8500.0, "불안한 젊음에 바치는 영혼의 자서전");
		Book c = new Magazine("9788954620260", "어린이 과학동아", "편집부", "동아사이언스", 8500.0, "초등학생을 위해 한달에 두 번 발행하는 과학만화 잡지", 2020, 3);
		Book d = new Book("9771975252008", "시간 가게", "이나영", "문학동네", 9900.0, "제 13회 문학동네 어린이 문학상 수상작");
		Book e = new Magazine("9771228402006", "씨네21", "편집부", "씨네21", 3800.0, "대한민국의 영화 전문 잡지", 2020, 4);
		
		Book[] bs  = {a,b,c,d,e,};
		
		printBooks(bs);
	}
	
	
	public static void printBooks(Book[] bs) {// 출력 메소드
		
		BookManager service = new BookManager(100); // 도서 최대 보유권수는 100권으로 지정
		
		// 메인 메소드의 배열에서 받아온 소장책 객체들을 service에 있는 배열에 추가함
		for(int i = 0; i < bs.length; i++) {
			service.insertBook(bs[i]);
		}
		
		boolean menu = true; // 메뉴 스위치
		while(menu == true) { // 메뉴 스위치가 켜져있는 동안 무한반복
			System.out.println("===============================");
			System.out.println("S 전자 오픈 도서관 관리 페이지입니다.");
			System.out.println("1. 도서관 전체 소장책 조회");
			System.out.println("2. 도서관 소장책 추가");
			System.out.println("3. 책 찾기");
			System.out.println("4. 전체책 가격 합계 및 평균 조회");
			System.out.println("===============================");
			
			Scanner sc = new Scanner(System.in);
			int choice = sc.nextInt(); // 메뉴 번호 입력

			// 1. 도서관 전체 소장책 조회
			if(choice == 1) {
				System.out.println("전체 소장책 총 "+service.getNumberOfBooks()+"권");
				for(Book b : service.getAllBook()) {
					System.out.println(b);
				}
			}
			
			// 2. 도서관 소장책 추가
			else if(choice == 2) {
				// service.insertBook(new Book("9788937460586", "싯다르타", "헤르만 헤세", "민음사", 6300.0, "헤세가 소설로 형상화한 부처의 생애"));
				// service.insertBook(new Magazine("9771227130009", "뉴턴", "편집부", "아이뉴턴", 12000.0, "한중일에서 동시에 발행되고 있는 세계적인 과학 전문지", 2019, 11));
				System.out.println("ISBN을 입력하세요."); 
				String isbn = sc.next(); 
				System.out.println("책 제목을 입력하세요."); sc.nextLine();
				String title = sc.nextLine();
				System.out.println("작가를 입력하세요.");
				String author = sc.nextLine();
				System.out.println("출판사를 입력하세요.");
				String publisher = sc.nextLine();
				System.out.println("가격을 입력하세요.");
				Double price = sc.nextDouble(); sc.nextLine();
				System.out.println("간단한 설명을 입력하세요.");
				String desc = sc.nextLine();
				System.out.println("일반도서이면 true, 잡지이면 false를 입력하세요."); 
				Boolean bkOrMaga = sc.nextBoolean();
				if(bkOrMaga.equals(true)) {
					service.insertBook(new Book(isbn, title, author, publisher, price, desc));
				}
				else if(bkOrMaga.equals(false)) {
					System.out.println("출간연도를 입력하세요.");
					int year = sc.nextInt();
					System.out.println("출간월을 입력하세요.");
					int month = sc.nextInt();
					service.insertBook(new Magazine(isbn, title, author, publisher, price, desc, year, month));
				}
				System.out.println("소장책이 추가되었습니다.");
			}
			
			// 3. 책 찾기
			else if(choice == 3) {
				System.out.println("===============================");
				System.out.println("어떤 방법으로 책을 찾겠습니까?");
				System.out.println("1. ISBN으로 책 찾기");
				System.out.println("2. 책 제목으로 책 찾기");
				System.out.println("3. 출판사로 책 찾기");
				System.out.println("4. 가격으로 책 찾기");
				System.out.println("5. 이전으로");
				System.out.println("===============================");
				sc.nextLine();
				int search = sc.nextInt(); 
				if(search == 1) {
					System.out.println("ISBN을 입력하세요.");
					String isbn = sc.next(); sc.nextLine();
					if(service.searchBook(isbn) == null) System.out.println("일치하는 책이 없습니다.");
					else System.out.println(service.searchBook(isbn));
				}
				else if(search == 2) {
					System.out.println("책 제목을 입력하세요.");  sc.nextLine();
					String title = sc.nextLine(); 
					int count = 0;
					for(Book b : service.searchBookByTitle(title)) {
						if(b != null) System.out.println(b); 
						else count++;
					}
					if(count == service.searchBookByTitle(title).length) {
						System.out.println("일치하는 책이 없습니다.");
					}
				}
				else if(search == 3) {
					System.out.println("출판사를 입력하세요.");
					String publisher = sc.next();
					int count = 0;
					for(Book b : service.searchBookByPublisher(publisher)) {
						if(b != null) System.out.println(b);
						else count++;
					}
					if(count == service.searchBookByPublisher(publisher).length) {
						System.out.println("일치하는 책이 없습니다.");
					}
					
				}
				else if(search == 4) {
					System.out.println("가격을 입력하세요.");
					double price = sc.nextDouble(); sc.nextLine();
					int count = 0;
					for(Book b : service.searchBook((double)price)) {
						if(b != null) System.out.println(b);
						else count++;
					}
					if(count == service.searchBook((double)price).length) {
						System.out.println("일치하는 책이 없습니다.");
					}
				}
				else if(search == 5) menu = true;
				else System.out.println("잘못 입력하셨습니다.");
			}
			
			// 4. 전체책 가격 합계 및 평균 조회
			else if(choice == 4) {
				System.out.println("전체책 가격 합계 : " + service.getSumPriceOfBooks());
				System.out.println("전체책 가격 평균 : " + service.getAveragePriceOfBooks());
			}
			
			// 잘못 입력했을 경우
			
			else {
				System.out.println("잘못 입력하셨습니다.");
			}
		}
	}
}