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 |