[Java 개념] 상속(2)

예세림·2024년 7월 22일

Java

목록 보기
4/12
post-thumbnail

객체배열관리 포스팅에서 다뤘던 도서관리 예제를 확장하여 상속 개념을 설명하고자 한다.

코드리뷰

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:

  • toString() 메서드 수정: 부모 클래스의 toString() 호출 후 year와 month 추가 출력.
  • super 키워드를 사용해 부모 클래스의 생성자 호출 추가.

BookManager.java:

  • searchByTitle() 메서드: 도서 제목 일부 포함 검색 기능 추가.
  • getBooks() 메서드: 일반 도서 리스트 반환 기능 추가.
  • getMagazines() 메서드: 잡지 리스트 반환 기능 추가.
  • getTotalPrice() 및 getPriceAvg() 메서드: 도서 가격 총합 및 평균 계산 기능 추가.

BookTest.java:

  • Magazine 객체 생성 및 등록.
  • 각 메서드 테스트 코드 추가: 도서 제목 포함 검색, 일반 도서 리스트 출력, 잡지 리스트 출력, 도서 가격 총합 및 평균 계산.

출력 결과

보완할 점

  1. Magazine.java를 작성할 때 super();를 까먹고 있다가 나중에 작성했다.
 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;
    }
  1. 같은 원리로
@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()으로 해결돼서 다행이다.

  1. 상속과 다형성 개념에 대해 안일하게 생각했던 것 같다.
    더 정확하게 공부할 수 있도록 노력해야겠다.

0개의 댓글