■ JAVA REVIEW & PRACTICE/LECTURE2 - ATTIC

Creating a Library Book Management System

JH 2024. 8. 23. 02:32
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 객체 생성 == 인스턴스화
        Library library = new Library();

        Book bookA = new Book ("jooHeeSchool ", "jooHee1", true);
        Book bookB = new Book ("jooHeeSports ", "jooHee2", true);
        Book bookC = new Book ("jooHeeBoxing ", "jooHee3", true);
        Book bookD = new Book ("jooHeeCoding ", "jooHee4", true);


        Scanner sc = new Scanner(System.in);

        System.out.println("===== 오늘 저희 도서관에 추가된 책의 목록입니다. =====" );
        library.addBook(bookA);
        library.addBook(bookB);
        library.addBook(bookC);
        library.addBook(bookD);

        //책 제거
        library.removeBook(bookD);


        System.out.println("===== 현재 저희 도서관에서 대여가 가능한 모든책을 출력합니다. =====" );
//        System.out.println(library.getAllBook());
        library.getAllBook();


            System.out.println("===== 대여를 원하시는 책의 이름을 작성해주세요. =====");
            String wantBook = sc.nextLine();
            System.out.println(wantBook);

            System.out.println("===== 책 대여가 완료되었습니다. =====");
            library.lendBook(bookA);

            System.out.println("===== 책을 반납하시겠습니까? 예 또는 아니오로 작성해주세요. =====");
            String noBook = sc.nextLine();
            System.out.println(noBook);

        System.out.println("===== 책 반납이 완료되었습니다. =====" );
        library.returnBook(bookA);




    }
}

 

 

public class Book {
    // 클래스 필드 (속성)
    private String title;   // 제목
    private String author;  // 저자
    private boolean isAvailable; // 대여여부
//------------------------------------------------------------------------------------------------------------------



    //클래스 생성자
    public Book (String title, String author, boolean isAvailable) {
        this.title = title; // 초기화 시키기 위해. 참고로 이 생성자는 기본생성자가 아님  // this: 클래스에 있는 필드값이라는 것을 알려주기 위해
        this.author = author;
        this.isAvailable = isAvailable;
    }

//------------------------------------------------------------------------------------------------------------------
    //메서드
    public String getTitle () { // 책 제목 조회 -> 1. 조회 : get 메서도 / 2. 무엇을? 책 제목 /
        return title;
    }

    public boolean getIsAvailable () { // 책 대여여부 조회 -> 1. 조회: get 메서드 / 2. 무엇을? 책 대여 여부를
        return isAvailable;
    }

    public void setIsAvailable (boolean isAvailable) { // 책 대여여부 설정 -> 1. 설정: set메서드 / 2. 무엇을? 책 대여여부를
        this.isAvailable = isAvailable;
    }

    public void printBookInfo () {//상제 정보 출력 -> 1. 출력 / 2. 무엇을? 책 정보를 / 3. 반환? 출력? 출력이니까 return 안써서 void
        System.out.println(getTitle());
    }
}



//------------------------------------------------------------------------------------------------------------------
//    boolean (기본 자료형)
//    기본 자료형으로, 오직 true 또는 false 값만 가질 수 있습니다.
//    메모리 효율성이 높고, null 값을 가질 수 없습니다.
//    기본값은 false입니다.
//    성능이 더 우수하고 단순한 논리 연산에 적합합니다.



//    Boolean (래퍼 클래스)
//    객체로 취급되는 래퍼 클래스입니다. boolean과 다르게 null 값을 가질 수 있습니다.
//    기본값이 없고, 초기화하지 않으면 null일 수 있습니다.
//            null 상태를 사용하여 "값이 아직 설정되지 않았다"는 의미를 전달할 수 있습니다.
//    더 많은 메서드를 제공하며, 컬렉션(List, Set 등)에서 사용할 수 있습니다.

 

 

import java.util.ArrayList;
import java.util.List;

public class Library { // 도서관 = 책이 여러개 모여있는 곳
    // 클래스 속성
    // 책 목록 (books) : ArrayList
    List<Book> books = new ArrayList<>(); // books 는 library 의 속성이자 상태
//------------------------------------------------------------------------------------------------------------------
    // 생성자: 책 목록 초기화 필요
    // 생성자의 특징 :
    // 1. 클래스와 이름이 같다.
    // 2. void: 리턴할 값이 없다!
    // 3. 생성자는 기본생성자와 기본생성자가 아닌걸( == 생성자 )로 구분한다. 여기서는 Book 클래스에 매개변수가 있는 생성자를 이미 만들어줬음
    // 4. 기본생성자 기능 : 초기화 시켜줌 (매개변수와 스코프 안에 아무것도 넣어주지 않는 형태)
    // 4. 기본생성자는 그냥 생성자가 있으면 따로 만들지 않음 (누가? Java 가 자동으로 만들어줌) : 그래서 여기 Library 에서 요구한 것이 기본생성자로 초기화 하라고
    // 하셨으니까 사실 안만들어줘도 되지만 여기에서는 숙제를 하기위해 만들어 줄 예정)

