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

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

by prometedor 2023. 6. 12.

Eclipse 에서 getter/setter 쉽게 추가

ㄴ 워크스페이스에서 item.java 를 열고 우클릭 > Source > Generate Getters and Setters... 선택

ㄴ Select All 선택 > [Generate] 선택

 

getter/setter 추가

ㄴ getter/setter 는 인스턴스 필드의 값을 설정하고 꺼내는 메서드

ㄴ 보통 외부에서 직접 필드에 접근하는 것을 막았을 때 사용

 

Item.java

package bitcamp.report.vo;

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

  public int getNo() {
    return no;
  }

  public void setNo(int no) {
    this.no = no;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getPrice() {
    return price;
  }

  public void setPrice(int price) {
    this.price = price;
  }

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }


}

ㄴ no, name, price, type 을 private 으로 접근 제한을 해줌

    => 인스턴스 필드는 각각 개별적으로 유지해야 하는 값을 저장할 때 사용함

    => new 명령을 통해 변수를 Heap 영역에 생성

ㄴ 각각의 getter/setter 추가

 

getter/setter 적용

ItemHandler.java

package bitcamp.report.handler;

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.setName(Prompt.inputString("물품 이름? "));
    item.setPrice(Prompt.inputInt("물품 가격? "));
    item.setType(inputType("0"));

    item.setNo(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.getNo(), item.getName(), item.getPrice(),
          item.getType());
    }
  }

  public static void viewItem() {
    String itemNo = Prompt.inputString("물품 번호? ");
    for (int i = 0; i < length; i++) {
      Item item = items[i];
      if (item.getNo() == Integer.parseInt(itemNo)) {
        System.out.printf("물품 이름: %s\n", item.getName());
        System.out.printf("물품 가격: %s\n", item.getPrice());
        System.out.printf("물품 종류: %s\n", item.getType());
        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.getNo() == Integer.parseInt(itemNo)) {
        System.out.printf("물품 이름(%s)? ", item.getName());
        item.setName(Prompt.inputString(""));
        System.out.printf("물품 가격(%s)? ", item.getPrice());
        item.setPrice(Prompt.inputInt(""));
        item.setType(inputType(item.getType()));
        return;
      }
    }
    System.out.println("해당 번호의 물품이 없습니다!");
  }

  private static String inputType(String type) {
    String label;
    if (type == "0") {
      label = "물품 종류?\n";
    } else {
      label = String.format("물품 종류(%s)?\n", type);
    }
    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.getNo() == itemNo) {
        return i;
      }
    }
    return -1;
  }

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

 

리팩토링

모든 인스턴스가 공유하는 값은 스태틱 필드에 보관

ㄴ static int itemId = 1; 코드를 Item.java 로 이동시킴

ㄴ static int itemId = 1; 코드를 Item.java 로 이동시킨 후 private 붙여줌

=> 모든 인스턴스가 공유하는 값은 스태틱 필드에 보관

 

생성자 추가

ㄴ 생성자에 no 를 itemId++ 하는 기능을 추가해줌

 

ㄴ item.setNo(itemId++); 코드는 item.java 의 생성자에서 기능을 해주기 때문에 제거

 

GRASP 패턴 : Information Expert

ㄴ 상수는 스태틱 필드로 정의

ㄴ 정보를 다룰 때는 그 정보를 갖고 있는 클래스에 그 기능을 둠

ㄴ 필드도 마찬가지

ㄴ 해당 코드 Item.java 로 이동

 

ㄴ Item.java 로 이동시킨 코드에 모두 public 을 붙여줌

 

ㄴ itemHandler.java 에서 해당 필드 값 앞에 클래스 이름을 적어줌

ex) return Food  => return Item.FOOD;

 

 

수정 결과

ItemHandler.java

package bitcamp.report.handler;

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 length = 0;

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

    Item item = new Item();
    item.setName(Prompt.inputString("물품 이름? "));
    item.setPrice(Prompt.inputInt("물품 가격? "));
    item.setType(inputType("0"));

    // 위에서 만든 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.getNo(), item.getName(), item.getPrice(),
          item.getType());
    }
  }

  public static void viewItem() {
    String itemNo = Prompt.inputString("물품 번호? ");
    for (int i = 0; i < length; i++) {
      Item item = items[i];
      if (item.getNo() == Integer.parseInt(itemNo)) {
        System.out.printf("물품 이름: %s\n", item.getName());
        System.out.printf("물품 가격: %s\n", item.getPrice());
        System.out.printf("물품 종류: %s\n", item.getType());
        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.getNo() == Integer.parseInt(itemNo)) {
        System.out.printf("물품 이름(%s)? ", item.getName());
        item.setName(Prompt.inputString(""));
        System.out.printf("물품 가격(%s)? ", item.getPrice());
        item.setPrice(Prompt.inputInt(""));
        item.setType(inputType(item.getType()));
        return;
      }
    }
    System.out.println("해당 번호의 물품이 없습니다!");
  }

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

      switch (typeNo) {
        case "1":
          return Item.FOOD;
        case "2":
          return Item.HOUSEHOLD_SUPPLIES;
        case "3":
          return Item.CLOTHES;
        case "4":
          return Item.HOME_APPLIANCES;
        case "5":
          return Item.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.getNo() == itemNo) {
        return i;
      }
    }
    return -1;
  }

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

 

Item.java

package bitcamp.report.vo;

public class Item {
  private static int itemId = 1;

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

  private int no;
  private String name;
  private int price;
  private String type;

  public Item() {
    this.no = itemId++;
  }

  public int getNo() {
    return no;
  }

  public void setNo(int no) {
    this.no = no;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getPrice() {
    return price;
  }

  public void setPrice(int price) {
    this.price = price;
  }

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }


}