1.요구사항
-도서관에서 프로그램 제작 의뢰가 들어왔다고 가정
-도서관 관리자:도서관에서 책을 대여/반납하는 등의 내역을 관리하는 프로그램을 만들고 싶다
2.요구사항 정리
-관계자와 인터뷰를 진행한 결과 다음과 같은 요구사항들이 있다
1.도서관에서 책을 관리할 수 있도록 특정 책을 등록하는 시스템
2.도서관 책꽂이는 한정적이므로 책 등록 최대치가 있어야함
3.대여/반납 관리시스템이 필요함
3.주요기능 정리
1.책 등록
-이름과 저자정보가 등록
-등록 최대치 넘을 수 없다
2.책 대여
-책의 이름으로 찾아서 일치하는 책이 있으면 대어
-이미 대여중이거나 미등록된 책은 대여가 불가능
3.책 반납
-책의 이름으로 반납처리
-이미 반납된 책이거나 미등록 책은 반납 불가능
4.도서관 책 목록보기
-도서관에 등록된 책의 목록을 출력
-대여상태도 포함해서 출력
4.이론
#향상 for문
-배열처럼 반복 가능한 저장공간을 순차적으로 접근할 때 사용한다
-주로 배열,컬렉션의 모든 요소를 순회할 목적으로 사용한다
#클래스(class)
1.사용자 정의 타입이다(커스텀 자료형)
2.객체를 생성하기 위한 틀, 설계도
3.연관된 저장공간과 기능을 묶어서 관리하는 것이다
#생성자
-클래스 이름뒤에 소괄호가 붙은 것
-예)Student s1= new Student();<-Student()가 생성자이다
-생성자는 메서드와 비슷하지만 메서드라고 부르지 않는다
-모든 클래스는 반드시 1개 이상의 생성자를 가지고 있다
-객체를 생성할 때는 반드시 생성자가 실행된다
##생성자와 메서드의 차이
-메서드의 이름은 우리 마음대로 지을 수 있지만,생성자의 이름은 반드시 클래스 이름과 동일해야한다
-메서드는 반환이 존재하지만, 생성자는 반환이라는 개념자체가 존재하지 않는다
그러므로 반환타입을 명시하지 않는다
#this()
-자신의 다른 생성자를 의미한다
-생성자 내부에서만 사용 가능하다
-생성자의 최상단에서만 사용가능하다(주의하기)
##this()를 사용하는 이유
-생성자를 사용하는 주된 이유는 필드 초기화이다
-생성자를 오버로딩하여 여러개 만드는 경우, 필드 초기화 코드가 중복될 수 있다. 이런 경우this()를 사용하면 중복코드를 최소화할 수 있다
5.설계
1.클래스 설계
Book class
[필드]
-String title:책 제목
-String author:저자
-boolean borrowed:책 대여여부(true:대여중 false:보관중)
[생성자]
-Book(String title,String author)
Library class
[필드]
Book[] book :등록한 책을 받아오는 배열
int bookcount:등록된 책의 수
[생성자]
-Library(int capacity): 등록할 수 있는 책의 최대 개수를 매개변수로 받음
[메서드]
-void addBook(Book book):도서관의 책을 등록
-void borrowBook(String title): 책 대여
-void returnBook(String title): 책 반납
-void displayInfo():등록된 책 목록 출력
2.순서설계
1. Book클래스 생성
-필드 변수 세가지 선언
-생성자 변경하기
2.Library클래스 생성
-필드 배열, 변수 선언
-생성자 변경
- 필요한 메서드 생성
addBook- book이라는 변수 선언 후 입력받은 책 저장,
if문을 이용해 최대수 이상으로 등록 되면 "최대치를 초과했습니다"문구 출력
borrowBook-for문,if문 동시 사용하여 상황에 따른 출력 나올 수 있게 만들기
1.책이 대여되었습니다(brrowed-> false일때/true변경)
2.책을 대여할 수 없습니다(brrowed->true일때/ false변경)
3.도서관에 등록되지 않은 책입니다(Book[]에 저장되어 있지 않은 변수일 때)
returnBook-for문,if문 동시에 사용하여 상황에 따른 출력 나올 수 있게 만들기
1.책이 반납되었습니다(borrowed -> true일때/false 변경)
2.이미 반납된 책입니다(borrowed->false일때/ true변경)
3.도서관에 등록되지 않은 책입니다(Book[]에 저장되어 있지 않은 변수일때)
displayInfo- 향상for문,if문을 이용하여 Book[]배열에 저장되어 있는 모든 책의 책제목,저자명,대여여부 출력
3.테스트클래스 생성 후 만든 클래스와 메서드 잘 작동되는지 확인하기
-메인 메소드 안이 아닌 클래스 영역에 새로운 메서드를 생성 후 확인해보기
4.메인클래스 생성 후 실제로 사용할 프로그램 만들기
6.플이
1.클래스 설계
Book class
[필드]
-String title:책 제목
-String author:저자
-boolean borrowed:책 대여여부(true:대여중 false:보관중)
String title;
String author;
boolean borrowed;
[생성자]
-Book(String title,String author)
public Book(String title, String author) {
this.title = title;
this.author=author;
}
-생성자에서 바로 책제목과 저자를 입력받아 변수 안으로 저장할 수 있게 생성자 안에서 변수를 초기화함
Library class
[필드]
Book[] book :등록한 책을 받아오는 배열
int bookcount:등록된 책의 수
Book[] books;
int bookCount;
[생성자]
-Library(int capacity): 등록할 수 있는 책의 최대 개수를 매개변수로 받음
public Library(int capacity) {
books=new Book[capacity];
}
[메서드]
-void addBook(Book book):도서관의 책을 등록
void addBook(Book book) {
if(bookCount<books.length) {
books[bookCount]= book;
bookCount++;
System.out.println(book.title+"이(가) 등록되었습니다");
}else {
System.out.println("등록할 수 있는 최대치를 초과했습니다");
}
}
-void borrowBook(String title): 책 대여
void borrowBook(String title) {
for(int i=0;i<bookCount;i++) {
String bookTitle = books[i].title;
if(bookTitle.equals(title)) {
if(!books[i].borrowed) {
books[i].borrowed=true;
System.out.println(title+"이(가) 대여되었습니다");
}else {
System.out.println(title+"은(는) 이미 대여중입니다");
}
}return;
} System.out.println(title+"은(는) 도서관에 없습니다");
}
-if문이 끝나면 밑에 도서관에 없다는 문서가 출력되지 않도록 if문이 실행되면 종료하게끔 retrun을 걸어두었다
-void returnBook(String title): 책 반납
void returnBooks(String title) {
for(int i=0;i<bookCount;i++) {
String bookTitle = books[i].title;
if(bookTitle.equals(title)) {
if(books[i].borrowed) {
books[i].borrowed=false;
System.out.println(title+"이(가)반납되었습니다.");
}else {
System.out.println(title+"은(는) 이미 반납었습니다");
}
}return;
} System.out.println(title+"은(는) 도서관에 없습니다");
}
-void displayInfo():등록된 책 목록 출력
void displayInfo() {
System.out.println("=======책 정보======");
for(Book book : books) {
System.out.println("책 제목:"+book.title+"대여여부:"+(book.borrowed? "대여중":"대여불가능"));
}
}
-삼항연산자를 사용해 대여여부를 간단하게 작성해보았다
3.테스트클래스 생성 후 만든 클래스와 메서드 잘 작동되는지 확인하기
package library;
public class Test {
public static void main(String[] args) {
addTest();
borrowTest();
}
static void addTest() {
Library lib= new Library(2);
Book b1 = new Book("자바의 정석", "바바바");
Book b2 = new Book("자의 정석", "바");
Book b3 = new Book("바의 정석", "바바");
lib.addBook(b1);
lib.addBook(b2);
lib.addBook(b3);
}
static void borrowTest() {
Library lib= new Library(2);
Book b1 = new Book("자바의 정석", "바바바");
Book b2 = new Book("자의 정석", "바");
Book b3 = new Book("바의 정석", "바바");
lib.addBook(b1);
lib.addBook(b2);
lib.displayInfo();
lib.borrowBook("자의 정석");
lib.borrowBook("자의 정석");
lib.displayInfo();
}
}
-저장개수 초과까지 확인하기 위해 최대수를 2로 지정하고 3권정도를 저장하고 빌려보았다
-정보출력은 잘 되지만 대여기능이 아예 출력되지 않고 대여불가능만 뜨는 오류가 떠 다시 Library class를 선생님의 예시 class와 비교하여 오류난 곳을 찾아보았다
-확인해보니 retrun을 다른 위치에 작성해 아예 for문이 실행되지 않았던 것이었다
-수정후-
void borrowBook(String title) {
for(int i=0;i<bookCount;i++) {
String bookTitle = books[i].title;
if(bookTitle.equals(title)) {
if(!books[i].borrowed) {
books[i].borrowed=true;
System.out.println(title+"이(가) 대여되었습니다");
}else {
System.out.println(title+"은(는) 이미 대여중입니다");
}return;
}
} System.out.println(title+"은(는) 도서관에 없습니다");
}
-수정하니 제대로 작동하는 것을 확인할 수 있었다
-테스트를 마무리하고 메인클래스에 제대로 프로그램을 짜기로 했다
4.메인클래스 생성 후 실제로 사용할 프로그램 만들기
package library;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Library lib = new Library(3);
lib.addBook(new Book("자바", "이이이"));
lib.addBook(new Book("바바", "이이"));
lib.addBook(new Book("자바바", "이이이이"));
Scanner sc= new Scanner(System.in);
String msg = """
1.책 목록보기
2.대여하기
3.반납하기
입력>>""";
for(int i=0;i<10;i++) {
System.out.println("=================");
System.out.print(msg);
int choice =sc.nextInt();
if(choice==1) {
lib.displayInfo();
}else if(choice==2) {
System.out.print("대여할 책 제목 입력>>");
String brbook=sc.next();
lib.borrowBook(brbook);
}else if(choice==3) {
System.out.print("반납할 책 제목 입력>>");
String rtbook=sc.next();
lib.returnBooks(rtbook);
}else {
System.out.println("잘못입력하셨습니다");
}
}return;
}
}
-for문과 if문을 사용하여 코드를 짜보았다
-한번 for문이 실행되면 바로 종료되지 않도록 마지막에 return을 넣어주었다
(나의 잘못된 이해였다 return은 메서드를 탈출켜주기 때문에 이코드에서 필요 없고, for문 조건에서 10번까지 반복하도록 했기 때문에 지속된거였고 횟수제한 없이 실행하려면 while문이 더 적절하다)
7.실행
-전반적으로 잘 돌아가고 있다
8.의문점
(다음수업때 선생님께 질문 후 피드백 추가 예정)
-1번 책 목록보기를 누르면 위와 같은 경고창이 뜨는데 정확히 무슨 이유인지 모르겠다
(++내가 for문을 10번 반복한다고 만들어 놓고 콘솔창에서 10번 반복이 되지 않은 상태로 강제종료도 되지 않은채 다시 실행하기를 눌러서 나오는 경고창이었다)
-배열을 5개로 만들고 3개만 등록하니 오류가 뜨던데 3개로 바꾸고 3개를 등록하니 해결됐다 만든 배열보다 적은 값만 저장하고도 돌아가게 하는 법을 알고 싶다
9.느낀점
-아직 명령어들의 영역부분을 제대로 구분하지 못하는 거 같다. 연습이 더 필요할 거 같다
-연습이 더 필요한 부분이겠지만 설계할때 어떤 걸 생각해야하는지 감이 잘 안잡힌다
'연습기록 > JAVA' 카테고리의 다른 글
[JAVA코딩테스트] 홀짝에 따라 다른 값 반환하기 (0) | 2024.11.15 |
---|---|
[JAVA] 리스트 연습-상품 품목 관리 프로그램 만들기 (0) | 2024.11.03 |
[JAVA]캐스팅 연습-도형 넓이 구하는 프로그램 생성 (0) | 2024.10.29 |
[JAVA]클래스 연습-학생의 정보를 저장하는 클래스 생성 (1) | 2024.10.24 |
[JAVA]if문 연습하기-학점계산문제 (0) | 2024.10.18 |