본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 12일차 (2023-06-08) 자바 기초 DAY10_개인 프로젝트 - 마트 물품 관리 시스템

by prometedor 2023. 6. 8.

ㄴ 개인 프로젝트에 적용

    ㄴ MemberHandler => ItemHandler

    ㄴ Member => Item

 

 

개인 프로젝트 - 마트 물품 관리 시스템

Item 클래스 생성

ㄴ 이는 vo 라는 패키지를 만들어서 안에 넣는 것이 좋음

 

Item.java

public class Item {
  public int no; // no를 저장할 변수
  public String name; // name을 저장할 변수
  public String price; // price를 저장할 변수
  public String type; // type을 저장할 변수
}

ㄴ Item 클래스를 이용하여 변수선언 부분을 간단히 바꿀 수 있음

여기서 주의할 점은 변수 선언 시 public 으로 해줘야 다른 클래스에서 참조가 가능하다는 것임

 

ItemHandler 수정

변수 선언 부분 수정

ItemHandler.java

static final int MAX_SIZE = 100;
static int[] no = new int[MAX_SIZE];
static String[] name = new String[MAX_SIZE];
static String[] price = new String[MAX_SIZE];
static String[] type = new String[MAX_SIZE];
static int itemId = 1;
static int length = 0;

=> 변수 선언 부분을 아래와 같이 변경

static final int MAX_SIZE = 100;
static Item[] items = new Item[MAX_SIZE];
static int itemId = 1;
static int length = 0;

ㄴ static Item[] items = new Item[MAX_SIZE]; 코드 추가

 

inputItem() 메서드 수정

public static void inputItem() {
        if (!available()) {
            System.out.println("더이상 입력할 수 없습니다!");
            return;
        }

        name[length] = Prompt.inputString("물품 이름? ");
        price[length] = Prompt.inputString("물품 가격? ");
        // System.out.print("한정 판매(true/false)? ");
        // limited_Sale[i] = scanner.nextBoolean();
        type[length] = inputType("0");

        no[length] = itemId++;
        length++;
    }

=> 아래와 같이 변경

public static void inputItem() {
    if (!available()) {
        System.out.println("더이상 입력할 수 없습니다!");
        return;
    }

    Item item = new Item();
    item.name = Prompt.inputString("물품 이름? ");
    item.price = Prompt.inputString("물품 가격? ");
    item.type = inputType("0");

    item.no = itemId++;

    // 위에서 만든 Item 인스턴스의 주소를 잃어버리지 않게 레퍼런스 배열에 담기
    items[length++] = item;
}

ㄴ Item item = new Item(); 코드 추가

ㄴ name[length] => item.name

ㄴ price[length] => item.price

ㄴ type[length] => item.type

ㄴ no[length] => item.no

ㄴ length++; => items[length++] = item; // 위에서 만든 Item 인스턴스의 주소를 잃어버리지 않게 레퍼런스 배열(변수선언 부분에서 만든 items)에 담기

 

printItems() 메서드 수정

public static void printItems() {
    System.out.println("---------------------------------------------------------------------");
    System.out.println("물품 번호, 물품 이름, 물품 가격, 종류");
    System.out.println("---------------------------------------------------------------------");

    for (int i = 0; i < length; i++) {
        System.out.printf("%d, %s, %s, %s\n", no[i], name[i], price[i], type[i]);
    }
}

=> 아래와 같이 변경

public static void printItems() {
    System.out.println("---------------------------------------------------------------------");
    System.out.println("물품 번호, 물품 이름, 물품 가격, 종류");
    System.out.println("---------------------------------------------------------------------");

    for (int i = 0; i < length; i++) {
    	Item item = members[i];
        System.out.printf("%d, %s, %s, %s\n", 
          item.no, item.name, item.price, item.type);
    }
}

ㄴ Item item = Items[i]; 코드 추가

ㄴ no[i] =>  item.no

ㄴ name[i] =>  item.name

ㄴ price[i] =>  item.price

