Day14 실습프로젝트(서브메뉴만들기)
1. Sub메뉴 만들기
1.1 프롬프트 변경하기
- 입력소스 추가
- mainmenu : “메인> “
- submenu : “메인/서브메뉴> “
- parameter에 String타입 매개변수를 추가하여 main메서드에서 title을 argument롤 전달
1
2
3
4
5
6
7
8
9
10
11
// 변경 전
static String prompt() {
System.out.print("> ");
return keyboardScanner.nextLine();
}
// 변경 후
static String prompt(String title){
System.out.printf("%s> ",title);
return keyboardScanner.nextLine();
}
1.2 서브메뉴생성
핵심 로직
-> main method : menuTitle != null // 서브메뉴 로직 while (true) { menuNo가 1이상 4이하 일때, [menuTitle]출력 서브메뉴 항목 출력 서브메뉴 번호 입력 입력 번호가 menu일때, 서브메뉴 출력 서브메뉴 번호가 null -> 유효하지 않음 출력 서브메뉴 번호가 9 -> 메인메뉴로 복귀 그외 -> 선택항목명 출력 }
서브메뉴 출력 메서드 생성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
//서브메뉴 집합 2차원 배열 생성 static String[][] subMenus = { {"등록a", "목록", "조회", "변경", "삭제"} //회원메뉴, {"등록b", "목록", "조회", "변경", "삭제"} //팀메뉴, {"등록c", "목록", "조회", "변경", "삭제"} //프로젝트메뉴, {"등록d", "목록", "조회", "변경", "삭제"} //게시판메뉴 }; static void main(String[] args){/*...중략...*/} static void printSubMenu(String menuTitle, String[] menus) { System.out.printf("[%s]\n", menuTitle); for (int i = 0; i < menus.length; i++) { System.out.printf("%d. %s\n", (i + 1), menus[i]); } System.out.println("9. 이전"); }
서브메뉴 실행 메서드 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void processSubmenu(String menuTitle,String[] menus){
printSubMenu(menuTitle, menus);
while (true){
String command = prompt("메인/"+menuTitle);
try {
if (command.equals("menu")) {
printSubMenu(menuTitle, menus);
continue;
} else if (command.equals("9")) {
break;
}
int MenuNo = Integer.parseInt(command);
String subMenuTitle = getMenuTitle(MenuNo,menus);
if (subMenuTitle == null) {
System.out.println("유효한 메뉴 번호가 아닙니다.");
} else {
System.out.println(subMenuTitle);
}
}catch (NumberFormatException ex){
System.out.println("숫자로 메뉴 번호를 입력하세요.");
}
}
}
1.3 리팩토링
- getMenuTitle, isValidateMenuNo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// main 과 sub 둘다 사용 가능
// sub에서는 String[] parmeter가 필요(subMenus[][] 2차원 배열로)하므로 parmeter 변경
static boolean isValidateMenu(int menuNo) {
return menuNo >= 1 && menuNo <= menus.length;
}
static String getMenuTitle(int menuNo) {
return isValidateMenu(menuNo) ? menus[menuNo - 1] : null;
}
//변경
static boolean isValidateMenu(int menuNo, String[] menus) {
return menuNo >= 1 && menuNo <= menus.length;
}
static String getMenuTitle(int menuNo, String[] menus) {
return isValidateMenu(menuNo, menus) ? menus[menuNo - 1] : null;
}
2. 완성된 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package bitcamp.myapp;
import java.util.Scanner;
public class App {
static Scanner keyboardScanner = new Scanner(System.in);
static String[] mainMenus = new String[] {"회원", "팀", "프로젝트", "게시판", "도움말", "종료"};
static String[][] subMenus = {
{"등록a", "목록", "조회", "변경", "삭제"},
{"등록b", "목록", "조회", "변경", "삭제"},
{"등록c", "목록", "조회", "변경", "삭제"},
{"등록d", "목록", "조회", "변경", "삭제"}
};
public static void main(String[] args) {
printMenu(); // 메서드에 묶인 코드를 실행하는 것을 "메서드를 호출(call)한다"라고 부른다.
String command;
while (true) {
try {
command = prompt("메인");
if (command.equals("menu")) {
printMenu();
} else {
int menuNo = Integer.parseInt(command);
String menuTitle = getMenuTitle(menuNo, mainMenus); // 설명하는 변수
if (menuTitle == null) {
System.out.println("유효한 메뉴 번호가 아닙니다.");
} else if (menuTitle.equals("종료")) {
break;
} else {
if (menuNo >= 1 && menuNo <= 4) {
processMenu(menuTitle, subMenus[menuNo - 1]);
} else {
System.out.println(menuTitle);
}
}
}
} catch (NumberFormatException ex) {
System.out.println("숫자로 메뉴 번호를 입력하세요.");
}
}
System.out.println("종료합니다.");
keyboardScanner.close();
}
static void printMenu() {
String boldAnsi = "\033[1m";
String redAnsi = "\033[31m";
String resetAnsi = "\033[0m";
String appTitle = "[팀 프로젝트 관리 시스템]";
String line = "----------------------------------";
System.out.println(boldAnsi + line + resetAnsi);
System.out.println(boldAnsi + appTitle + resetAnsi);
for (int i = 0; i < mainMenus.length; i++) {
if (mainMenus[i].equals("종료")) {
System.out.printf("%s%d. %s%s\n", (boldAnsi + redAnsi), (i + 1), mainMenus[i], resetAnsi);
} else {
System.out.printf("%d. %s\n", (i + 1), mainMenus[i]);
}
}
System.out.println(boldAnsi + line + resetAnsi);
}
static void printSubMenu(String menuTitle, String[] menus) {
System.out.printf("[%s]\n", menuTitle);
for (int i = 0; i < menus.length; i++) {
System.out.printf("%d. %s\n", (i + 1), menus[i]);
}
System.out.println("9. 이전");
}
static String prompt(String title) {
System.out.printf("%s> ", title);
return keyboardScanner.nextLine();
}
static boolean isValidateMenu(int menuNo, String[] menus) {
return menuNo >= 1 && menuNo <= menus.length;
}
static String getMenuTitle(int menuNo, String[] menus) {
return isValidateMenu(menuNo, menus) ? menus[menuNo - 1] : null;
}
static void processMenu(String menuTitle, String[] menus) {
printSubMenu(menuTitle, menus);
while (true) {
String command = prompt("메인/" + menuTitle);
if (command.equals("menu")) {
printSubMenu(menuTitle, menus);
continue;
} else if (command.equals("9")) { // 이전 메뉴 선택
break;
}
try {
int menuNo = Integer.parseInt(command);
String subMenuTitle = getMenuTitle(menuNo, menus);
if (subMenuTitle == null) {
System.out.println("유효한 메뉴 번호가 아닙니다.");
} else {
System.out.println(subMenuTitle);
}
} catch (NumberFormatException ex) {
System.out.println("숫자로 메뉴 번호를 입력하세요.");
}
}
}
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.