─━ IT ━─

재고관리의 시작, 자바 콘솔 프로그램으로 정복하기!

DKel 2025. 10. 19. 09:27
반응형

안녕하세요! 오늘은 비즈니스의 핵심 중 하나인 재고 관리를 프로그래밍으로 구현해보는 시간을 갖겠습니다. 거창한 그래픽 인터페이스(GUI) 없이, 자바(Java)의 기본 문법만으로 텍스트 기반의 콘솔 재고관리 프로그램을 만들면서 객체 지향 프로그래밍의 즐거움을 느껴보는 것이 목표입니다.

이 가이드를 따라오시면, 상품(Item)이라는 객체를 만들고 ArrayList를 활용해 여러 상품을 관리하며, CRUD(Create, Read, Update, Delete)라는 데이터 처리의 기본 기능을 완벽하게 마스터할 수 있습니다. 그럼, 지금부터 코드로 우리만의 창고를 만들어볼까요? 💻


1. 프로그램 기획: 핵심 기능 정의

가장 먼저, 우리 프로그램이 어떤 기능을 가져야 할지 설계해야 합니다.

  • 데이터 모델: 관리할 상품(Item)은 상품 ID, 상품명, 수량, 가격 이라는 속성을 가집니다.
  • 핵심 기능 (CRUD):
    1. C (Create): 새로운 상품을 창고에 추가하는 기능
    2. R (Read): 창고에 있는 모든 상품 목록을 조회하는 기능
    3. U (Update): 기존 상품의 수량을 변경(입고/출고)하는 기능
    4. 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. 실행 방법 및 결과

  1. Item.java와 InventoryManager.java 두 개의 파일을 같은 폴더에 저장합니다.
  2. 터미널(명령 프롬프트)을 열고 해당 폴더로 이동합니다.
  3. javac *.java 명령어로 모든 자바 파일을 한 번에 컴파일합니다.
  4. java InventoryManager 명령어로 프로그램을 실행하고 메뉴에 따라 기능을 테스트합니다.

실행 결과 예시

===== 재고 관리 시스템 =====
1. 상품 추가
2. 재고 조회
3. 수량 변경
4. 상품 삭제
5. 종료
원하는 메뉴를 선택하세요 >> 1
상품명: 콜라
수량: 100
가격: 1500
상품이 성공적으로 추가되었습니다.

===== 재고 관리 시스템 =====
1. 상품 추가
...
원하는 메뉴를 선택하세요 >> 2

--- 전체 재고 목록 ---
상품 ID: 1, 상품명: '콜라', 수량: 100, 가격: 1500.0
--------------------

이 간단한 콘솔 프로그램을 시작으로 파일 입출력을 연동해 데이터를 영구적으로 저장하거나, 검색 기능을 추가하고, 나아가 데이터베이스와 연결하는 등 무궁무진하게 확장할 수 있습니다. 오늘 만든 이 코드가 여러분의 멋진 애플리케이션 개발 여정의 튼튼한 첫걸음이 되기를 바랍니다!

반응형