본문 바로가기
개발자 꿈나무의 하루/01_Boot Camp

(네이버클라우드 부트캠프) 14일차 - 실습프로젝트(서브메뉴만들기)

by kk_naks 2024. 6. 13.

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("숫자로 메뉴 번호를 입력하세요.");
            }
        }
    }
}