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();
}
}
'프로그래밍 언어 활용 > JAVA' 카테고리의 다른 글
네트워크 : TCP 통신 구현하기 (0) | 2024.02.13 |
---|---|
컬렉션 프레임워크 : 각론 (0) | 2024.02.05 |
05. 클래스와 객체 1 (0) | 2024.01.18 |
04. 제어 흐름 이해하기 (2) | 2024.01.17 |
02-1. 컴퓨터의 데이터 표현 방법 (1) | 2024.01.15 |