객체배열관리 포스팅에서 다뤘던 도서관리 예제를 확장하여 상속 개념을 설명하고자 한다.
Magazine.java를 추가했고,
BookManager 클래스에 searchByTitle, getMagazines, getBooks, getTotalPrice, getPriceAvg를 추가했다.
Magazine.java
public class Magazine extends Book {
private int year;
private int month;
public Magazine() {}
public Magazine(String isbn, String title, String author, String publisher, int 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;
}
@Override
public String toString() {
return super.toString() + "\t| " + year + "\t| " + month; //여기도 super!!
}
}
BookManager.java
public class BookManager {
private static final int MAX_SIZE = 100;
private Book[] books = new Book[MAX_SIZE];
private int size = 0;
public void add(Book book) {
if (size < MAX_SIZE) {
books[size++] = book;
}
}
public void remove(String isbn) {
for (int i = 0; i < size; i++) {
if (books[i].getIsbn().equals(isbn)) {
books[i] = books[--size];
books[size] = null;
return;
}
}
}
public Book[] getList() {
Book[] list = new Book[size];
for (int i = 0; i < size; i++) {
list[i] = books[i];
}
return list;
}
public Book searchByIsbn(String isbn) {
for (int i = 0; i < size; i++) {
if (books[i].getIsbn().equals(isbn)) {
return books[i];
}
}
return null;
}
public Book[] searchByTitle(String title) {
Book[] result = new Book[size];
int count = 0;
for (int i = 0; i < size; i++) {
if (books[i].getTitle().contains(title)) {
result[count++] = books[i];
}
}
Book[] finalResult = new Book[count];
System.arraycopy(result, 0, finalResult, 0, count);
return finalResult;
}
public Book[] getBooks() {
Book[] result = new Book[size];
int count = 0;
for (int i = 0; i < size; i++) {
if (!(books[i] instanceof Magazine)) {
result[count++] = books[i];
}
}
Book[] finalResult = new Book[count];
System.arraycopy(result, 0, finalResult, 0, count);
return finalResult;
}
public Magazine[] getMagazines() {
Magazine[] result = new Magazine[size];
int count = 0;
for (int i = 0; i < size; i++) {
if (books[i] instanceof Magazine) {
result[count++] = (Magazine) books[i];
}
}
Magazine[] finalResult = new Magazine[count];
System.arraycopy(result, 0, finalResult, 0, count);
return finalResult;
}
public int getTotalPrice() {
int total = 0;
for (int i = 0; i < size; i++) {
total += books[i].getPrice();
}
return total;
}
public double getPriceAvg() {
if (size == 0) return 0;
return (double) getTotalPrice() / size;
}
}
BookTest.java
public class BookTest {
public static void main(String[] args) {
BookManager manager = new BookManager();
// 도서 객체 생성
Book book1 = new Book("21424", "Java Pro", "김하나", "jaen.kr", 15000, "Java 기본 문법");
Book book2 = new Book("21425", "Java Pro2", "김하나", "jaen.kr", 25000, "Java 응용");
Book book3 = new Book("35355", "분석설계", "소나무", "jaen.kr", 30000, "SW 모델링");
Magazine mag1 = new Magazine("45678", "Java World", "편집부", "jaen.kr", 10000, "1월호", 2021, 1);
// 도서 정보 등록
manager.add(book1);
manager.add(book2);
manager.add(book3);
manager.add(mag1);
// 도서 리스트 출력(도서 전체 목록)
System.out.println("******************************** 도서 목록 ********************************");
for (Book book : manager.getList()) {
System.out.println(book);
}
// 도서 정보 삭제
manager.remove("21424");
// 도서 리스트 출력
System.out.println("******************************** 도서 목록 ********************************");
for (Book book : manager.getList()) {
System.out.println(book);
}
// 도서 정보 조회
System.out.println("******************************** 도서 조회: 21425 ********************************");
System.out.println(manager.searchByIsbn("21425"));
// 도서 제목 포함 검색
System.out.println("******************************** 도서 제목 포함 검색: Java ********************************");
for (Book book : manager.searchByTitle("Java")) {
System.out.println(book);
}
// 일반 도서 리스트 출력
System.out.println("******************************** 일반 도서 목록 ********************************");
for (Book book : manager.getBooks()) {
System.out.println(book);
}
// 잡지 리스트 출력
System.out.println("******************************** 잡지 목록 ********************************");
for (Magazine magazine : manager.getMagazines()) {
System.out.println(magazine);
}
// 도서 가격 총합
System.out.println("도서 가격 총합: " + manager.getTotalPrice());
// 도서 가격 평균
System.out.println("도서 가격 평균: " + manager.getPriceAvg());
}
}
Magazine.java:
BookManager.java:
BookTest.java:

public Magazine(String isbn, String title, String author, String publisher, int price, String desc, int year, int month) {
super(isbn, title, author, publisher, price, desc);
this.year = year;
this.month = month;
}
@Override
public String toString() {
return super.toString() + "\t| " + year + "\t| " + month;
}
}
super.toString()으로 해결될 것을
기존의 객체배열관리 포스팅의 Book.java에 있던 toString()에서 수정해서 사용하려고 했다.
@Override
public String toString(){
return isbn + "\t| " + title + "\t| " + author + "\t| " + publisher + "\t| " + price + "\t| " + desc;
}
여기에 year, month 추가하니 너무 지저분했는데 super.toString()으로 해결돼서 다행이다.