본문 바로가기
Java

[JAVA] 도서 대여 시스템으로 객체 지향 프로그래밍 (OOP) 개념 익히기

by teamnova 2025. 3. 12.
728x90

 

안녕하세요 이번 시간에는 Java의 객체지향 프로그래밍 (OOP, Object-Oriented Programming) 주요 개념인 클래스, 객체, 상속, 인터페이스를 적용하여 도서 대여 시스템을 구현한 예제를 작성해보겠습니다. 

 

 

1. 객체지향 개념 정리 

1.1 클래스(Class)란?

클래스는 객체를 생성하기 위한 설계도입니다. 클래스 내부에는 속성(변수)과 행동(메서드)이 정의되어 있으며, 이를 기반으로 여러 개의 객체를 만들 수 있습니다.

예를 들어, Book 클래스는 책의 제목과 저자를 저장하는 속성을 가지고 있고, 책을 대여하거나 반납하는 기능(메서드)을 제공합니다.

1.2 객체(Object)란?

객체는 클래스의 인스턴스로, 클래스의 구조를 실제 데이터와 함께 메모리에 생성한 것입니다. 즉, 클래스는 틀이고, 객체는 그 틀을 이용해 찍어낸 실체라고 생각하면 됩니다.

예제에서 Book book1 = new Book("자바의 정석", "남궁성"); 이렇게 선언하면, Book 클래스에서 정의한 구조를 가진 책 객체 book1이 생성됩니다.

1.3 상속(Inheritance)이란?

상속은 기존 클래스(부모 클래스)의 속성과 메서드를 자식 클래스가 물려받는 기능입니다. 이를 통해 코드의 재사용성을 높이고 유지보수를 쉽게 할 수 있습니다.

현재 예제에서는 상속을 직접 사용하지 않았지만, 확장할 경우 전자책(Ebook) 클래스를 만들어 Book 클래스를 상속받을 수 있습니다.

public class Ebook extends Book {
    private String downloadLink;

    public Ebook(String title, String author, String downloadLink) {
        super(title, author); // 부모 클래스(Book)의 생성자 호출
        this.downloadLink = downloadLink;
    }

    public String getDownloadLink() {
        return downloadLink;
    }
}

이렇게 하면 기존 Book 클래스의 기능을 그대로 유지하면서 전자책에 맞는 기능을 추가할 수 있습니다.

 

1.4 인터페이스(Interface)란?

인터페이스는 클래스가 특정 동작을 반드시 구현하도록 강제하는 역할을 합니다.

우리의 예제에서는 Borrowable 인터페이스를 정의하여 대여 가능한 아이템(책, DVD 등)에 공통으로 적용할 수 있도록 만들었습니다.

public interface Borrowable {
    void borrowItem(User user);
    void returnItem(User user);
    boolean isAvailable();
}

이 인터페이스를 구현한 Book 클래스는 Borrowable 인터페이스에 정의된 메서드를 반드시 구현해야 합니다.

public class Book implements Borrowable {
    @Override
    public void borrowItem(User user) {
        // 구현 내용
    }
    
    @Override
    public void returnItem(User user) {
        // 구현 내용
    }
}

이렇게 하면 Book뿐만 아니라 DVD 같은 다른 대여 가능한 항목도 동일한 구조로 만들 수 있어 유지보수성이 좋아집니다.

 

 

"도서관에서 책을 빌리기" 위해서는 책을 빌리는 사용자, 도서관, 책 이 필요합니다. 

각 요소들을 클래스로 만들어 관리하면 사용자가 들어나거나, 빌릴 수 있는 책이 늘어나더라도 쉽게 관리할 수 있게 되는데 이것이 바로 객체지향적인 프로그래밍입니다. 

 

 

전체 코드입니다. 

 

1. User.java (사용자 클래스) 

package org.example;

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

 

  • User 클래스는 사용자의 정보를 저장하는 역할을 합니다.
  • 각 사용자는 name 변수를 가지며, 이를 통해 이름을 설정하고 가져올 수 있습니다.

 

 

 

2. Book.java (책 클래스)

public class Book implements Borrowable {
    private String title;
    private String author;
    private boolean isBorrowed;
    private User borrowedBy;

    public Book(String title, String author) {
        this.title = title;
        this.author = author;
        this.isBorrowed = false;
    }

    public String getTitle() {
        return title;
    }

    public String getAuthor() {
        return author;
    }