ㄴ type[i] =>  item.type

 

viewItem() 메서드 수정

public static void viewItem() {
    String itemNo = Prompt.inputString("물품 번호? ");
    for (int i = 0; i < length; i++) {
        if (no[i] == Integer.parseInt(itemNo)) {
            System.out.printf("물품 이름: %s\n", name[i]);
            System.out.printf("물품 가격: %s\n", price[i]);
            System.out.printf("물품 종류: %s\n", type[i]);
            return;
        }
    }
    System.out.println("해당 번호의 물품이 없습니다!");
}

=> 아래와 같이 변경

public static void viewItem() {
    String itemNo = Prompt.inputString("물품 번호? ");
    // 입력 받은 번호를 가지고 배열에서 해당 회원을 찾아야 함
    for (int i = 0; i < length; i++) {
        if (item.no == Integer.parseInt(itemNo)) {
        // i 번째 항목에 저장된 회원 정보 출력
        	Item item = items[i];
            System.out.printf("물품 이름: %s\n", item.name);
            System.out.printf("물품 가격: %s\n", item.price);
            System.out.printf("물품 종류: %s\n", item.type);
            return;
        }
    }
    System.out.println("해당 번호의 물품이 없습니다!");
}

ㄴ Item item = Items[i]; 코드 추가

ㄴ no[i] =>  item.no

ㄴ name[i] =>  item.name

ㄴ price[i] =>  item.price

ㄴ type[i] =>  item.type

 

updateItem() 메서드 수정

public static void updateItem() {
    String itemNo = Prompt.inputString("물품 번호? ");
    for (int i = 0; i < length; i++) {
        if (no[i] == Integer.parseInt(itemNo)) {
            System.out.printf("물품 이름(%s)? ", name[i]);
            name[i] = Prompt.inputString("");
            System.out.printf("물품 가격(%s)? ", price[i]);
            price[i] = Prompt.inputString("");
            type[i] = inputType(type[i]);
            return;
        }
    }
    System.out.println("해당 번호의 물품이 없습니다!");
}

=> 아래와 같이 수정

public static void updateItem() {
    String itemNo = Prompt.inputString("물품 번호? ");
    for (int i = 0; i < length; i++) {
    	Item item = items[i];
        if (item.no == Integer.parseInt(itemNo)) {
            System.out.printf("물품 이름(%s)? ", item.name);
            item.name = Prompt.inputString("");
            System.out.printf("물품 가격(%s)? ", item.price);
            item.price = Prompt.inputString("");
            item.type = inputType(item.type);
            return;
        }
    }
    System.out.println("해당 번호의 물품이 없습니다!");
}

ㄴ Item item = Items[i]; 코드 추가

ㄴ no[i] =>  item.no

ㄴ name[i] =>  item.name

ㄴ price[i] =>  item.price

ㄴ type[i] =>  item.type

 

deleteItem() 메서드 수정

public static void deleteItem() {
    // 삭제하려는 물품의 정보가 들어있는 인덱스 알아내기

    int itemNo = Integer.parseInt(Prompt.inputString("물품 번호? "));

    int deletedIndex = indexOf(itemNo);

    if (deletedIndex == -1) {
        System.out.println("해당 번호의 물품이 없습니다!");
        return;
    }

    // 만약 삭제하려는 항목이 마지막 인덱스의 항목이라면 마지막 인덱스의 값만 0으로 초기화 시키기
    // 그 밖에는 해당 인덱스부터 반복하면서 앞 인덱스의 값을 당겨오기
    for (int i = deletedIndex; i < length - 1; i++) {
        no[i] = no[i + 1];
        name[i] = name[i + 1];
        price[i] = price[i + 1];
        type[i] = type[i + 1];
    }

    // 배열의 맨 마지막 초기화
    no[length - 1] = 0;
    name[length - 1] = null;
    price[length - 1] = null;
    type[length - 1] = null;
    
    length--;

    System.out.println("삭제했습니다.");
    return;
}