    public Library () {
        // 초기화: 기본 생성자로 초기화 / 무엇을? 책 목록을, 하지만 기본생성자로 초기화 할 예정이니 아무것도 적지 않음 / 책 목록은 어디에? booksList 배열에
    }
//------------------------------------------------------------------------------------------------------------------
    // List(ArrayList) 의 기능에 대해서 따로 보내드렸어요 !! 와!!!!! 감사합니다!!!
    // intList 는 그냥 수업에서 나왔던 변수명(배열명) 이에요! 오해 ㄴㄴ!! 오!@@@@
    // 마치 booksList 와 같은 것 !!
    // 매서드
    // ㅁㄱㅂㅅ == ㅍㄹㅁㅌ
    // 여기서부터 list에 대한 기능을 사용할 예정
    public void addBook (Book book) {
        // 일단 이 추가에 대해서 값을 반환이 필요하는가? 모르면 일단 void 부터 쓰고 결정 -> 값이 필요한게 아니라 책만 주면되니까  return 필요없음
        // 도서관에 책 추가: 메서드 이름: 책추가 / 1. 추가:add->메서드 / 2. 무엇을? 책을->파라미터 / 3. 어떤책? 몰라 / 3. 어디에 담아? 도서관에 / 4. 도서관 어디에? books에 List로 표현되어있음
        // 메인에서 이 add 기능을 써야하니까 그럼 뭘 해야해? addBook 에 기능을 넣어줘야 돼 -> 어떤기능? 배열에 값을 넣어 줄 수 있는 기능
        books.add(book);
        System.out.println(book.getTitle() + "책이 추가 되었습니다.");
        // 책을 추가하기 위해서는 책을 받아와야함
        // 메서드는 목적어가 파라미터로 온다!!!!!
    }

    //클래스도 데이터를 담을 수 있는 형태, int string Long 만 데이터타입은 아니다.
    // 객체도 어떤걸 담을 수 있는 형태
    // 클래스 = instance = 객체
    // 자료를 표현할 수 있는 형태
    // int = 정수형을 담는 : 숫자 int에 맵핑
    // String = 문자열을 담는 : 문자열을 String에 맵핑
    // 클래스 = 객체를 담는
    // 객체를 받는것 = book 안에 있는 것들을 모두 사용 가능
    // 그러니 객체도 자료형이 될 수 있음
//------------------------------------------------------------------------------------------------------------------
    // 도서관에서 책 제거
    public void removeBook (Book book) { //메서드: 제거 / 파람미터: 책을 / 이 책은 어디에?  / 어떤책: 몰라: 모르니까 그냥 책/ 어디에서? 도서관에 있는 책 목록에서 / 무슨책인진 모르지만 지울거야!
        books.remove(book);
    }
//------------------------------------------------------------------------------------------------------------------
    // 도서관에서 책 이름으로 검색 = 검색이란 의미가 즉 조회 = 책 제목으로 책을 검색 : ~을 (목적어니까 파라미터 예측!!!!) String title => 결과는 책을 검색 = 검색 결과가 나와야되니까
    public Book getBook (String title) {
        // 반복을 해서 찾고자 하는 책의 타이틀을 찾아야 하니까 for문 사용
        for (int i = 0; i < books.size(); i++) { // size는 메서드니 () 괄호!
            Book book = books.get(i); // 처음에 0 이니까 첫번째 책을 잡고 뽑음
            if (book.getTitle().equals(title)) { // 제목 확인 후 내가 찾던 책이 맞으면!!! = 비교 return 으로 나가고 아니면 반복
                return book; // 원하던 책을 찾으면 바로 나가
            } // 책을 찾고 바로 나가버리니 else 가 필요없음

//            if (books.get(i).getTitle().equals(title)) { // 이렇게 썼다가 위에껄로 바꿈
//                return books.get(i);
        }
        return null; // 찾던 책이 없으면 //객체의 없는 것을 줄 때 null = 없다!!!
    }

//------------------------------------------------------------------------------------------------------------------
    // 도서관에 모든 책 조회
    public void getAllBook () {
        // 모든 책을 다 조회해야하니 하나씩 살펴봐야해서 for문
        for (int i = 0; i < books.size(); i++) {
            System.out.println(books.get(i).getTitle());
            //return books.get(i); 이렇게 쓰니 주소값이 출력되는 것을 확인해서 위에껄로 확정
        }
    }

    // 원래는 아래처럼 썼는데 String 주머니에 값이 하나밖에 안들어가서 책이 하나밖에 출력안된것을 확인했음.
    // (여기서 컬렉션? 을 써서 하는 방법을 찾아보기 익숙해지면! 또는 튜터님께 여쭤보기!)
//    public String getAllBook () {
//        // 모든 책을 다 조회해야하니 하나씩 살펴봐야해서 for문
//        for (int i = 0; i < books.size(); i++) {
////            return books.get(i);        // 모든 책 조회니까 리턴할게 없음 = 반환을 안하니 void
//            return books.get(i).getTitle();  // 위에꺼 출력 후 실험해보기 -> 이걸 쓰면 String 으로 바꿔줘야함 반환타입을
//        }
//        return null;
//    }
//------------------------------------------------------------------------------------------------------------------
    // 도서관에서 책 대여 = isAvailable 이 있으니 이것의 값 변경 = 어떤책을?
    public void lendBook (Book book) {
        book.setIsAvailable(false);
    }
//------------------------------------------------------------------------------------------------------------------
    // 도서관에서 책 반납 = isAvailable 이 반납되었으니 true
    public void returnBook (Book book) {
        book.setIsAvailable(true);
    }

}

//객체의타입(담아주는) > 객체 > 객체의 속성들(상태들)