    @Override
    public void borrowItem(User user) {
        if (!isBorrowed) {
            isBorrowed = true;
            borrowedBy = user;
            System.out.println(user.getName() + " 님이 책을 대여했습니다: " + title);
        } else {
            System.out.println("이미 대여된 책입니다: " + title);
        }
    }

    @Override
    public void returnItem(User user) {
        if (isBorrowed && borrowedBy.equals(user)) {
            isBorrowed = false;
            borrowedBy = null;
            System.out.println(user.getName() + " 님이 책을 반납했습니다: " + title);
        } else {
            System.out.println("반납할 수 없는 책입니다.");
        }
    }

    @Override
    public boolean isAvailable() {
        return !isBorrowed;
    }
}
  • Book 클래스는 도서 정보를 관리하고, Borrowable 인터페이스를 구현하여 대여 및 반납 기능을 포함합니다.
  • 각 책 객체는 제목, 저자 정보를 가지며, 대여 여부를 확인하는 isBorrowed 변수를 포함합니다.
  • borrowItem()returnItem() 메서드를 통해 사용자가 책을 대여하고 반납할 수 있습니다.

 

 

 

3. Borrowable.java (인터페이스 - 대여 기능 정의)

public interface Borrowable {
    void borrowItem(User user);
    void returnItem(User user);
    boolean isAvailable();
}
  • Borrowable 인터페이스는 대여 가능한 객체(예: 책, DVD 등)들이 구현해야 할 메서드를 정의합니다.
  • borrowItem(), returnItem(), isAvailable() 메서드를 강제하여, 이 인터페이스를 구현하는 클래스들이 동일한 기능을 가지도록 만듭니다.

 

 

 

4. Library.java (도서관 관리 시스템 - 책 목록 관리)

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

public class Library {
    private List<Book> books;

    public Library() {
        this.books = new ArrayList<>();
    }

    public void addBook(Book book) {
        books.add(book);
    }

    public void borrowBook(String title, User user) {
        for (Book book : books) {
            if (book.getTitle().equals(title)) {
                book.borrowItem(user);
                return;
            }
        }
        System.out.println("책을 찾을 수 없습니다: " + title);
    }

    public void returnBook(String title, User user) {
        for (Book book : books) {
            if (book.getTitle().equals(title)) {
                book.returnItem(user);
                return;
            }
        }
        System.out.println("반납할 책을 찾을 수 없습니다: " + title);
    }

    public void displayAvailableBooks() {
        System.out.println("=== 이용 가능한 책 목록 ===");
        for (Book book : books) {
            if (book.isAvailable()) {
                System.out.println("- " + book.getTitle() + " (" + book.getAuthor() + ")");
            }
        }
    }
}

 

  • Library 클래스는 도서관의 역할을 하며, 도서 목록을 관리하고, 책의 대여 및 반납을 처리합니다.
  • ArrayList<Book>을 사용하여 여러 책을 저장하고 관리할 수 있습니다.
  • addBook(), borrowBook(), returnBook() 메서드를 통해 도서를 추가하고 관리합니다.

 

 

 

5. LibrarySystem.java (메인 실행 파일 - 프로그램 실행)

public class LibrarySystem {
    public static void main(String[] args) {
        Library library = new Library();
        User user1 = new User("이은실");
        User user2 = new User("김철수");

        Book book1 = new Book("자바의 정석", "남궁성");
        Book book2 = new Book("이펙티브 자바", "조슈아 블로크");
        Book book3 = new Book("클린 코드", "로버트 C. 마틴");

        library.addBook(book1);
        library.addBook(book2);
        library.addBook(book3);

        library.displayAvailableBooks();

        library.borrowBook("자바의 정석", user1);
        library.borrowBook("이펙티브 자바", user2);
        library.borrowBook("자바의 정석", user2); // 이미 대여된 책

        library.displayAvailableBooks();

        library.returnBook("자바의 정석", user1);
        library.returnBook("자바의 정석", user2); // 잘못된 반납 시도
        
        library.displayAvailableBooks();
    }
}
  • LibrarySystem 클래스는 프로그램의 시작점 (main 메서드)이며, 도서관 시스템을 실행하는 역할을 합니다.
  • Library, User, Book 객체를 생성하고, 사용자가 책을 대여하고 반납하는 과정을 시뮬레이션합니다.

 

 

 

감사합니다.