Java

🧱 배열 복습하기 - 도서 관리 프로그램 (CRUD 실습)

공돌이 출신 개발자 2025. 5. 3. 21:52
728x90

✍️ 시작하며

지난 시간에는 자바의 기본 자료구조 중 하나인 **배열(Array)**에 대해 배웠습니다.
이번 글에서는 배열을 활용해 도서 데이터를 관리하는 간단한 콘솔 프로그램을 만들어 보겠습니다.
이를 통해 프로그래밍의 가장 기본이 되는 개념 중 하나인 CRUD도 자연스럽게 복습할 수 있습니다.

✅ CRUD란?

CRUD는 데이터 처리의 기본적인 네 가지 동작을 의미합니다.

  • C: Create (생성)
  • R: Read (조회)
  • U: Update (수정)
  • D: Delete (삭제)

이 개념은 웹, 앱, DB 등 모든 프로그래밍 영역에서 반복적으로 사용됩니다.
이번 실습에서는 배열과 클래스를 활용해 이 동작들을 직접 구현해볼 거예요.


💡학습 목표

  • 배열을 이용한 도서 목록 관리 시스템 구현
  • 자바의 객체 배열과 null 체크를 통한 방어적 코드 작성
  • while문 + switch 또는 if문을 이용한 메뉴 처리 흐름 익히기
  • static 변수와 메서드를 이용한 데이터 관리의 흐름 이해

🧱 1단계 - Book 클래스 만들기

도서 정보를 담을 Book 클래스를 먼저 정의합니다.

package books;

public class Book {
    private String title;
    private String author;

    // 생성자
    public Book(String title, String author) {
        this.title = title;
        this.author = author;
    }

    // getter 메서드
    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    // 도서 정보 출력
    public void showInfo() {
        System.out.println(">> 책 정보 <<");
        System.out.println("제목 : " + title);
        System.out.println("저자 : " + author);
    }
}

📌 설명
Book 클래스는 도서 정보를 표현하는 데이터 모델입니다.
생성자에서 제목과 저자를 받아 저장하고, getter를 통해 외부에서 접근할 수 있도록 했습니다.
showInfo()는 도서 정보를 깔끔하게 출력해주는 메서드입니다.


🧰 2단계 - 메인 클래스 설계

MyBookStore 클래스를 만들고, 콘솔 메뉴를 통해 사용자의 입력을 받아 기능을 실행하도록 구성합니다.

Scanner scanner = new Scanner(System.in);
Book[] books = new Book[100];
boolean flag = true;

while (flag) {
    System.out.println("1.저장 2.전체조회 3.선택조회 4.전체삭제 5.종료");
    String selectedNumber = scanner.nextLine();

    if (selectedNumber.equals("1")) {
        save(scanner, books);
    } else if (selectedNumber.equals("2")) {
        readAll(books);
    } else if (selectedNumber.equals("3")) {
        readByTitle(scanner, books);
    } else if (selectedNumber.equals("4")) {
        deleteAll(books);
    } else if (selectedNumber.equals("5")) {
        flag = false;
    }
}

✅ 메뉴를 선택하면 해당 기능이 호출되는 구조입니다.
사용자가 "1"을 입력하면 save()가 실행되고, "5"를 입력하면 프로그램이 종료됩니다.


📝 3단계 - CRUD 기능 구현

📌 Create - 도서 정보 저장

public static void save(Scanner scanner, Book[] books) {
    System.out.println("책 제목을 입력하세요:");
    String title = scanner.nextLine();
    System.out.println("저자를 입력하세요:");
    String author = scanner.nextLine();

    books[currentBookIndex] = new Book(title, author);
    currentBookIndex++;
}

✅ 사용자의 입력을 받아 Book 객체를 만들고 배열에 저장합니다.


📌 Read - 전체 도서 목록 조회

public static void readAll(Book[] books) {
    for (int i = 0; i < books.length; i++) {
        if (books[i] != null) {
            System.out.println(books[i].getTitle() + ", " + books[i].getAuthor());
        }
    }
}

✅ 배열을 순회하며 등록된 도서만 출력합니다.


📌 Read - 도서 제목으로 검색

public static void readByTitle(Scanner scanner, Book[] books) {
    System.out.println("책 제목 입력:");
    String title = scanner.nextLine().trim();
    boolean found = false;

    for (Book book : books) {
        if (book != null && book.getTitle().equals(title)) {
            System.out.println(book.getTitle() + ", " + book.getAuthor());
            found = true;
            break;
        }
    }

    if (!found) System.out.println("해당 책은 존재하지 않습니다.");
}

