프로그래밍 언어 활용/JAVA

다형성 실습 문제

프린이8549 2024. 1. 25. 17:55

1. Member 클래스 구현

package Test240125;

public class Member {
	private String name;
	private int age;
	private char gender;
	private int couponCount; // 쿠폰을 0개로 초기화하라는 명시 => 생성자 통해서 초기화 진행
	// 웬만한 초기화는 필드의 멤버 변수를 직접적으로 초기화하는 것이 아니라
    // 생성자가 초기화 역할을 담당하는만큼, 생성자를 통해 초기화하는 것이 바람직하다
	
	public Member() {
		super();
	}

	public Member(String name, int age, char gender) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.couponCount = 0; // 지시에 따라 초기화
	}
	
	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 + "]";
	}
}

 

2. Book클래스 구현

package Test240125;

public class Book {
	private String title;
	private String author;
	private String publisher;
	
	
	public Book() {
		super();
	}

	public Book(String title, String author, String publisher) {
		super();
		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 + "]";
	}
}

 

3.  CookBook 클래스 구현

package Test240125;

public class Book {
	private String title;
	private String author;
	private String publisher;
	
	public Book() {
		super();
	}

	public Book(String title, String author, String publisher) {
		super();
		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 + "]";
	}
	
}

 

4. AniBook 클래스 구현

package Test240125;

public class AniBook extends Book { // 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 "AniBook [" + super.toString() + ", accessAge = " + accessAge + "]";
	}
	
	
}

 

5. LibraryController 클래스 구현

package com.kh.Test240125;

public class LibraryController {
	private Member mem;
	private Book[] bList;
	
	public LibraryController(){ 
    // 클래스 영역에서는 if문 등의 코드를 쓸 수 없음
    // 정의하는 공간이지 코드를 구현하는 공간이 아니기 때문
    // 따라서 생성자 통해 초기화함
		this.mem = null;
		this.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) {
			Book[] myList = new Book[5];
			int index = 0;
			for(int i = 0 ; i < bList.length ; i++) { // bList[i] 는 인덱스i의 배열의 길이 즉, 2차원 배열에 해당
				if(bList[i].getTitle().contains(keyword)) {
                // contains() 메서드 사용
					myList[index++] = bList[i];
				}
			}
		return myList;
	}
	
	public int rentBook(int index) {
		int result = 0;
		
		if (bList[index] instanceof AniBook) {
			AniBook aniBook = ((AniBook)bList[index]);
            // Book 자료형인 bList를 자식 클래스인 AniBook 자료형으로 downCasting 실시
            // 다운캐스팅을 해줘야 AniBook 클래스의 getAccessAge() 메서드 사용 가능
			if ( aniBook.getAccessAge() > this.mem.getAge() ){
				result = 1;
			}
		}
		else if (bList[index] instanceof CookBook) {
			CookBook cookBook = ( (CookBook)bList[index] );
			if ( cookBook.isCoupon() ) {
				this.mem.setCouponCount(mem.getCouponCount() + 1);
				result = 2;
			}
		}
		return result;	
		}
		
}

 

6. LibraryMenu 클래스 구현

package Test240125;
import java.util.Scanner;

public class LibraryMenu {
	private LibraryController lc;
	private Scanner sc;
	
	public LibraryMenu() {
		this.lc = new LibraryController();
		this.sc = new Scanner(System.in);
	}
	
	public void mainMenu() {
		Member mem = new Member();
		
		System.out.print("이름 : ");
		String name = sc.nextLine();
		mem.setName(name);
		
		System.out.print("나이 : ");
		int age = sc.nextInt();
		mem.setAge(age);
		
		System.out.print("성별 : ");
		char gender = sc.next().toUpperCase().charAt(0);
		mem.setGender(gender);
		
		// 또는 Member m = new Member(name, age, gender);
		lc.insertMember(mem);
		
	
		int select = 0;
		while(select != 9) {
			
			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("메뉴 번호 : ");
			select = sc.nextInt();
			sc.nextLine();
			
			switch(select) {
			case 1 : System.out.println(lc.myInfo());
				break;
			case 2 : this.selectAll();
				break;
			case 3 : this.searchBook();
				break;
			case 4 : this.rentBook();
				break;
			case 9 :
				System.out.println("프로그램이 종료되었습니다");
				sc.close();
				return;
			default :
				System.out.println("잘못된 번호입니다 다시 입력해주세요");
				break;
			}
		}
	}
	
	public void selectAll() {
		Book[] bList = lc.selectAll();
		for(int i = 0 ; i < bList.length ; i++) {
			if (bList[i] == null) { // 예외처리를 해주는 코드를 항상 만들어줄것 . 사용자가 에러를 체험하지 않도록
				break;
			}
			System.out.println(i + "번 도서 : " + bList[i]);
		}
	}
	
	public void searchBook() {
		Book[] myList;
		System.out.print("검색할 제목 키워드 : ");
		String keyword = sc.nextLine();
		myList = lc.searchBook(keyword);
		for(int i = 0 ; myList[i] != null ; i++) {
			System.out.println(myList[i]);
		}
	}
	
	public void rentBook() {
		this.selectAll();
		
		System.out.print("대여할 도서 번호 선택 : ");
		int index = sc.nextInt();
		sc.nextLine();
		
		int result = lc.rentBook(index);
		
		switch(result) {
		case 0 :
			System.out.println("성공적으로 대여되었습니다");
			break;
		case 1 :
			System.out.println("나이 제한으로 대여 불가능입니다");
			break;
		case 2 :
			System.out.println("성공적으로 대여되었습니다. 요리학원 쿠폰이 발급되었으니 마이페이지에서 확인하세요");
			break;
		}
		
	}
}

 

7. Run 클래스 구현

package Test240125;
public class Run {
	public static void main(String[] args) {
			new LibraryMenu().mainMenu();
	}
}