java

실습) 도서 관리 시스템

dalc3154 2025. 3. 6. 13:48

CRUD를 활용한 도서 관리 시스템 만들어보기

 

1.

// 시스템의 제품이 가져야 할 기본 속성과 메소드
abstract class Item {
	private final String id;
	private final String name;
	
	//Setter 역할 생성자
	public Item(String id, String name) {
		this.id = id;
		this.name = name;
	}
	
	//Getter
	public String getId() {
		return id;
	}
	public String getName() {
		return name;
	}
	
	public abstract void display(); // 추상 메소드
	
}

 

2.

public class Book extends Item{
	// id, name
	private String isbn;// 책 고유 번호(전 세계 통용)
	private String author;
	private String publisher;
	private int publishYear;
	private int price;
	private int stock;
	private String category;
	
	public Book(String id, String name, String isbn, String author, String publisher, 
			int publishYear, int price, int stock, String category) {
		super(id, name);
		this.isbn = isbn;
		this.author = author;
		this.publisher = publisher;
		this.publishYear = publishYear;
		this.price = price;
		this.stock = stock;
		this.category = category;
	}
	
	public String getIsbn(){
		return isbn;
	}
	public String getAuthor(){
		return author;
	}
	public String getPublisher(){
		return publisher;
	}
	public int getPublishYear(){
		return publishYear;
	}
	public int getPrice(){
		return price;
	}
	public int getStock(){
		return stock;
	}
	public String getCategory(){
		return category;
	}
	
	public void updateStock(int quantity) {
		this.stock += quantity;
	}
	
	@Override
	public void display() {
		System.out.println("ID: " + getId() + ", Name: " + getName() + ", ISBN: " + isbn);
	}
}

 

3.

import java.util.List;

// 재고 관리 시스템에서 관리할 수 있는 동작 정의
public interface Manageable {
	void add(Item item);
	void remove(String id);
	List<Item> search(String keyword);
	List<Item> searchByCategory(String category);
	List<Item> searchByPriceRange(int minPrice, int maxPrice);
	void updateStock(String id, int quantity);
	void listAll();
}

 

4.

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

public class LibraryManager implements Manageable{
	private List<Item> items = new ArrayList<>();
	
	@Override
	public void add(Item item) {
		items.add(item);
		System.out.println("Item added: " + item.getName());
	}

	@Override
	public void remove(String id) {
		boolean removed = false;// 삭제 여부 확인용 데이터
		
		int size = items.size();
		
		for (int i = 0; i < size; i++) {
			// 전체 items를 순회
			// 각 순번의 item의 id와 매개변수의 id가 일치한다면 해당 인덱스의 요소를 제거
			if (items.get(i).getId().equals(id)) {
				items.remove(i);
				removed = true;
				System.out.println("Item with ID: " + id + "removed");
				break;
			}
		}
		if(!removed) {
			// 제거되지 않은 경우
			System.out.println("No item found with ID: " + id);
		}
	}

	@Override
	public List<Item> search(String keyword) {
		// 전체 리스트의 요소에서 키워드 검색
		// name, author, publisher 통합 검색
		List<Item> foundItems = new ArrayList<>();
		
		for (Item item: items) {
			if (item.getName().contains(keyword)
					|| (item instanceof Book && ((Book)item).getAuthor().contains(keyword) 
							||  ((Book)item).getPublisher().contains(keyword))
			) {
				foundItems.add(item);
			}
		}
		if (foundItems.isEmpty()) {
			// 예외를 던질 경우 해당 메소드가 종료
			throw new NoSuchElementException("No item found for keyword: " + keyword);
		}
		return foundItems;
	}

	@Override
	public List<Item> searchByCategory(String category) {
		List<Item> result = new ArrayList<>();
		
		for (Item item: items) {
			if (item instanceof Book && ((Book)item).getCategory().equalsIgnoreCase(category)) {
				// equalsIgnoreCase: 대소문자를 구분하지 않고 데이터의 값을 비교
				// 영어만 사용 가능
				result.add(item);
			}
		}
		return result;
	}

	@Override
	public List<Item> searchByPriceRange(int minPrice, int maxPrice) {
		List<Item> result = new ArrayList<>();
		
		for (Item item: items) {
			if (item instanceof Book) {
				int price = ((Book)item).getPrice();
				
				if (price >= minPrice && price <= maxPrice) {
					result.add(item);
				}
			}
		}
		return result;
	}

	@Override
	public void updateStock(String id, int quantity) {
		for (Item item: items) {
			if (item.getId().equals(id) && item instanceof Book) {
				((Book)item).updateStock(quantity);
				System.out.println("Stock updated for ID: " + id + ", Stock: " + ((Book)item).getStock());
				return; // 메소드를 종료하는 키워드
			}
		}
		System.out.println("No item found with ID: " + id);
	}
	