=> 아래와 같이 수정

public static void deleteItem() {
    // 삭제하려는 물품의 정보가 들어있는 인덱스 알아내기

    int itemNo = Integer.parseInt(Prompt.inputString("물품 번호? "));

    int deletedIndex = indexOf(itemNo);

    if (deletedIndex == -1) {
        System.out.println("해당 번호의 물품이 없습니다!");
        return;
    }

    // 만약 삭제하려는 항목이 마지막 인덱스의 항목이라면 마지막 인덱스의 값만 0으로 초기화 시키기
    // 그 밖에는 해당 인덱스부터 반복하면서 앞 인덱스의 값을 당겨오기
    for (int i = deletedIndex; i < length - 1; i++) {
        items[i] = items[i + 1];
    }

    // 배열의 맨 마지막 초기화
    items[length - 1] = null;
    
    length--;

    System.out.println("삭제했습니다.");
    return;
}

ㄴ 여기서  items[length - 1 ] = null; length--; 는 하나로 만들 수 있음

=> items[--length] = null;

// 배열의 맨 마지막 초기화
items[length - 1] = null;
length--;

===========================

items[--length] = null;

 

IndexOf() 메서드 수정

private static int indexOf(int itemNo) {
    for (int i = 0; i < length; i++) {
        if (no[i] == itemNo) {
            return i;
        }
    }
    return -1;
}

=> 아래와 같이 수정

private static int indexOf(int itemNo) {
    for (int i = 0; i < length; i++) {
    	Item item = items[i];
        if (item.no == itemNo) {
            return i;
        }
    }
    return -1;
}

ㄴ Item items = items[i]; 코드 추가

ㄴ no[i] => item.no

 

총정리

App.java

import bitcamp.report.handler.itemHandler;
import bitcamp.util.Prompt;

public class App {

    public static void main(String[] args) {

        printTitle();

        printMenu();

        while (true) {
            String menuNo = Prompt.inputString("메인> ");
            if (menuNo.equals("6")) {
                break;
            } else if (menuNo.equals("menu")) {
                printMenu();
            } else if (menuNo.equals("1")) {
                itemHandler.inputItem();
            } else if (menuNo.equals("2")) {
                itemHandler.printItems();
            } else if (menuNo.equals("3")) {
                itemHandler.viewItem();
            } else if (menuNo.equals("4")) {
                itemHandler.updateItem();
            } else if (menuNo.equals("5")) {
                itemHandler.deleteItem();
            } else {
                System.out.println(menuNo);
            }
        }

        Prompt.close();
    }

    static void printMenu() {
        System.out.println("1. 물품 등록");
        System.out.println("2. 물품 목록");
        System.out.println("3. 물품 조회");
        System.out.println("4. 물품 변경");
        System.out.println("5. 물품 삭제");
        System.out.println("6. 종료");
    }

    static void printTitle() {
        System.out.println("마트 물품 관리 시스템");
        System.out.println("---------------------------------------------------------------------");
    }
}

 

Item.java

public class Item {
  public int no;
  public String name;
  public String price;
  public String type;
}

 

ItemHandler.java

import bitcamp.report.vo.Item;
import bitcamp.util.Prompt;

public class itemHandler {

    static final int MAX_SIZE = 100;
    static Item[] items = new Item[MAX_SIZE];
    static int itemId = 1;
    static int length = 0;

    static final String FOOD = "식료품";
    static final String HOUSEHOLD_SUPPLIES = "생활용품";
    static final String CLOTHES = "의류";
    static final String HOME_APPLIANCES = "가전제품";
    static final String LIVING = "리빙";

    public static void inputItem() {
        if (!available()) {
            System.out.println("더이상 입력할 수 없습니다!");
            return;
        }

        Item item = new Item();
        item.name = Prompt.inputString("물품 이름? ");
        item.price = Prompt.inputString("물품 가격? ");
        item.type = inputType("0");

        item.no = itemId++;

        // 위에서 만든 Item 인스턴스의 주소를 잃어버리지 않게 레퍼런스 배열에 담기
        items[length++] = item;
    }

