Inventory Management System
다양한 상품을 관리하는 재고 관리 시스템
프로젝트 구조
Main 파일: 프로그램 실행의 진입점
entity 폴더(데이터 모델 정의): 데이터(상품)를 표현하는 클래스 정의 - 객체의 속성과 동작을 포함
service 폴더(비즈니스 로직 처리): 상품 추가, 조회, 수정, 삭제와 같은 비즈니스로직을 처리(직접적인 데이터 조작)
repository 폴더(데이터 저장소 역할): 데이터를 저장하고 검색하는 기능을 제공하는 클래스 정의
요구사항
기능: 상품 추가, 수정, 삭제, 카테고리 상품 검색, 가격 또는 이름 등으로 정렬
사용 컬렉션 프레임워크
Set: 상품관리(중복 상품 방지)
Map: 카테고리별 상품 분류(키: 카테고리명, 값: 상품 목록)
추상 클래스: Item >> 모든 상품의 공통 필드 포함
인터페이스: Discountale > 할인 로직 제공
1.추상 클래스로 틀 만들기
public abstract class Item {
private String id;// 고유 식별자
private String name;// 상품명
private int price;// 상품 가격
private int quantity;// 상품 재고 수량
public Item(String id, String name, int price, int quantity) {
this.id = id;
this.name = name;
this.price = price;
this.quantity = quantity;
}
public String getId() { return id;}
public String getName() { return name;}
public int getPrice() { return price;}
public int getQuantity() { return quantity;}
public void setPrice(int price) {
this.price = price;
}
public void setQuantity(int quantity) {
this.price = quantity;
}
public abstract String getCategory();
@Override
public String toString() {
return "ID: " + id + ", Name: " + name + ", Price:" + price + ", Quantity: " + quantity;
}
}
2.추상 클래스를 구현하는 상품 두개 만들기
public class Electronics extends Item{
private String brand;// 브랜드
private int warranty;// 보증기간(개월)
public Electronics(String id, String name, int price, int quantity, String brand, int warranty) {
super(id, name, price, quantity);
this.brand = brand;
this.warranty = warranty;
}
public String getBrand() {
return brand;
}
public int getWarranty() {
return warranty;
}
@Override
public String getCategory() {
return "Electronics";
}
@Override
public String toString() {
// super: 부모 클래스의 인스턴스를 의미
return super.toString() + " // Brand: " + brand + ", Warranty: " + warranty + " months";
}
}
public class Furniture extends Item{
private String material; // 재질
private String size; // 크기
public Furniture(String id, String name, int price, int quantity, String material, String size) {
super(id, name, price, quantity);
this.material = material;
this.size = size;
}
public String getMaterial() {return material;}
public String getSize() {return size;}
@Override
public String getCategory() {
return "Furniture";
}
@Override
public String toString() {
return super.toString() + " // Material: " + material + ", Size: " + size;
}
}
3.인터페이스로 저장소 설정하기
import java.util.Set;
import chapter10.practice02.entity.Item;
public interface ItemRepository {
//Ctrl + shift + o: 자동 임포트
void addItem(Item item);
void removeItem(String itemId);
Item findById(String itemId);
Set<Item> findAll();
}
4. 인터페이스를 구현하여 저장소 활용하기
import java.util.HashSet;
import java.util.Set;
import chapter10.practice02.entity.Item;
// 데이터 처리에 대한 메소드: DB를 대신하는 저장소 역할
public class InMemoryItemRepository implements ItemRepository {
private Set<Item> items = new HashSet<Item>();
@Override
public void addItem(Item item) {
items.add(item);
}
@Override
public void removeItem(String itemId) {
Item target = null;
for(Item item: items) {
if (item.getId().equals(itemId)) {
target = item;// 제거하고자 하는 요소를 저장
break;
}
}
if(target != null) {
items.remove(target);
}
}
@Override
public Item findById(String itemId) {
for(Item item: items) {
if (item.getId().equals(itemId)) {
return item;
}
}
return null;
}
@Override
public Set<Item> findAll() {
return items;
}
}
5. 인터페이스를 활용하여 서비스 설정하기
import java.util.List;
import chapter10.practice02.entity.Item;
public interface InventoryService {
void addItem(Item item);
void updateItemPrice(String itemId, int newPrice);
void deleteItem(String itemId);
List<Item> getItemsByCategory(String catrgory);
}
6.인터페이스를 구현하여 서비스 활용하기
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import chapter10.practice02.entity.Item;
import chapter10.practice02.repository.ItemRepository;
public class InventoryServiceImpl implements InventoryService {
private final ItemRepository repository;
public InventoryServiceImpl(ItemRepository repository) {
this.repository = repository;
}
@Override
public void addItem(Item item) {
repository.addItem(item);
}
@Override
public void updateItemPrice(String itemId, int newPrice) {
// 수정할 Item이 저장소에 존재하는지 확인
Item item = repository.findById(itemId);
if (item != null) {
item.setPrice(newPrice);
}
}
@Override
public void deleteItem(String itemId) {
Item item = repository.findById(itemId);
if (item != null) {
repository.removeItem(itemId);
}
}
@Override
public List<Item> getItemsByCategory(String category) {
Set<Item> allItems = repository.findAll();
List<Item> categoryItems = new ArrayList<Item>();
for (Item item: allItems) {
if (item.getCategory().equalsIgnoreCase(category)) {
categoryItems.add(item);
}
}
return categoryItems;
}
}
7. 메인 함수를 만들어서 만들어둔 기능 활용
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import chapter10.practice02.entity.Electronics;
import chapter10.practice02.entity.Furniture;
import chapter10.practice02.entity.Item;
import chapter10.practice02.repository.InMemoryItemRepository;
import chapter10.practice02.service.InventoryService;
import chapter10.practice02.service.InventoryServiceImpl;
public class Main {
public static void main(String[] args) {
//ItemRepository repository = new InMemoryItemRepository();
//InventoryService inventoryService = new InventoryServiceImpl(repository);
InventoryService inventoryService = new InventoryServiceImpl(new InMemoryItemRepository());
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("");
System.out.println("Inventory Management System");
System.out.println("1. Add Item");
System.out.println("2. Update Item Price");
System.out.println("3. Delete Item");
System.out.println("4. Veiw Items by Category");
System.out.println("5. Veiw All Items");
System.out.println("6. Exit");
System.out.println("Choose an option: ");
try {
int choice = Integer.parseInt(sc.nextLine());
switch (choice) {
case 1:
addItem(inventoryService, sc);
break;
case 2:
updateItemPrice(inventoryService, sc);
break;
case 3:
deleteItem(inventoryService, sc);
break;
case 4:
viewItemsByCategory(inventoryService, sc);
break;
case 5:
viewAllItems(inventoryService);
break;
case 6:
sc.close();
return;
default:
System.out.println("Invalid choice, Please try again");
}
} catch (Exception e){
System.out.println(e.getMessage());
}
}
}
private static void addItem(InventoryService inventoryService, Scanner sc) {
System.out.println("Enter Item Id: ");
String id = sc.nextLine();
System.out.println("Enter Item Name");
String name = sc.nextLine();
System.out.println("Enter Item Price");
int price = sc.nextInt();
System.out.println("Enter Item Quantity");
int quantity = sc.nextInt();
sc.nextLine();// 버퍼 소비
System.out.println("Enter Item Category(Electronics/Furnitur)");
String category = sc.nextLine();
if (category.equalsIgnoreCase("Electronics")) {
System.out.println("Enter Brand: ");
String brand = sc.nextLine();
System.out.println("Enter Warranty(months): ");
int warranty = sc.nextInt();
sc.nextLine();
Item electronics = new Electronics(id, name, price, quantity, brand, warranty);
inventoryService.addItem(electronics);
} else if (category.equalsIgnoreCase("Furnitur")) {
System.out.println("Enter Material: ");
String material = sc.nextLine();
System.out.println("Enter Size: ");
String size = sc.nextLine();
Item furniture = new Furniture(id, name, price, quantity, material, size);
inventoryService.addItem(furniture);
} else {
System.out.println("Invalid category, Item not added");
}
}
private static void updateItemPrice(InventoryService inventoryService, Scanner sc) {
System.out.println("Enter Item ID to update Price");
String id = sc.nextLine();
System.out.println("Enter Item new Price");
int newPrice = sc.nextInt();
sc.nextLine();
inventoryService.updateItemPrice(id, newPrice);
System.out.println("Item price updated successfully");
}
private static void deleteItem(InventoryService inventoryService, Scanner sc) {
System.out.println("Enter Item ID to delete");
String id = sc.nextLine();
inventoryService.deleteItem(id);
System.out.println("Item deleteed succesfully");
}
private static void viewItemsByCategory(InventoryService inventoryService, Scanner sc) {
System.out.println("Enter Category to View (Electronics/Furnitur)");
String category = sc.nextLine();
List<Item> items = inventoryService.getItemsByCategory(category);
if (items.isEmpty()) {
System.out.println("No items found in this category");
} else {
System.out.println("Items in category: " + category + " >>> ");
for (Item item: items) {
System.out.println(item);
}
}
}
private static void viewAllItems(InventoryService inventoryService) {
List<Item> allItems = new ArrayList<Item>(inventoryService.getItemsByCategory("Electronics"));
// 컬렉션타입데이터A.addAll(컬렉션타입데이터B)
// A의 구조에 B의 데이터를 각각 요소로 삽입
// a = [1, 2, 3]
// b = [4, 5, 6]
// a.add(b): [1, 2, 3, [4, 5, 6]]
// a.addAll(b): [1, 2, 3, 4, 5, 6]
allItems.addAll(inventoryService.getItemsByCategory("Furniture"));
if (allItems.isEmpty()) {
System.out.println("No items available");
} else {
System.out.println("All Items");
for (Item item: allItems) {
System.out.println(item);
}
}
}
}
'java' 카테고리의 다른 글
실습) 객체 지향 프로그래밍 원칙을 활용한 주문 관리 시스템 (0) | 2025.03.06 |
---|---|
40. 객체 지향 프로그래밍(OOP) (0) | 2025.03.06 |
실습) 도서 관리 시스템 (0) | 2025.03.06 |
39. 컬렉션 프레임워크-Map (0) | 2025.03.06 |
38. 컬렉션 프레임워크-Set (1) | 2025.03.06 |