고래씌

[JAVA] 10-2. 다형성 객체 배열 실습 2(Book객체) 본문

JAVA/JAVA 기초

[JAVA] 10-2. 다형성 객체 배열 실습 2(Book객체)

고래씌 2023. 10. 17. 16:49

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

public class Member {
	
	private String name;
	private int age;
	private char gender;
	private int couponCount = 0; // 요리학원 쿠폰 개수
	
	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.vo.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 title + " / "+ author + " / " + publisher ;
	}
	
}
package com.kh.practice.chap01_poly.vo.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;
	}

	public int getAccessAge() {
		return accessAge;
	}

	public void setAccessAge(int accessAge) {
		this.accessAge = accessAge;
	}

	@Override
	public String toString() {
		return super.toString() + " / " + accessAge;
	}
	
	
}
package com.kh.practice.chap01_poly.vo.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() {  // boolean만의 특징. isCoupon
		return coupon;
	}

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

	@Override
	public String toString() {
		return super.toString() + " / " + coupon;
	}
	
	
}
package com.kh.practice.chap01_poly.controller;

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

public class LibraryController {
	
	private Member mem = null;
	private Book[] 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) {
		// 전달받은 mem 주소값을 통해
		// LibraryController의 mem에 대입
		this.mem = mem;
	}
	
	public Member myInfo() {
		// 회원 레퍼런스(mem)주소값 리턴
		return mem;
	}
	
	public Book[] selectAll() {
		// Book 객체의 주소값 리턴
		return bList;
	}
	
	public Book[] searchBook(String keyword) {
		// 검색 결과를 담아줄 새로운 Book 객체 배열 생성
		// 검색 결과 도서목록이 최대 5개일 수 있으니 임의로 크기 5 생성
		
		// for문을 이용하여 bList 도서 목록들의 도서명과 전달받은 keyword비교
		// keyword.equals("a") / contains() 포함 "문자열".contains("비교문자열")
		// 문자열 내부에서 비교문자열과 비교를 했을때 비교문자열이 포함되어있다면 true / false 반환
		
		// 검색결과의 도서목록에 담기 -> HINT : count 이용
		// 해당 검색결과의 도소목록 주소 값 리턴
		
		Book[] bList = new Book [5];

		int count = 0;
		
		for(int i=0; i<bList.length; i++) {
			if(this.bList[i].getTitle().contains(keyword)) {	
				bList[count++] = this.bList[i];
			}
		}
		
		return bList;
	}
	
	public int rentBook(int index) {
		// int result = 0;
		// 전달 받은 index의 bList 객체가 만화책을 참조하고 있고
		// 해당 만화책의 제한 나이와 회원의 나이를 비교하여 회원 나이가 적을 경우
		// result를 1로 초기화 → 나이제한으로 대여 불가
		
		// 전달 받은 index의 bList 객체가 요리책을 참조하고 있고
		// 해당 요리책의 쿠폰유무가 “유”일 경우
		// 회원의 couponCount 1 증가 처리 후
		// result를 2로 초기화 → 성공적으로 대여 완료, 요리학원 쿠폰 발급
		// result 값 리턴
		
		int result = 0;
		
		if(bList[index] instanceof AniBook) {
			if(((AniBook)bList[index]).getAccessAge() > mem.getAge()) {
				result = 1;
			}
		}else {
			if(((CookBook)bList[index]).isCoupon()) {
				mem.setCouponCount(mem.getCouponCount()+1);
				result = 2;
			}
		}
		return result;
	}
}
package com.kh.practice.chap01_poly.view;

import java.util.Scanner;

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

public class LibraryMenu {

	private LibraryController lc = new LibraryController();
	private Scanner sc = new Scanner(System.in);
	
	public void mainMenu() {
	
		System.out.print("이름 : ");
		String name = sc.nextLine();
		
		System.out.print("나이 : ");
		int age = sc.nextInt();
		
		sc.nextLine();
		
		System.out.println("성별 : ");
		char gender = sc.nextLine().charAt(0);
		lc.insertMember(new Member(name, age, gender));
		
		while(true) {
			System.out.println("==== 메뉴 ====");
			System.out.println("1. 마이페이지");
			System.out.println("2. 도서 전체 조회");
			System.out.println("3. 도서 검색");
			System.out.println("4. 도서 대여하기");
			System.out.println("9. 프로그램 종료하기");
			System.out.print("메뉴 번호 : ");
			int menu = sc.nextInt();
			
			switch(menu) {
			case 1 : System.out.println(lc.myInfo()); break;
			case 2 : selectAll(); break;
			case 3 : searchBook(); break;
			case 4 : rentBook(); break;
			case 9 : System.out.println("프로그램을 종료합니다."); return;
			default: System.out.println("잘못 입력하셨습니다.");
			}
			
		}
	}
	
	public void selectAll() {
		Book [] bList = lc.selectAll();
		for(int i=0; i<bList.length; i++) {
			System.out.println(i+"번도서 : " + bList[i]);
			// 출력문을 재정의했기 때문에 원하는 값이 출력됨. 뒤에 toString()을 안써도!
		}
	}	
	
	public void searchBook() {
		// “검색할 제목 키워드 : “ >> 입력 받음 (keyword)
		// LibraryController의 searchBook() 에 전달
		// 그 결과 값을 Book[] 자료형 searchList에 담아 검색 결과인 도서 목록 출력
		
		sc.nextLine();
		System.out.print("검색할 제목 키워드 : ");
		String keyword = sc.nextLine();
		
		Book [] searchList = lc.searchBook(keyword);

		Book [] bList = lc.selectAll();
		for(int i=0; i<searchList.length; i++) {
			if(searchList[i] != null) {
				System.out.println(searchList[i]);
			}
		}
	}
	
	public void rentBook() {
		// 도서대여를 위해 도서번호를 알아야 하기 때문에 selectAll() 메소드 호출
		// “대여할 도서 번호 선택 : ” >> 입력 받음 (index)
		// LibraryController의 rentBook() 에 전달
		// 그 결과 값을 result로 받고 그 result가
		// 0일 경우 → “성공적으로 대여되었습니다.” 출력
		// 1일 경우 → “나이 제한으로 대여 불가능입니다.” 출력
		// 2일 경우 → “성공적으로 대여되었습니다. 요리학원 쿠폰이 발급되었으니
		// 마이페이지에서 확인하세요” 출력
		selectAll();
		System.out.print("대여할 도서 번호 선택 : ");
		int num = sc.nextInt();
		
		
		int result = lc.rentBook(num);
		switch(result) {
		case 0: System.out.println("성공적으로 대여되었습니다."); break;
		case 1: System.out.println("나이 제한으로 대여 불가능입니다."); break;
		case 2: System.out.println("성공적으로 대여되었습니다. 요리학원 쿠폰이 발급되었으니 "
				+ "마이페이지에서 확인하세요");
		}
		

	}
	
	
}
package com.kh.practice.chap01_poly.run;

import com.kh.practice.chap01_poly.view.LibraryMenu;

public class Run {

	public static void main(String[] args) {

		new LibraryMenu().mainMenu();
	}

}