
안녕하세요! 오늘은 비즈니스의 핵심 중 하나인 재고 관리를 프로그래밍으로 구현해보는 시간을 갖겠습니다. 거창한 그래픽 인터페이스(GUI) 없이, 자바(Java)의 기본 문법만으로 텍스트 기반의 콘솔 재고관리 프로그램을 만들면서 객체 지향 프로그래밍의 즐거움을 느껴보는 것이 목표입니다.
이 가이드를 따라오시면, 상품(Item)이라는 객체를 만들고 ArrayList를 활용해 여러 상품을 관리하며, CRUD(Create, Read, Update, Delete)라는 데이터 처리의 기본 기능을 완벽하게 마스터할 수 있습니다. 그럼, 지금부터 코드로 우리만의 창고를 만들어볼까요? 💻
1. 프로그램 기획: 핵심 기능 정의
가장 먼저, 우리 프로그램이 어떤 기능을 가져야 할지 설계해야 합니다.
- 데이터 모델: 관리할 상품(Item)은 상품 ID, 상품명, 수량, 가격 이라는 속성을 가집니다.
- 핵심 기능 (CRUD):
- C (Create): 새로운 상품을 창고에 추가하는 기능
- R (Read): 창고에 있는 모든 상품 목록을 조회하는 기능
- U (Update): 기존 상품의 수량을 변경(입고/출고)하는 기능
- D (Delete): 특정 상품을 목록에서 삭제하는 기능
2. 코드 구현: 단계별로 따라하기
이제 자바 코드로 직접 구현해 보겠습니다. Item.java와 InventoryManager.java 두 개의 파일로 나누어 객체와 관리 로직을 분리하겠습니다.
1단계: 상품(Item) 클래스 만들기
먼저 상품의 설계도인 Item 클래스를 정의합니다. 상품의 속성(ID, 이름, 수량, 가격)을 변수로 선언하고, 이들을 초기화하는 생성자와 정보를 쉽게 출력하기 위한 toString() 메서드를 만듭니다.
Item.java
public class Item {
private int id;
private String name;
private int quantity;
private double price;
// 생성자: 객체를 만들 때 속성 값을 초기화
public Item(int id, String name, int quantity, double price) {
this.id = id;
this.name = name;
this.quantity = quantity;
this.price = price;
}
// 각 속성 값을 외부에서 읽을 수 있도록 하는 Getter 메서드들
public int getId() { return id; }
public String getName() { return name; }
public int getQuantity() { return quantity; }
public double getPrice() { return price; }
// 수량을 변경하는 Setter 메서드
public void setQuantity(int quantity) {
this.quantity = quantity;
}
// 객체 정보를 예쁘게 출력하기 위한 toString() 오버라이드
@Override
public String toString() {
return "상품 ID: " + id + ", 상품명: '" + name + "', 수량: " + quantity + ", 가격: " + price;
}
}
2단계: 재고 관리자(InventoryManager) 클래스 만들기
이제 실제 프로그램의 로직을 담당할 메인 클래스를 만듭니다. ArrayList를 사용해 Item 객체들을 담을 창고(inventory)를 만들고, Scanner로 사용자 입력을 받아 각 기능을 수행하도록 구현합니다.
InventoryManager.java
import java.util.ArrayList;
import java.util.Scanner;
public class InventoryManager {
public static void main(String[] args) {
ArrayList<Item> inventory = new ArrayList<>(); // Item 객체를 저장할 ArrayList
Scanner scanner = new Scanner(System.in);
int nextId = 1; // 자동으로 증가할 상품 ID
while (true) {
System.out.println("\n===== 재고 관리 시스템 =====");
System.out.println("1. 상품 추가");
System.out.println("2. 재고 조회");
System.out.println("3. 수량 변경");
System.out.println("4. 상품 삭제");
System.out.println("5. 종료");
System.out.print("원하는 메뉴를 선택하세요 >> ");
int choice = scanner.nextInt();
scanner.nextLine(); // nextInt() 후의 엔터 키 입력을 처리
switch (choice) {
case 1:
// C: 상품 추가
System.out.print("상품명: ");
String name = scanner.nextLine();
System.out.print("수량: ");
int quantity = scanner.nextInt();
System.out.print("가격: ");
double price = scanner.nextDouble();
inventory.add(new Item(nextId++, name, quantity, price));
System.out.println("상품이 성공적으로 추가되었습니다.");
break;
case 2:
// R: 재고 조회
System.out.println("\n--- 전체 재고 목록 ---");
if (inventory.isEmpty()) {
System.out.println("재고가 비어있습니다.");
} else {
for (Item item : inventory) {
System.out.println(item);
}
}
System.out.println("--------------------");
break;
case 3:
// U: 수량 변경
System.out.print("수량을 변경할 상품의 ID를 입력하세요: ");
int updateId = scanner.nextInt();
Item itemToUpdate = null;
for (Item item : inventory) {
if (item.getId() == updateId) {
itemToUpdate = item;
break;
}
}
if (itemToUpdate != null) {
System.out.print("새로운 수량을 입력하세요: ");
int newQuantity = scanner.nextInt();
itemToUpdate.setQuantity(newQuantity);
System.out.println("수량이 성공적으로 변경되었습니다.");
} else {
System.out.println("해당 ID의 상품을 찾을 수 없습니다.");
}
break;
case 4:
// D: 상품 삭제
System.out.print("삭제할 상품의 ID를 입력하세요: ");
int deleteId = scanner.nextInt();
Item itemToRemove = null;
for (Item item : inventory) {
if (item.getId() == deleteId) {
itemToRemove = item;
break;
}
}
if (itemToRemove != null) {
inventory.remove(itemToRemove);
System.out.println("상품이 성공적으로 삭제되었습니다.");
} else {
System.out.println("해당 ID의 상품을 찾을 수 없습니다.");
}
break;
case 5:
System.out.println("프로그램을 종료합니다.");
scanner.close(); // Scanner 자원 해제
return; // 프로그램 종료
default:
System.out.println("잘못된 메뉴 선택입니다. 다시 시도해주세요.");
}
}
}
}
- ArrayList<Item> inventory: Item 타입의 객체만 담을 수 있는 동적 배열(리스트)입니다. 재고 목록 역할을 합니다.
- while(true): 사용자가 '종료'를 선택하기 전까지 계속해서 메뉴를 보여주는 무한 루프입니다.
- 향상된 for문 (for (Item item : inventory)): 리스트를 순회하며 상품을 찾거나 출력할 때 코드를 간결하게 만들어 줍니다.
3. 실행 방법 및 결과
- Item.java와 InventoryManager.java 두 개의 파일을 같은 폴더에 저장합니다.
- 터미널(명령 프롬프트)을 열고 해당 폴더로 이동합니다.
- javac *.java 명령어로 모든 자바 파일을 한 번에 컴파일합니다.
- java InventoryManager 명령어로 프로그램을 실행하고 메뉴에 따라 기능을 테스트합니다.
실행 결과 예시
===== 재고 관리 시스템 =====
1. 상품 추가
2. 재고 조회
3. 수량 변경
4. 상품 삭제
5. 종료
원하는 메뉴를 선택하세요 >> 1
상품명: 콜라
수량: 100
가격: 1500
상품이 성공적으로 추가되었습니다.
===== 재고 관리 시스템 =====
1. 상품 추가
...
원하는 메뉴를 선택하세요 >> 2
--- 전체 재고 목록 ---
상품 ID: 1, 상품명: '콜라', 수량: 100, 가격: 1500.0
--------------------
이 간단한 콘솔 프로그램을 시작으로 파일 입출력을 연동해 데이터를 영구적으로 저장하거나, 검색 기능을 추가하고, 나아가 데이터베이스와 연결하는 등 무궁무진하게 확장할 수 있습니다. 오늘 만든 이 코드가 여러분의 멋진 애플리케이션 개발 여정의 튼튼한 첫걸음이 되기를 바랍니다!