JAVA

java_다형성(실습예제)_22.06.10(day14)

양빵빵 2022. 6. 10. 17:55

==========

package com.kh.practice.chap01_poly.model.vo;

public class Member {

    private String name; //회원명
    private int age; //회원나이
    private char gender; //성별
    private int couponCount; //요리학원 쿠폰개수

    public Member() {
    }

    public Member(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public int getCouponCount() {
        return couponCount;
    }

    public void setCouponCount(int couponCount) {
        this.couponCount = couponCount;
    }

    @Override
    public String toString() {
        return "Member [" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                ", couponCount=" + couponCount +
                ']';
    }
}

 

 

========================

package com.kh.practice.chap01_poly.model.vo;

public class Book {

    private String title;  //도서명
    private String author; //저자명
    private String publisher; //출판사명

    public Book() {
    }

    public Book(String title, String author, String publisher) {
        this.title = title;
        this.author = author;
        this.publisher = publisher;
    }

    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;
    }

    @Override
    public String toString() {
        return "Book [" +
                "title='" + title + '\'' +
                ", author='" + author + '\'' +
                ", publisher='" + publisher + '\'' +
                ']';
    }
}

 

====================

 

package com.kh.practice.chap01_poly.model.vo;

public class AniBook extends Book {

    private int accessAge; //제한나이

    public AniBook() {
    }

    public AniBook(String title, String author, String publisher, int accessAge) {
        super(title, author, publisher);
        this.accessAge = accessAge;
    }

    @Override
    public String toString() {
        return "AniBook [" + super.toString() +
                "accessAge=" + accessAge +
                ']';
    }
}

 

================

 

package com.kh.practice.chap01_poly.model.vo;

public class CookBook extends Book {

    private boolean coupon; //요리학원 쿠폰유무

    public CookBook() {
    }

    public CookBook(String title, String author, String publisher, boolean coupon) {
        super(title, author, publisher);
        this.coupon = coupon;
    }

    public boolean isCoupon() {
        return coupon;
    }

    public void setCoupon(boolean coupon) {
        this.coupon = coupon;
    }

    @Override
    public String toString() {
        return "CookBook [" + super.toString() +
                "coupon=" + coupon +
                ']';
    }
}

 

===================

 

package com.kh.practice.chap01_poly;

import com.kh.practice.chap01_poly.controller.LibraryController;
import com.kh.practice.chap01_poly.model.vo.Book;
import com.kh.practice.chap01_poly.model.vo.Member;
import utility.Util;

public class Test {

    public static void main(String[] args) {

        LibraryController lc = new LibraryController();

        // 회원 생성 후 가입
        lc.insertMember(new Member("김철수", 15, 'M'));

        // 회원 조회
        System.out.println(lc.myInfo());

        Util.line();

        // 도서 목록 전체 조회
        for (Book book : lc.selectAll()) {
            System.out.println(book);
        }

        Util.line();

        // 도서 검색
        for (Book book : lc.searchBook("얼마나")) {
            System.out.println(book);
        }

    }
}

 

 

==============

package com.kh.practice.chap01_poly.controller;


import com.kh.practice.chap01_poly.model.vo.AniBook;
import com.kh.practice.chap01_poly.model.vo.Book;
import com.kh.practice.chap01_poly.model.vo.CookBook;
import com.kh.practice.chap01_poly.model.vo.Member;

import java.util.LinkedList;
import java.util.Queue;

public class LibraryController {

    private Member mem; // 회원정보
    private Book[] bList; // 모든 책 정보
    
    // 필요한 상수 선언
    public static final int RENT_FAIL = 1;
    public static final int RENT_SUCCESS = 0;
    public static final int RENT_SUCCESS_WITH_COUPON = 2;

    public LibraryController() {
        bList = new Book[5];

        bList[0] = new CookBook("백종원의 집밥", "백종원", "tvN", true);
        bList[1] = new AniBook("한번 더 해요", "미티", "원모어", 19);
        bList[2] = new AniBook("루피의 원피스", "루피", "japan", 12);
        bList[3] = new CookBook("이혜정의 얼마나 맛있게요", "이혜정", "문학", false);
        bList[4] = new CookBook("최현석 날 따라해봐", "최현석", "소금책", true);
    }

    // 회원 가입 기능
    public void insertMember(Member mem) {
        this.mem = mem;
    }

    // 회원정보 조회기능
    public Member myInfo() {
        return this.mem;
    }
    // 도서 전체 목록 조회 기능
    public Book[] selectAll() {
        return this.bList;
    }

    // 제목으로 도서 검색 기능
    public Book[] searchBook(String keyword) {

        // 검색된 책들을 담아둘 큐를 생성
        Queue<Book> bookQueue = new LinkedList<>();

        // 책 검색 시작
        for (Book book : bList) {
            if (book.getTitle().contains(keyword)) {
                bookQueue.add(book);
            }
        }

        Book[] searchedList = new Book[bookQueue.size()];
        for (int i = 0; i < searchedList.length; i++) {
            searchedList[i] = bookQueue.poll();
        }
        return searchedList;
    }

    // 도서 대여 기능

    /**
     *
     * @param index - 대여할 책의 인덱스번호
     * @return 단순 대여 성공 - 0
     *         만화책 나이제한 대여 실패 - 1
     *         요리책 대여성공 + 쿠폰 발급 - 2
     */
    public int rentBook(int index) {
        Book book = bList[index];

        // 책 정보 판단
        if (book instanceof AniBook) {
            AniBook aniBook = (AniBook) book;
            // 나이 검사
            if (aniBook.getAccessAge() <= mem.getAge()) {
                // 만화책을 빌릴 수 있는 경우
                return RENT_SUCCESS;
            }
        } else if (book instanceof CookBook) {
            CookBook cookBook = (CookBook) book;
            if (cookBook.isCoupon()) {
                // 쿠폰제공하는 경우
                mem.setCouponCount(mem.getCouponCount() + 1);
                return RENT_SUCCESS_WITH_COUPON;
            } else {
                return RENT_SUCCESS;
            }
        }
        return RENT_FAIL;
    }

}

 

============