✅ 특정 제목을 가진 도서를 배열에서 검색합니다.


🗑️ Delete - 전체 삭제

public static void deleteAll(Book[] books) {
    for (int i = 0; i < books.length; i++) {
        books[i] = null;
    }
}

✅ 배열의 모든 요소를 null로 초기화하여 도서를 논리적으로 삭제합니다.
저장된 도서 정보는 사라지며, readAll() 실행 시 출력되지 않습니다.


🧪 4단계 - 참조형 배열 활용 (BookTest1)

배열은 단순한 숫자만 저장하는 것이 아니라, 우리가 만든 클래스의 객체도 저장할 수 있습니다. Book 객체를 배열에 저장하고 활용하는 예제를 보며 배열의 특징을 정리해 봅시다.

public class BookTest1 {
    public static void main(String[] args) {
        // 배열 안에 요소는 기본형 또는 참조형일 수 있다.
        Book[] books = new Book[10]; // 길이는 10 (0~9)

        // 객체 저장
        books[0] = new Book("개발자가되고싶습니다.", "앨런");
        books[1] = new Book("무궁화꽃이피었습니다.", "김진명");
        books[2] = new Book("흐르는강물처럼.", "파울로코엘료");
        books[3] = new Book("리딩으로리드하라.", "이지성");
        books[4] = new Book("사피엔스.", "유발하라리");
        books[9] = new Book("홍길동전.", "허균");

        // 단일 요소 조회
        String title9 = books[9].getTitle();
        String author9 = books[9].getAuthor();

        System.out.println("title9: " + title9);
        System.out.println("author9: " + author9);

        // 반복문을 이용한 전체 조회 (null 방어)
        for (int i = 0; i < books.length; i++) {
            if (books[i] != null) {
                System.out.println(books[i].getTitle());
            }
        }
    }
}

 참조형 배열은 우리가 만든 클래스의 인스턴스를 저장할 수 있습니다.
✅ 배열 전체 길이와 실제로 저장된 요소 수는 다를 수 있으므로 null 체크는 필수입니다.


📦 배열의 특징과 한계 정리

항목 설명
고정 길이 한 번 생성된 배열의 길이는 변경할 수 없음
순차 저장 인덱스를 통해 빠르게 접근 가능
null 처리 비어있는 인덱스는 null이므로 방어적 코드 필요
참조형 저장 객체를 배열에 저장하여 구조적인 데이터 관리 가능

🧩 마무리하며

이번 실습을 통해 자바 배열과 객체를 활용하여 도서 관리 프로그램을 직접 구현해보았습니다.
배열은 단순한 숫자 저장을 넘어, 우리가 만든 객체 데이터를 체계적으로 관리할 수 있는 유용한 자료구조임을 확인할 수 있었죠.

특히, 이번 프로젝트에서는 프로그램의 핵심 개념인 CRUD를 실제 코드로 체험하며 그 동작 방식을 익힐 수 있었습니다.

다시 정리하면,

  • C (Create) : 도서를 배열에 추가
  • R (Read) : 저장된 도서를 전체 또는 선택적으로 조회
  • U (Update) : (선택적으로) 특정 도서 정보를 수정
  • D (Delete) : 배열 데이터를 null 처리하여 삭제

📝 CRUD는 프로그래밍의 기본 중의 기본입니다. 반드시 기억해두세요!


🔜 다음 글 예고 : 메서드 오버로딩

다음 글에서는 자바의 중요한 문법 개념인
메서드 오버로딩(Method Overloading) 에 대해 다룹니다.
같은 이름의 메서드를 다양한 입력 방식으로 처리하는 방법을 함께 배워보세요!


🔙 이전 글 다시 보기

배열(Array)에 대해서 궁금하다면??

2025.05.02 - [Java] - 🧱 Array(배열)에 대한 이해

 

🧱 Array(배열)에 대한 이해

💬 시작하며이번 글에서는 자바의 기본 자료구조 중 가장 핵심인배열(Array) 에 대해 자세히 배워봅니다.지난 글에서는 static 키워드를 통해 클래스 수준의 공유 데이터를 다뤘다면,이번에는 다

seohong.tistory.com