2025-03-24 java -2-

성현규·2025년 3월 24일
post-thumbnail

클래스 복습 (도서관 시스템 만들기)

    1. 명사 추출: 어떤 대상들이 있는가? -> 도서관, 책, DVD 등
    1. 속성과 행동: 각각 어떤 정보를 가지고 어떤 기능을 하는가? -> 책: 제목, 저자, 대여하기
    1. 상속 구조: 공통 속성은 부모로 뺄 수 있는가? -> Item ← Book, DVD
    1. 캡슐화: 데이터를 어떻게 안전하게 보호할 것인가? -> private 필드 + getter/setter
    1. 생성자: 객체를 어떻게 초기화할 것인가? -> new Book("데미안", "헤르만 헤세")
    1. 책임 분리: 이 기능은 누구의 책임인가? -> 목록 출력은 Library가
    1. 관계 설정: 어떤 객체가 무엇을 포함/상속하는가? -> 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() { // boolean의 getter는 관례적으로 앞에 is를 붙인다.
        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()); // boolean은 %b로 지정
    }

    @Override   // object class에서 toString을 오버라이드 이 부분은 무조건 오버라이드 해야함.
    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); // super는 자식 생성자 안에서 가장 위에 위치해야 한다.
        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){  // Item 객체들이 순회함.
            System.out.println(i); // 이렇게 i를 바로 출력하면 toString에 입력했던 사항이 출력된다.
        }
    }

    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)){ // 문자열이기 때문에 equals로 비교한다.
                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();

        // 실행 결과 -> toString에 입력했던 사항들이 출력된다.
//         ---전체 도서관 책 목록---
// 해당 책의 이름은 [demian]이며 저자 이름은 [hesse]이고 현재 대여여부는[false] 입니다.
// 해당 잡지의 이름은 [자라]이며 발행 월일은 [9]이고 현재 대여여부는[false] 
// 입니다.
// 해당 아이템의 이름은 [용]이며 현재 대여여부는[false] 입니다.
        

        gclibrary.borrowItem("용");
        gclibrary.returnItem("용");

        dragon.play();
    }
}
profile
학생

0개의 댓글