	@Override
	public void listAll() {
		if (items.isEmpty()) {
			System.out.println("No items in the library");
		} else {
			System.out.println("Library Items");
			for (Item item: items) {
				item.display();
			}
		}
	}
}

 

5.

import java.util.List;
import java.util.NoSuchElementException;
import java.util.Scanner;

// Inventory: 재고 관리

public class InventorySystem {
	public static void main(String[] args) {
		LibraryManager manager = new LibraryManager();// 도서 관리 시스템을 인스턴스화
		Scanner sc = new Scanner(System.in);
		
		while (true) {
			System.out.println("InventorySystem");
			// CRUD(크루드)
			// 저장된 데이터에 대해 작업할 수는 있는 기본 데이터 처리 기능
			System.out.println("1. Add Book"); // 생성(추가) create
			System.out.println("2. List All Book"); // 조회 read
			System.out.println("3. Search Book");
			System.out.println("4. Search by Category");
			System.out.println("5. Search by Price Range");
			System.out.println("6. Update Stock"); // 수정 update
			System.out.println("7. Remove Book"); // 삭제 delete
			System.out.println("8. Exit");
			
			try {
				//sc.nextLine()) >> 입력값이 문자열로 인식
				int choice = Integer.parseInt(sc.nextLine());// 정수로 변환
				// 숫자 형태로 변경할 수 없는 값이 입력되면 NumberFormatException 예외 발생
				
				switch (choice) {
				case 1:
					System.out.println("Enter Book ID");
					String id = sc.nextLine();
					System.out.println("Enter Book Title");
					String title = sc.nextLine();
					System.out.println("Enter Book ISBN");
					String isbn = sc.nextLine();
					System.out.println("Enter Book Author");
					String author = sc.nextLine();
					System.out.println("Enter Book Publisher");
					String publisher = sc.nextLine();
					
					System.out.println("Enter Book Publish Year");
					int year = Integer.parseInt(sc.nextLine());
					System.out.println("Enter Book Price");
					int price = Integer.parseInt(sc.nextLine());
					System.out.println("Enter Book Quantity");
					int stock = Integer.parseInt(sc.nextLine());
					
					System.out.println("Enter Book Category");
					String category = sc.nextLine();
					
					manager.add(new Book(id, title, isbn, author, publisher, year, price, stock, category));
					break;
				case 2:
					manager.listAll();
					break;
				case 3:
					System.out.println("Emter Search Keyword");
					String keyword = sc.nextLine();
					List<Item> searchResults = manager.search(keyword);
					if (searchResults.isEmpty()) {
						System.out.println("No items found in keyword: " + keyword);
					} else {
						for (Item item : searchResults) {
							item.display();
						}
					}
					break;
				case 4:
					System.out.println("Enter Category: ");
					String searchCategory = sc.nextLine();
					List<Item> categoryResults = manager.searchByCategory(searchCategory);
					if (categoryResults.isEmpty()) {
						System.out.println("No items found in category: " + searchCategory);
					} else {
						for (Item item: categoryResults) {
							item.display();
						}
					}
					break;
				case 5:
					System.out.println("Enter minimum price:");
					int minPrice = Integer.parseInt(sc.nextLine());
					System.out.println("Enter maximum price:");
					int maxPrice = Integer.parseInt(sc.nextLine());
					
					List<Item> priceResults = manager.searchByPriceRange(minPrice, maxPrice);
					if (priceResults.isEmpty()) {
						System.out.println("No items in price range");
					} else {
						for (Item item: priceResults) {
							item.display();
						}
					}
					break;
				case 6:
					System.out.println("Enter Book ID to update stock");
					String updateId = sc.nextLine();
					System.out.println("Enter Quantity to add/subtract");
					int quantity = Integer.parseInt(sc.nextLine());
					
					manager.updateStock(updateId, quantity);
					break;
				case 7:
					System.out.println("Enter Book ID to remove: ");
					String removeId = sc.nextLine();
					manager.remove(removeId);
					break;
				case 8:
					System.out.println("If you want to exit. please enter 'Y'");
					if (sc.nextLine().equalsIgnoreCase("Y")) {
						System.out.println("Exit");
						sc.close();
						return;
					}
					System.out.println("Please try again");
					break;
				default:
					System.out.println("Invalid option. try again");
				}
			} catch (NumberFormatException e) {
				System.out.println("Please Enter a valid number");
			} catch (NoSuchElementException e) {
				// 검색된 내용이 없을 경우 실행
				System.out.println(e.getMessage());
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		}
	}
}

'java' 카테고리의 다른 글

40. 객체 지향 프로그래밍(OOP)  (0) 2025.03.06
실습) 재고 관리 시스템 만들기  (1) 2025.03.06
39. 컬렉션 프레임워크-Map  (0) 2025.03.06
38. 컬렉션 프레임워크-Set  (1) 2025.03.06
실습) 리스트 활용  (0) 2025.03.06