ㄴ 해당 내용을 개인 프로젝트에 적용
인스턴스 필드와 인스턴스 메서드, 생성자와 의존 객체 주입
만들었던 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();
}
}
'네이버클라우드 > JAVA 웹 프로그래밍' 카테고리의 다른 글
JAVA 17일차 (2023-06-15) 자바 기초 DAY15_디버깅 (0) | 2023.06.15 |
---|---|
JAVA 17일차 (2023-06-15) 자바 기초 DAY15_GRASP 패턴 : Information Expert 적용_개인프로젝트 - 마트 관리 시스템 (0) | 2023.06.15 |
JAVA 16일차 (2023-06-14) 자바 기초 DAY14_CRUD 구현 / 스태틱 필드의 한계 확인_개인 프로젝트 - 마트 관리 시스템 (0) | 2023.06.14 |
JAVA 15일차 (2023-06-13) 자바 기초 DAY13_인스턴스 메서드와 스태틱 메서드 (0) | 2023.06.13 |
JAVA 15일차 (2023-06-13) 자바 기초 DAY13_게시판 관리 기능 추가 (0) | 2023.06.13 |