
이 프로그램은 도서관 관리 프로그램이다.
사용자는 책을 추가하고, 가장 오래된 책을 삭제하고, 도서 목록을 출력하는 기능을 사용할 수 있다. LibraryMain 클래스는 프로그램의 시작점이며, Library 클래스는 도서관의 기능을 구현한다.
package nested;
import java.util.Scanner;
//사용자 입력을 받기 위해 Scanner 클래스를 가져온다.
public class LibraryMain {
public static void main(String[] args) {
//main 메서드는 프로그램의 시작점.
Library lib = new Library();
// Library 객체를 생성.
Scanner scanner = new Scanner(System.in);
// 사용자 입력을 받기 위한 Scanner 객체를 생성.
System.out.println("=== 도서 관리 프로그램에 오신 것을 환영 합니다. ===");
while (true) {
//무한 루프를 시작.
System.out.println("=== 원하는 기능을 선택 하세요. ===");
//기능 선택 메시지를 출력.
System.out.print("1. 도서 추가 / 2. 가장 오래된 도서 삭제 / 3. 도서 목록 출력 / 4.프로그램 종료 :");
// 기능 선택 메시지를 출력.
int choice =scanner.nextInt();
// 사용자 입력을 정수로 받는다.
scanner.nextLine();
// 다음 입력을 위해 개행 문자를 제거.
if (choice == 1) {
lib.addBook();
// 사용자가 1을 입력하면 도서를 추가.
} else if (choice == 2) {
lib.removeBook();
// 사용자가 2를 입력하면 도서 삭제.
} else if (choice == 3) {
lib.showBooks();
// 사용자가 3을 입력하면 도서 목록 출력.
} else {
System.out.println("===프로그램을 종료 합니다===");
return;
// 프로그램을 종료.
}
}
}
}
package nested;
import java.util.Scanner;
//사용자 입력을 받기 위해 Scanner 클래스를 가져온다.
public class Library {
Book[] books; // Book 객체를 저장할 배열을 선언.
int bookCount; // 현재 저장된 책의 수를 나타내는 변수를 선언.
static final int LIBRARY_SIZE = 4; //도서관의 최대 크기를 상수로 정의.
public Library() {
//Library 클래스의 생성자이다.
this.books = new Book[LIBRARY_SIZE];
//Book 배열을 초기화.
bookCount = 0;
// 초기 책의 수를 0으로 설정.
}
public void addBook() {
//도서를 추가하는 메서드.
if (bookCount == LIBRARY_SIZE) {
//도서관이 가득 찼다면
System.out.println("=== 더 이상 책을 보관할 수 없습니다. ===");
// 더 이상 책을 보관할 수 없습니다.를 알림
return;
//메서드를 종료.
}
Scanner scanner = new Scanner(System.in);
// 사용자 입력을 받기 위한 Scanner 객체를 생성.
System.out.print("책 제목을 입력 하세요 : ");
String title = scanner.nextLine();
System.out.print("책 저자를 입력 하세요");
String author = scanner.nextLine();
books[bookCount++] = new Book(title, author);
//새로운 책을 배열에 추가하고, 책 수를 증가 시킴.
System.out.println("보관 된 책의 수는 : " + bookCount);
System.out.println("=== 책 보관 완료 ===");
}
public void removeBook() {
// 가장 오래된 도서를 삭제하는 메서드.
if (bookCount == 0){
//도서관이 비어있다면
System.out.println("*** 보관 된 책이 존재하지 않습니다 ***");
//삭제할 책이 없음을 알립니다.
return;
// 메서드를 종료
}
for (int i = 1; i < bookCount; i++) {
// 배열의 첫 번째 책을 삭제하고, 나머지 책을 앞으로 이동시킨다.
books[i - 1] = books[i];
// 배열의 각 책을 앞쪽으로 이동.
}
books[--bookCount] = null;
// 마지막 책을 null로 설정하고, 책 수를 감소시킴.
System.out.println("*** 가장 오래된 책이 삭제되었습니다. ***");
}
public void showBooks(){
// 도서 목록을 출력하는 메서드.
System.out.println("=== 책 목록 출력 ===");
System.out.println("*** 총 보관 책의 수는 : " + bookCount +" 입니다.***");
for (int i = 0; i < bookCount; i++) {
// 현재 보관된 모든 책을 출력.
System.out.println((i + 1) + ". 제목 : " + books[i].title + " / 저자 : " + books[i].author);
}
}
static class Book {
// Library클래스 내부에 Book클래스를 정의.
String title; //책의 제목을 저장할 변수.
String author; // 책의 저자를 저장할 변수.
public Book(String title, String author) {
//Book 클래스의 생성자.
this.title = title; // 책 제목을 초기화.
this.author = author; // 책 저자를 초기화.
}
}
}
• 패키지 (package): 관련된 클래스들을 그룹화하는 방법으로, 네임스페이스를 제공하여 클래스 이름 충돌을 방지합니다.
• 클래스 (class): 객체 지향 프로그래밍의 기본 단위로, 객체의 설계도입니다. 여기서는 Library와 Book 클래스가 정의되어 있습니다.
• 객체 (object): 클래스의 인스턴스로, 클래스에서 정의된 구조와 행동을 가집니다.
• 메서드 (method): 객체의 동작을 정의하는 함수입니다.
• 배열 (array): 같은 타입의 여러 값을 저장할 수 있는 자료구조입니다.
• 상수 (constant): 프로그램 내에서 변경되지 않는 값을 정의하는 데 사용됩니다.
• Scanner: 표준 입력을 통해 사용자로부터 입력을 받을 수 있게 해주는 클래스입니다.
• 메서드 호출: lib.addBook(), lib.removeBook(), lib.showBooks() 등을 통해 Library 객체의 기능을 사용할 수 있습니다.
• 배열 관리: 책을 추가하고 삭제할 때 배열을 적절히 관리하는 방법을 보여줍니다.
• 입출력: Scanner를 사용하여 사용자로부터 입력을 받고, System.out.println을 사용하여 출력을 처리합니다.
1. 배열 크기 제한:
• 배열 크기를 고정된 값으로 정의했기 때문에, 더 많은 책을 저장하려면 다른 자료구조(예: ArrayList)를 사용하는 것이 좋습니다.
2. 입력 유효성 검사:
• 사용자의 입력에 대한 유효성 검사를 추가하여 프로그램의 안정성을 높일 수 있습니다. 예를 들어, 숫자가 아닌 값을 입력했을 때의 예외 처리 등이 필요합니다.
3. 메모리 관리:
• books 배열에서 책을 삭제할 때 메모리를 해제하는 방식으로 null을 할당하고 있습니다. 이는 작은 프로그램에서는 문제가 없지만, 큰 프로그램에서는 더 신경 써야 합니다.
이 코드는 기본적인 도서 관리 프로그램의 예제로, 객체 지향 프로그래밍의 개념과 자바의 기본 문법을 익히는 데 도움이 된다.