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

JAVA 16일차 (2023-06-14) 자바 기초 DAY14_인스턴스 필드와 인스턴스 메서드, 생성자와 의존 객체 주입_개인 프로젝트 - 마트 관리 시스템

by prometedor 2023. 6. 14.

ㄴ 해당 내용을 개인 프로젝트에 적용

 

인스턴스 필드와 인스턴스 메서드, 생성자와 의존 객체 주입

만들었던 BoardHandler2.java 삭제 후 시작

 

BoardHandler 클래스에 인스턴스 필드 및 메서드 적용

ㄴ 스태틱 필드를 인스턴스 필드로 만들기

=>

ㄴ MAX_SIZE 를 private 으로 해주는 이유는 해당 필드는 BoardHandler 클래스 안에서만 사용하기 때문

 

ㄴ 인스턴스 멤버(필드나 메서드)를 사용하는 경우 인스턴스 메서드로 정의해야 하므로 static 제거 및 this 이용

 

 

MemberHandler, itemHandler 클래스에 인스턴스 필드와 인스턴스 메서드를 적용

MemberHandler.java

package bitcamp.report.handler;

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

public class MemberHandler {

  private static final int MAX_SIZE = 100;
  private Member[] members = new Member[MAX_SIZE];
  private int length = 0;

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

    Member m = new Member();
    m.setName(Prompt.inputString("이름? "));
    m.setPhone(Prompt.inputString("전화번호? "));
    m.setPassword(Prompt.inputString("암호? "));
    m.setPosition(inputPosition((char) 0));

    // 위에서 만든 Member 인스턴스의 주소를 잃어버리지 않게
    // 레퍼런스 배열에 담는다.
    members[this.length++] = m;
  }

  public void printMembers() {
    System.out.println("---------------------------------------");
    System.out.println("번호, 이름, 전화번호, 직책");
    System.out.println("---------------------------------------");

    for (int i = 0; i < this.length; i++) {
      Member m = this.members[i];
      System.out.printf("%d, %s, %s, %s\n",
          m.getNo(), m.getName(), m.getPhone(),
          toPositionString(m.getPosition()));
    }
  }

  public void viewMember() {
    String memberNo = Prompt.inputString("번호? ");
    for (int i = 0; i < this.length; i++) {
      Member m = this.members[i];
      if (m.getNo() == Integer.parseInt(memberNo)) {
        System.out.printf("이름: %s\n", m.getName());
        System.out.printf("전화번호: %s\n", m.getPhone());
        System.out.printf("직책: %s\n", toPositionString(m.getPosition()));
        return;
      }
    }
    System.out.println("해당 번호의 직원이 없습니다!");
  }

  public static String toPositionString(char position) {
    return position == '0' ? "관리자" : "일반직원";
  }

  public void updateMember() {
    String memberNo = Prompt.inputString("번호? ");
    for (int i = 0; i < this.length; i++) {
      Member m = this.members[i];
      if (m.getNo() == Integer.parseInt(memberNo)) {
        System.out.printf("이름(%s)? ", m.getName());
        m.setName(Prompt.inputString(""));
        System.out.printf("전화번호(%s)? ", m.getPhone());
        m.setPhone(Prompt.inputString(""));
        System.out.printf("새암호? ");
        m.setPassword(Prompt.inputString(""));
        m.setPosition(inputPosition(m.getPosition()));
        return;
      }
    }
    System.out.println("해당 번호의 직원이 없습니다");
  }

  private static char inputPosition(char position) {
    String label;
    if (position == 0) {
      label = "직책?\n";
    } else {
      label = String.format("직책(%s)?\n", toPositionString(position));
    }

    while (true) {
      String menuNo = Prompt.inputString(label +
          "  1. 관리자\n" +
          "  2. 일반직원\n" +
          "> ");

      switch (menuNo) {
        case "1":
          return Member.MANAGER;
        case "2":
          return Member.STAFF;
        default:
          System.out.println("무효한 번호입니다.");
      }
    }
  }

  public void deleteMember() {
    int memberNo = Prompt.inputInt("번호? ");

    int deletedIndex = indexOf(memberNo);
    if (deletedIndex == -1) {
      System.out.println("해당 번호의 직원이 없습니다!");
      return;
    }

    for (int i = deletedIndex; i < this.length - 1; i++) {
      this.members[i] = this.members[i + 1];
    }

    members[--this.length] = null;
  }

  private int indexOf(int memberNo) {
    for (int i = 0; i < this.length; i++) {
      Member m = this.members[i];
      if (m.getNo() == memberNo) {
        return i;
      }
    }
    return -1;
  }

  private boolean available() {
    return this.length < MAX_SIZE;
  }
}

 

