1. Sub메뉴 만들기
1.1 프롬프트 변경하기
- 입력소스 추가
- mainmenu : "메인> "
- submenu : "메인/서브메뉴> "
- parameter에 String타입 매개변수를 추가하여 main메서드에서 title을 argument롤 전달
// 변경 전
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 -> 메인메뉴로 복귀
그외 -> 선택항목명 출력
}
- 서브메뉴 출력 메서드 생성
//서브메뉴 집합 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. 이전");
}
- 서브메뉴 실행 메서드 생성
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
// 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. 완성된 코드
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("숫자로 메뉴 번호를 입력하세요.");
}
}
}
}
'개발자 꿈나무의 하루 > 01_Boot Camp' 카테고리의 다른 글
(네이버클라우드 부트캠프) 16일차 - Java프로그래밍 기초(클래스) (1) | 2024.06.17 |
---|---|
(네이버클라우드 부트캠프) 15일차 - 실습프로젝트(클래스) (1) | 2024.06.14 |
(네이버클라우드 부트캠프) 13일차 - Java프로그래밍 기초(메서드) (0) | 2024.06.12 |
(네이버클라우드 부트캠프) 12일차 - Java프로그래밍 기초(표준입출력,String), 실습프로젝트(메서드) (1) | 2024.06.11 |
(네이버클라우드 부트캠프) 11일차 - Java프로그래밍 기초(조건문,반복문,배열), 실습프로젝트 (0) | 2024.06.11 |