클래스 복습 (도서관 시스템 만들기)
- 명사 추출: 어떤 대상들이 있는가? -> 도서관, 책, DVD 등
- 속성과 행동: 각각 어떤 정보를 가지고 어떤 기능을 하는가? -> 책: 제목, 저자, 대여하기
- 상속 구조: 공통 속성은 부모로 뺄 수 있는가? -> Item ← Book, DVD
- 캡슐화: 데이터를 어떻게 안전하게 보호할 것인가? -> private 필드 + getter/setter
- 생성자: 객체를 어떻게 초기화할 것인가? -> new Book("데미안", "헤르만 헤세")
- 책임 분리: 이 기능은 누구의 책임인가? -> 목록 출력은 Library가
- 관계 설정: 어떤 객체가 무엇을 포함/상속하는가? -> Library has-a Item List
Item (도서관에 있는 물건들의 부모클래스)
- toString()은 객체를 System.out.println(객체) 으로 출력했을 때 어떻게 문자열로 보여줄지를 정하는 메서드이다.
public class Item{
private String title;
private boolean borrowed = false;
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isborrowed() {
return this.borrowed;
}
public void setborrowed(boolean borrowed) {
this.borrowed = borrowed;
}
Item(){}
Item(String title){
setTitle(title);
System.out.printf("대여 아이템 [%s]이 생성되었습니다.\n", getTitle());
}
void borrow(){
if (!isborrowed()){
setborrowed(true);
System.out.println("대여가 정상적으로 이루어졌습니다.");
}
else {
System.out.printf("[%s]가 이미 대여 중입니다.\n", getTitle());
}
}
void returnitem(){
if (isborrowed()){
setborrowed(false);
System.out.println("반납이 정상적으로 이루어졌습니다.");
}
else {
System.out.printf("[%s]는 대여중이 아닙니다.\n", getTitle());
}
}
void state() {
System.out.printf("[%s]의 현재 대여 상태는 [%b]입니다.\n", getTitle(), isborrowed());
}
@Override
public String toString() {
return String.format("해당 아이템의 이름은 [%s]이며 현재 대여여부는[%b] 입니다.", getTitle(),isborrowed());
}
}
book 클래스
- 클래스 이름을 Book으로 했어야 하는데 앞글자를 소문자로 해버렸다.
public class book extends Item{
private String author;
public String getAuthor() {
return this.author;
}
public void setAuthor(String author) {
this.author = author;
}
public book(String title, String author){
super(title);
setAuthor(author);
}
@Override
public String toString() {
return StrAing.format("해당 책의 이름은 [%s]이며 저자 이름은 [%s]이고 현재 대여여부는[%b] 입니다.", getTitle(), getAuthor(), isborrowed());
}
}
DVD 클래스
public class DVD extends Item {
private int runningTime;
public int getRunningTime() {
return this.runningTime;
}
public void setRunningTime(int runningTime) {
this.runningTime = runningTime;
}
public DVD(String title, int runningTime){
super(title);
setRunningTime(runningTime);
}
public void play(){
System.out.println("DVD 재생 중..");
}
}
Megazine 클래스
public class Magazine extends Item{
private int issueMonth;
public int getIssueMonth() {
return this.issueMonth;
}
public void setIssueMonth(int issueMonth) {
this.issueMonth = issueMonth;
}
public Magazine(String title, int issueMonth){
super(title);
setIssueMonth(issueMonth);
}
@Override
public String toString() {
return String.format("해당 잡지의 이름은 [%s]이며 발행 월일은 [%d]이고 현재 대여여부는[%b] 입니다.", getTitle(),getIssueMonth(), isborrowed());
}
}
Library 클래스 (HAS A로 Item을 가져다 사용)
import java.util.ArrayList;
public class Library {
ArrayList <Item> items = new ArrayList<>();
public void addItem(Item item){
items.add(item);
System.out.println("상품이 등록되었습니다.");
}
public void showItem(){
System.out.println("---전체 도서관 책 목록---");
for (Item i : items){
System.out.println(i);
}
}
public void borrowItem(String title){
for (Item i : items){
if (i.getTitle().equals(title)){
i.borrow();
}
}
}
public void returnItem(String title){
for (Item i : items){
if (i.getTitle().equals(title)){
i.returnitem();
}
}
}
}
테스트
public class Ex_LibraryTest {
public static void main(String[] args) {
book demian = new book("demian", "hesse");
Magazine zara = new Magazine("자라", 9);
DVD dragon = new DVD("용", 120);
Library gclibrary = new Library();
gclibrary.addItem(demian);
gclibrary.addItem(zara);
gclibrary.addItem(dragon);
gclibrary.showItem();
gclibrary.borrowItem("용");
gclibrary.returnItem("용");
dragon.play();
}
}