포스트

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 라이센스를 따릅니다.