itemHandler.java

package bitcamp.report.handler;

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

public class itemHandler {

  private static final int MAX_SIZE = 100;
  private Item[] items = new Item[MAX_SIZE];

  private int length = 0;

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

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

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

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

    for (int i = 0; i < this.length; i++) {
      Item item = this.items[i];
      System.out.printf("%d, %s, %s, %s\n", item.getNo(), item.getName(), item.getPrice(),
          item.getType());
    }
  }

  public void viewItem() {
    String itemNo = Prompt.inputString("물품 번호? ");
    for (int i = 0; i < this.length; i++) {
      Item item = this.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 void updateItem() {
    String itemNo = Prompt.inputString("물품 번호? ");
    for (int i = 0; i < this.length; i++) {
      Item item = this.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 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 < this.length - 1; i++) {
      this.items[i] = this.items[i + 1];
    }

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

    length--;

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

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

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

ㄴ 향후 확장성을 고려하여 MemberHandler, itemHandler 클래스에도 인스턴스 필드와 인스턴스 메서드를 적용

    => 실무에서는 대부분의 클래스가 인스턴스 필드와 인스턴스 메서드로 구성됨

 

App.java 수정

package bitcamp.report;

import bitcamp.report.handler.MemberHandler;
import bitcamp.report.handler.ItemHandler;

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

public class App {

    public static void main(String[] args) {

        MemberHandler memberHandler = new MemberHandler();
        ItemHandler itemHandler = new ItemHandler();
        BoardHandler boardHandler = new BoardHandler();
        BoardHandler noticeHandler = new BoardHandler();

        printTitle();

        printMenu();

        while (true) {
            String menuNo = Prompt.inputString("메인> ");
            if (menuNo.equals("99")) {
                break;
            } else if (menuNo.equals("menu")) {
                printMenu();
            } else if (menuNo.equals("1")) {
                memberHandler.inputMember();
            } else if (menuNo.equals("2")) {
                memberHandler.printMembers();
            } else if (menuNo.equals("3")) {
                memberHandler.viewMember();
            } else if (menuNo.equals("4")) {
                memberHandler.updateMember();
            } else if (menuNo.equals("5")) {
                memberHandler.deleteMember();
            } else if (menuNo.equals("6")) {
                itemHandler.inputItem();
            } else if (menuNo.equals("7")) {
                itemHandler.printItems();
            } else if (menuNo.equals("8")) {
                itemHandler.viewItem();
            } else if (menuNo.equals("9")) {
                itemHandler.updateItem();
            } else if (menuNo.equals("10")) {
                itemHandler.deleteItem();
            } else if (menuNo.equals("11")) {
                boardHandler.inputBoard();
            } else if (menuNo.equals("12")) {
                boardHandler.printBoards();
            } else if (menuNo.equals("13")) {
                boardHandler.viewBoard();
            } else if (menuNo.equals("14")) {
                boardHandler.updateBoard();
            } else if (menuNo.equals("15")) {
                boardHandler.deleteBoard();
            } else if (menuNo.equals("16")) {
                noticeHandler.inputBoard();
            } else if (menuNo.equals("17")) {
                noticeHandler.printBoards();
            } else if (menuNo.equals("18")) {
                noticeHandler.viewBoard();
            } else if (menuNo.equals("19")) {
                noticeHandler.updateBoard();
            } else if (menuNo.equals("20")) {
                noticeHandler.deleteBoard();
            } 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. 물품 등록");
        System.out.println("7. 물품 목록");
        System.out.println("8. 물품 조회");
        System.out.println("9. 물품 변경");
        System.out.println("10. 물품 삭제");
        System.out.println("11. 게시글 등록");
        System.out.println("12. 게시글 목록");
        System.out.println("13. 게시글 조회");
        System.out.println("14. 게시글 변경");
        System.out.println("15. 게시글 삭제");
        System.out.println("16. 공지 등록");
        System.out.println("17. 공지 목록");
        System.out.println("18. 공지 조회");
        System.out.println("19. 공지 변경");
        System.out.println("20. 공지 삭제");
        System.out.println("99. 종료");
    }

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

ㄴ App 에서 각각의 인스턴스를 생성해주고, 클래스명이 아닌 인스턴스명으로 호출하도록 수정

 

 

ㄴ 해당 내용을 개인 프로젝트에 적용

 

Prompt 클래스에 인스턴스 필드와 인스턴스 메서드를 적용

Prompt.java

=>

=>

 

=>

ㄴ 향후 확장성을 고려하여 Prompt 클래스에도 인스턴스 필드와 인스턴스 메서드를 적용

    ㄴ 생성자 도입 : Scanner 사용할 입력 도구를 지정할 수 있게 함

=> Prompt 가 사용되는 클래스 모두 수정해줘야 함 (ItemHandler, MemberHandler, BoardHandler)

 

 

의존 객체 주입

=> 컴파일 시 아래처럼 바뀌어 실행됨

 

=> 컴파일 시 아래처럼 바뀌어 실행됨

 

ㄴ 의존 객체 주입의 개념과 구현

    ㄴ 생성자를 통해 Prompt 객체를 Handler에 주입

 

=> 아래처럼 변경해줌

 

=> inputString 을 인스턴스 메서드로 변경해줬으므로 inputPosition 메서드도 인스턴스 메서드로 변경해줌 (static 제거)

 

App.java 수정

 

 

총정리 코드

app.java

package bitcamp.report;

import bitcamp.report.handler.MemberHandler;

import bitcamp.report.handler.BoardHandler;
import bitcamp.report.handler.ItemHandler;
import bitcamp.util.Prompt;

public class App {

    public static void main(String[] args) {

        // 기본 생성자를 이용해 Prompt 인스턴스를 준비
        // => 기본 생성자는 Scanner를 키보드와 연결함
        Prompt prompt = new Prompt();

        MemberHandler memberHandler = new MemberHandler(prompt);
        ItemHandler itemHandler = new ItemHandler(prompt);
        BoardHandler boardHandler = new BoardHandler(prompt);
        BoardHandler noticeHandler = new BoardHandler(prompt);

        printTitle();

        printMenu();

        while (true) {
            String menuNo = prompt.inputString("메인> ");
            if (menuNo.equals("99")) {
                break;
            } else if (menuNo.equals("menu")) {
                printMenu();
            } else if (menuNo.equals("1")) {
                memberHandler.inputMember();
            } else if (menuNo.equals("2")) {
                memberHandler.printMembers();
            } else if (menuNo.equals("3")) {
                memberHandler.viewMember();
            } else if (menuNo.equals("4")) {
                memberHandler.updateMember();
            } else if (menuNo.equals("5")) {
                memberHandler.deleteMember();
            } else if (menuNo.equals("6")) {
                itemHandler.inputItem();
            } else if (menuNo.equals("7")) {
                itemHandler.printItems();
            } else if (menuNo.equals("8")) {
                itemHandler.viewItem();
            } else if (menuNo.equals("9")) {
                itemHandler.updateItem();
            } else if (menuNo.equals("10")) {
                itemHandler.deleteItem();
            } else if (menuNo.equals("11")) {
                boardHandler.inputBoard();
            } else if (menuNo.equals("12")) {
                boardHandler.printBoards();
            } else if (menuNo.equals("13")) {
                boardHandler.viewBoard();
            } else if (menuNo.equals("14")) {
                boardHandler.updateBoard();
            } else if (menuNo.equals("15")) {
                boardHandler.deleteBoard();
            } else if (menuNo.equals("16")) {
                noticeHandler.inputBoard();
            } else if (menuNo.equals("17")) {
                noticeHandler.printBoards();
            } else if (menuNo.equals("18")) {
                noticeHandler.viewBoard();
            } else if (menuNo.equals("19")) {
                noticeHandler.updateBoard();
            } else if (menuNo.equals("20")) {
                noticeHandler.deleteBoard();
            } 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. 물품 등록");
        System.out.println("7. 물품 목록");
        System.out.println("8. 물품 조회");
        System.out.println("9. 물품 변경");
        System.out.println("10. 물품 삭제");
        System.out.println("11. 게시글 등록");
        System.out.println("12. 게시글 목록");
        System.out.println("13. 게시글 조회");
        System.out.println("14. 게시글 변경");
        System.out.println("15. 게시글 삭제");
        System.out.println("16. 공지 등록");
        System.out.println("17. 공지 목록");
        System.out.println("18. 공지 조회");
        System.out.println("19. 공지 변경");
        System.out.println("20. 공지 삭제");
        System.out.println("99. 종료");
    }

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

 

 

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;
  }


}

 

Board.java

package bitcamp.report.vo;

public class Board {

  // 모든 인스턴스가 공유하는 값은 스태틱 필드에 보관한다.
  private static int boardNo = 1;

  private int no; // private 이라는 modifier 를 사용하여 접근 제어
  private String title;
  private String content;
  private String writer;
  private String password;
  private int viewCount;
  private long createdDate; // 밀리세컨드

  public Board() { // 생성자
    this.no = boardNo++;
    this.createdDate = System.currentTimeMillis();
  }

  // 겟터/셋터는 인스턴스 필드의 값을 설정하고 꺼내는 메서드다.
  // 보통 외부에서 직접 필드에 접근하는 것을 막았을 때 사용한다.
  public int getNo() {
    return no;
  }

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

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getContent() {
    return content;
  }

  public void setContent(String content) {
    this.content = content;
  }

  public String getWriter() {
    return writer;
  }

  public void setWriter(String writer) {
    this.writer = writer;
  }

  public int getViewCount() {
    return viewCount;
  }

  public void setViewCount(int viewCount) {
    this.viewCount = viewCount;
  }

  public long getCreatedDate() {
    return createdDate;
  }

  public void setCreatedDate(long createdDate) {
    this.createdDate = createdDate;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

}

 

Member.java

package bitcamp.report.vo;

public class Member {

  // 모든 인스턴스가 공유하는 값은 스태틱 필드에 보관한다.
  private static int userId = 1;

  // 상수는 스태틱 필드로 정의한다.
  // 정보를 다룰 때는 그 정보를 갖고 있는 클래스에 그 기능을 둔다.
  // 필드도 마찬가지이다.
  // => GRASP 패턴: Information Expert
  public static final char MANAGER = '0';
  public static final char STAFF = '1';

  // 인스턴스 필드는 각각 개별적으로 유지해야 하는 값을 저장할 때 사용한다.
  // new 명령을 통해 변수를 Heap 영역에 생성한다.
  private int no;
  private String name;
  private String phone;
  private String password;
  private char position;

  // 생성자는 인스턴스를 생성한 후 필드를 초기화시키는 일을 한다.
  // 인스턴스를 사용할 때 문제가 없도록 유효한 값으로 초기화시킨다.
  // 기본 생성자(default constructor)는 개발자가 생성자를 정의하지 않을 때
  // 컴파일러가 추가해주는 생성자다.
  // 물론 개발자가 직접 추가할 수도 있다.
  public Member() {
    this.no = userId++;
  }

  // 겟터/셋터는 인스턴스 필드의 값을 설정하고 꺼내는 메서드다.
  // 보통 외부에서 직접 필드에 접근하는 것을 막았을 때 사용한다.
  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 String getPhone() {
    return phone;
  }

  public void setPhone(String phone) {
    this.phone = phone;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

  public char getPosition() {
    return position;
  }

  public void setPosition(char gender) {
    this.position = gender;
  }

}

 

ItemHandler.java

package bitcamp.report.handler;

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

public class ItemHandler {

  private static final int MAX_SIZE = 100;

  private Prompt prompt;
  private Item[] items = new Item[MAX_SIZE];
  private int length;

  // 생성자: 인스턴스를 사용할 수 있도록 유효한 값으로 초기화시키는 일을 함
  // => 필요한 값을 외부에서 받고 싶으면 파라미터를 선언
  public ItemHandler(Prompt prompt) {
    this.prompt = prompt;
  }

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

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

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

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

    for (int i = 0; i < this.length; i++) {
      Item item = this.items[i];
      System.out.printf("%d, %s, %d, %s\n", item.getNo(), item.getName(), item.getPrice(),
          item.getType());
    }
  }

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

  public void updateItem() {
    String itemNo = this.prompt.inputString("물품 번호? ");
    for (int i = 0; i < this.length; i++) {
      Item item = this.items[i];
      if (item.getNo() == Integer.parseInt(itemNo)) {
        item.setName(this.prompt.inputString("물품 이름(%s)? ", item.getName()));
        item.setPrice(this.prompt.inputInt("물품 가격(%d)? ", item.getPrice()));
        item.setType(inputType(item.getType()));
        return;
      }
    }
    System.out.println("해당 번호의 물품이 없습니다!");
  }

  private String inputType(String type) {
    String label;
    if (type == "0") {
      label = "물품 종류?\n";
    } else {
      label = String.format("물품 종류(%s)?\n", type);
    }
    while (true) {
      String typeNo = this.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 void deleteItem() {
    // 삭제하려는 물품의 정보가 들어있는 인덱스 알아내기

    int itemNo = this.prompt.inputInt("물품 번호? ");

    int deletedIndex = indexOf(itemNo);

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

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

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

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

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

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

 

MemberHandler.java

package bitcamp.report.handler;

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

public class MemberHandler {

  private static final int MAX_SIZE = 100;

  private Prompt prompt;
  private Member[] members = new Member[MAX_SIZE];
  private int length;

  // 생성자: 인스턴스를 사용할 수 있도록 유효한 값으로 초기화시키는 일을 함
  // => 필요한 값을 외부에서 받고 싶으면 파라미터를 선언
  public MemberHandler(Prompt prompt) {
    this.prompt = prompt;
  }

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

    Member m = new Member();
    m.setName(this.prompt.inputString("이름? "));
    m.setPhone(this.prompt.inputString("전화번호? "));
    m.setPassword(this.prompt.inputString("암호? "));
    m.setPosition(inputPosition((char) 0));

    // 위에서 만든 Member 인스턴스의 주소를 잃어버리지 않게
    // 레퍼런스 배열에 담는다.
    members[this.length++] = m;
  }

  public void printMembers() {
    System.out.println("---------------------------------------");
    System.out.println("번호, 이름, 전화번호, 직책");
    System.out.println("---------------------------------------");

    for (int i = 0; i < this.length; i++) {
      Member m = this.members[i];
      System.out.printf("%d, %s, %s, %s\n",
          m.getNo(), m.getName(), m.getPhone(),
          toPositionString(m.getPosition()));
    }
  }

  public void viewMember() {
    String memberNo = this.prompt.inputString("번호? ");
    for (int i = 0; i < this.length; i++) {
      Member m = this.members[i];
      if (m.getNo() == Integer.parseInt(memberNo)) {
        System.out.printf("이름: %s\n", m.getName());
        System.out.printf("전화번호: %s\n", m.getPhone());
        System.out.printf("직책: %s\n", toPositionString(m.getPosition()));
        return;
      }
    }
    System.out.println("해당 번호의 직원이 없습니다!");
  }

  public static String toPositionString(char position) {
    return position == '0' ? "관리자" : "일반직원";
  }

  public void updateMember() {
    String memberNo = this.prompt.inputString("번호? ");
    for (int i = 0; i < this.length; i++) {
      Member m = this.members[i];
      if (m.getNo() == Integer.parseInt(memberNo)) {
        System.out.printf("이름(%s)? ", m.getName());
        m.setName(this.prompt.inputString(""));
        System.out.printf("전화번호(%s)? ", m.getPhone());
        m.setPhone(this.prompt.inputString(""));
        System.out.printf("새암호? ");
        m.setPassword(this.prompt.inputString(""));
        m.setPosition(inputPosition(m.getPosition()));
        return;
      }
    }
    System.out.println("해당 번호의 직원이 없습니다");
  }

  private char inputPosition(char position) {
    String label;
    if (position == 0) {
      label = "직책?\n";
    } else {
      label = String.format("직책(%s)?\n", toPositionString(position));
    }

    while (true) {
      String menuNo = this.prompt.inputString(label +
          "  1. 관리자\n" +
          "  2. 일반직원\n" +
          "> ");

      switch (menuNo) {
        case "1":
          return Member.MANAGER;
        case "2":
          return Member.STAFF;
        default:
          System.out.println("무효한 번호입니다.");
      }
    }
  }

  public void deleteMember() {
    int memberNo = this.prompt.inputInt("번호? ");

    int deletedIndex = indexOf(memberNo);
    if (deletedIndex == -1) {
      System.out.println("해당 번호의 직원이 없습니다!");
      return;
    }

    for (int i = deletedIndex; i < this.length - 1; i++) {
      this.members[i] = this.members[i + 1];
    }

    members[--this.length] = null;
  }

  private int indexOf(int memberNo) {
    for (int i = 0; i < this.length; i++) {
      Member m = this.members[i];
      if (m.getNo() == memberNo) {
        return i;
      }
    }
    return -1;
  }

  private boolean available() {
    return this.length < MAX_SIZE;
  }
}

 

BoardHandler.java

package bitcamp.report.handler;

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

public class BoardHandler {

  // 인스턴스에 상관없이 공통으로 사용하는 필드라면 스태틱 필드로 선언함
  private static final int MAX_SIZE = 100;

  // 인스턴스 마다 별개로 관리해야 할 데이터라면 인스턴스 필드로 선언함
  private Prompt prompt;
  private Board[] boards = new Board[MAX_SIZE];
  private int length;

  // 생성자: 인스턴스를 사용할 수 있도록 유효한 값으로 초기화시키는 일을 함
  // => 필요한 값을 외부에서 받고 싶으면 파라미터를 선언
  public BoardHandler(Prompt prompt) {
    this.prompt = prompt;
  }

  // 인스턴스 멤버(필드나 메서드)를 사용하는 경우 인스턴스 메서드로 정의해야 함
  public void inputBoard() {
    if (!this.available()) {
      System.out.println("더이상 입력할 수 없습니다!");
      return;
    }

    Board board = new Board();
    board.setTitle(this.prompt.inputString("제목? "));
    board.setContent(this.prompt.inputString("내용? "));
    board.setWriter(this.prompt.inputString("작성자? "));
    board.setPassword(this.prompt.inputString("암호? "));

    // 위에서 만든 Board 인스턴스의 주소를 잃어버리지 않게
    // 레퍼런스 배열에 담는다.
    boards[this.length++] = board;
  }

  public void printBoards() {
    System.out.println("---------------------------------------");
    System.out.println("번호, 제목, 작성자, 조회수, 등록일");
    System.out.println("---------------------------------------");

    for (int i = 0; i < this.length; i++) {
      Board board = this.boards[i];
      System.out.printf("%d, %s, %s, %d, %tY-%5$tm-%5$td\n",
          board.getNo(),
          board.getTitle(),
          board.getWriter(),
          board.getViewCount(),
          board.getCreatedDate());
    }
  }

  public void viewBoard() {
    String boardNo = this.prompt.inputString("번호? ");
    for (int i = 0; i < this.length; i++) {
      Board board = this.boards[i];
      if (board.getNo() == Integer.parseInt(boardNo)) {
        System.out.printf("제목: %s\n", board.getTitle());
        System.out.printf("내용: %s\n", board.getContent());
        System.out.printf("작성자: %s\n", board.getWriter());
        System.out.printf("조회수: %d\n", board.getViewCount());
        System.out.printf("등록일: %tY-%1$tm-%1$td\n", board.getCreatedDate());
        board.setViewCount(board.getViewCount() + 1); // 조회수 증가
        return;
      }
    }
    System.out.println("해당 번호의 게시글이 없습니다");
  }

  public void updateBoard() {
    String boardNo = this.prompt.inputString("번호? ");
    for (int i = 0; i < this.length; i++) {
      Board board = this.boards[i];
      if (board.getNo() == Integer.parseInt(boardNo)) {
        if (!this.prompt.inputString("암호? ").equals(board.getPassword())) {
          System.out.println("암호가 일치하지 않습니다");
          return;
        }
        board.setTitle(this.prompt.inputString("제목(%s)? ", board.getTitle()));
        board.setContent(this.prompt.inputString("내용(%s)? ", board.getContent()));
        return;
      }
    }
    System.out.println("해당 번호의 게시글이 없습니다");
  }

  public void deleteBoard() {

    int deletedIndex = indexOf(this.prompt.inputInt("번호? "));
    if (deletedIndex == -1) {
      System.out.println("해당 번호의 게시글이 없습니다!");
      return;
    }

    for (int i = deletedIndex; i < this.length - 1; i++) {
      this.boards[i] = this.boards[i + 1];
    }

    this.boards[--this.length] = null;
  }

  private int indexOf(int boardNo) {
    for (int i = 0; i < this.length; i++) {
      Board board = this.boards[i];
      if (board.getNo() == boardNo) {
        return i;
      }
    }
    return -1;
  }

  private boolean available() {
    return this.length < MAX_SIZE;
  }
}

 

Prompt.java

package bitcamp.util;

import java.io.InputStream;
import java.util.Scanner;

public class Prompt {

  private Scanner scanner;

  // defualt constructor
  public Prompt() {
    scanner = new Scanner(System.in);
  }

  // 다른 입력 도구와 연결한다면
  public Prompt(InputStream in) {
    scanner = new Scanner(in);
  }

  public String inputString(String title, Object... args) {
    System.out.printf(title, args);
    return this.scanner.nextLine();
  }

  public int inputInt(String title, Object... args) {
    return Integer.parseInt(this.inputString(title, args));
  }

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

}