    public static void printItems() {
        System.out.println("---------------------------------------------------------------------");
        System.out.println("물품 번호, 물품 이름, 물품 가격, 종류");
        System.out.println("---------------------------------------------------------------------");

        for (int i = 0; i < length; i++) {
            Item item = items[i];
            System.out.printf("%d, %s, %s, %s\n",
                    item.no, item.name, item.price, item.type);
        }
    }

    public static void viewItem() {
        String itemNo = Prompt.inputString("물품 번호? ");
        for (int i = 0; i < length; i++) {
            Item item = items[i];
            if (item.no == Integer.parseInt(itemNo)) {
                System.out.printf("물품 이름: %s\n", item.name);
                System.out.printf("물품 가격: %s\n", item.price);
                System.out.printf("물품 종류: %s\n", item.type);
                return;
            }
        }
        System.out.println("해당 번호의 물품이 없습니다!");
    }

    public static void updateItem() {
        String itemNo = Prompt.inputString("물품 번호? ");
        for (int i = 0; i < length; i++) {
            Item item = items[i];
            if (item.no == Integer.parseInt(itemNo)) {
                System.out.printf("물품 이름(%s)? ", item.name);
                item.name = Prompt.inputString("");
                System.out.printf("물품 가격(%s)? ", item.price);
                item.price = Prompt.inputString("");
                item.type = inputType(item.type);
                return;
            }
        }
        System.out.println("해당 번호의 물품이 없습니다!");
    }

    private static String inputType(String type) {
        String label;
        if (type == "0") {
            label = "물품 종류?\n";
        } else {
            label = String.format("물품 종류(%s)?\n", type);
        }
        loop: while (true) {
            String typeNo = Prompt.inputString(label +
                    "  1. 식료품\n" +
                    "  2. 생활용품\n" +
                    "  3. 의류\n" +
                    "  4. 가전제품\n" +
                    "  5. 리빙\n" +
                    "> ");

            switch (typeNo) {
                case "1":
                    return FOOD;
                case "2":
                    return HOUSEHOLD_SUPPLIES;
                case "3":
                    return CLOTHES;
                case "4":
                    return HOME_APPLIANCES;
                case "5":
                    return LIVING;
                default:
                    System.out.println("무효한 번호입니다.");
            }
        }
    }

    public static void deleteItem() {
        // 삭제하려는 물품의 정보가 들어있는 인덱스 알아내기

        int itemNo = Integer.parseInt(Prompt.inputString("물품 번호? "));

        int deletedIndex = indexOf(itemNo);

        if (deletedIndex == -1) {
            System.out.println("해당 번호의 물품이 없습니다!");
            return;
        }

        // 만약 삭제하려는 항목이 마지막 인덱스의 항목이라면 마지막 인덱스의 값만 0으로 초기화 시키기
        // 그 밖에는 해당 인덱스부터 반복하면서 앞 인덱스의 값을 당겨오기
        for (int i = deletedIndex; i < length - 1; i++) {
            items[i] = items[i + 1];
        }

        // 배열의 맨 마지막 초기화
        items[length - 1] = null;

        length--;

        System.out.println("삭제했습니다.");
        return;
    }

    private static int indexOf(int itemNo) {
        for (int i = 0; i < length; i++) {
            Item item = items[i];
            if (item.no == itemNo) {
                return i;
            }
        }
        return -1;
    }

    public static boolean available() {
        return length < MAX_SIZE;
    }
}

 

Prompt.java

import java.util.Scanner;

public class Prompt {

  static Scanner scanner = new Scanner(System.in);

  public static String inputString(String title) {
    System.out.print(title);
    return scanner.nextLine();
  }

  public static int inputInt(String title) {
    // System.out.print(title);
    // return scanner.nextLine();
    return Integer.parseInt(inputString(title));
  }

  public static void close() {
    scanner.close();
  }

}