본문 바로가기
교육/Java&Spring

kosta 클라우드 네이티브 애플리케이션 개발 과정 day 6

by Renechoi 2022. 12. 28.

kosta 클라우드 네이티브 애플리케이션 개발 과정 day 6


 

배열을 이용해 메뉴판을 업그레이드 해보자 

 

배열을 생성하고 메서드에 메시지 전달을 해서 메서드가 배열 관련 기능을 수행하게 하기. 

 

ADDITION(1) {
    @Override
    public void findMenu(int command, String[] names) {
        System.out.println(MENU_ADDITION);

        int nextInput = Arrays.asList(names).indexOf(null);

        System.out.println(REQUEST_ADDITIONAL_NAME);
        names[nextInput] = String.valueOf(inputViewString());
    }
},

 

 

enum 클래스에서 매칭되는 번호에 따라 선택된 메서드가 배열의 기능을 수행한다.

 

그런데 여기서 궁금증.

 

배열은 refernce 방식으로 리턴이 필요 없다. 

 

그렇다면 굳이 배열을 전달받는 것이 맞는 걸까? static field로 올려서 전역변수로 사용하는 방식이 나은 것은 아닐까? 

하는 고민. 

 

강사님의 답 : 현재는 배열과 메서드를 연습하는 과정이니 객체 파트 들어가서 다시 살펴보자! 

 


 

enum 클래스와 stream, lambda를 활용한 메뉴 관리 프로그램 리팩토링 

 

package kosta.mission.Mission05;

import java.util.Arrays;
import java.util.Objects;
import java.util.Scanner;

public class Mission05_01 {

    private static final String REQUEST_COMMAND = "숫자를 입력하세요.";
    private static final String MENU_ADDITION = "추가 메뉴를 선택했습니다.\n";
    private static final String MENU_PRINT = "출력 메뉴를 선택했습니다.\n";
    private static final String MENU_SEARCH = "검색 메뉴를 선택했습니다.\n";
    private static final String MENU_END = "종료 메뉴를 선택했습니다.\n";
    private static final String REQUEST_ADDITIONAL_NAME = "추가할 이름을 입력하세요.";
    private static final String NAME_NOT_IN_THE_MENU = "%s은 저장되어 있지 않습니다!\n";
    private static final String NAME_IN_THE_MENU_WITH_INDEX = "%s은 %d에 메뉴에 저장되어 있습니다.\n";

    public static void main(String[] args) {
        // 메뉴를 선택해서 해당 메뉴의 명령문을 실행해 보자.
        // 1.추가 2.출력 3.검색 4.종료

        int number;
        String[] names = new String[5];

        do {

            System.out.println(REQUEST_COMMAND);
            number = inputViewNumber();
            executeCommand(number, names);
        } while (isEndCommand(number));
    }

    private static void executeCommand(int number, String[] names) {

        Command command = Arrays.stream(Command.values())
                .filter(v -> v.command.equals(number))
                .findFirst()
                .orElseThrow(IllegalArgumentException::new);

        command.findMenu(number, names);
    }

    private static Integer inputViewNumber() {
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }

    private static String inputViewString() {
        Scanner scanner = new Scanner(System.in);
        return scanner.nextLine();
    }

    private static boolean isEndCommand(Integer number) {
        return number != 4;
    }

    public enum Command {

        ADDITION(1) {
            @Override
            public void findMenu(int command, String[] names) {
                System.out.println(MENU_ADDITION);

                int nextInput = Arrays.asList(names).indexOf(null);

                System.out.println(REQUEST_ADDITIONAL_NAME);
                names[nextInput] = String.valueOf(inputViewString());
            }
        },

        PRINT(2) {
            @Override
            public void findMenu(int command, String[] names) {
                System.out.println(MENU_PRINT);
                Arrays.stream(names).filter(Objects::nonNull).forEach(System.out::println);
//                System.out.println(Arrays.toString(names));
            }
        },

        SEARCH(3) {
            @Override
            public void findMenu(int command, String[] names) {
                System.out.println(MENU_SEARCH);
                String requestedName = inputViewString();
                int nameIdx = Arrays.asList(names).indexOf(requestedName);
                if (!isContains(names, requestedName)) {
                    System.out.printf(NAME_NOT_IN_THE_MENU, requestedName);
                    return;
                }
                System.out.printf(NAME_IN_THE_MENU_WITH_INDEX, requestedName, nameIdx + 1);

            }

            private boolean isContains(String[] names, String requestedName) {
                //                Arrays.stream(names).anyMatch(requestedName::equals);
                return Arrays.asList(names).contains(requestedName);
            }
        },

        END(4) {
            @Override
            public void findMenu(int command, String[] names) {
                System.out.println(MENU_END);
            }
        };

        private final Integer command;

        Command(int command) {
            this.command = command;
        }

        public abstract void findMenu(int command, String[] names);

    }
}


 

 

 


N개를 받고 비교하는 로직을 작성해보자! 

 

package kosta.mission2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Mission2_01 {
    public static void main(String[] args) throws IOException {
        // TODO : N개의 정수를 입력받아, 자신의 바로 앞 수보다 큰 수만 출력하는 프로그램을 작성하세요.
        // 첫 번째 수는 무조건 출력
        // 입력 : 첫 줄에 자연수 N이 주어진다(1 ~ 100), 둘째 줄에 N개의 정수가 한 칸씩 주어진다.
        // 출력 : 자신의 바로 앞 수보다 큰 수만 한 줄로 출력한다.


        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        int numberCounts = Integer.parseInt(bufferedReader.readLine());
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());

        int[] numbers = new int[numberCounts];
        for (int i = 0; i < numberCounts; i++) {
            int number = Integer.parseInt(stringTokenizer.nextToken());
            numbers[i] = number;
            if (i == 0) {
                System.out.print(number + " ");
                continue;
            }

            if (number > numbers[i - 1]) {
                System.out.print(number + " ");
            }
        }

    }
}

 

 


보이는 학생을 판단하는 문제를 풀어보자 ! 

 

package kosta.mission2;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Mission2_02 {
    public static void main(String[] args) throws IOException {
        // TODO : 보이는 학생
        // 선생님이 N명의 학생을 일렬로 세웠다. 키가 앞에서부터 순서대로 주어질 때, 맨 앞에 서 있는 선생님이 볼 수 있는 학생의 수를 구하는 프로그램을 작성하자.
        // 크면 보이고 작거나 같으면 보이지 않는다.
        // 입력: 5<=N<=100,000 , 둘째줄부터 N명 학생의 키가 주어진다.

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        int students = Integer.parseInt(bufferedReader.readLine());
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());

        int studentCounts = 0;
        int frontStudentHeight = 0;
        for (int i = 0; i < students; i++) {
            int height = Integer.parseInt(stringTokenizer.nextToken());
            if (height > frontStudentHeight) {
                studentCounts++;
                frontStudentHeight = height;
            }
        }
        System.out.println(studentCounts);
    }
}

 

 

 


 

메뉴 프로그램에서 이름 수정 기능을 구현해보자.

 


ALTER(4) {
    @Override
    public void findMenu(int command, String[] names) {
        names[Arrays.asList(names).indexOf(inputViewString(NAME_TO_BE_ALTERED_PREVIOUS))]
                = inputViewString(NAME_TO_BE_ALTERED_NEW);
    }
},

 

 


메뉴 프로그램에서 이름 삭제 기능을 구현해보자.

 

REMOVE(5) {
    @Override
    public void findMenu(int command, String[] names) {
        String nameToBeRemoved = inputViewString(NAME_TO_BE_REMOVED);
        int idxToBeRemoved = getNameIdx(names, nameToBeRemoved);

        removeName(names, idxToBeRemoved);
    }

    private void removeName(String[] names, int idxToBeRemoved) {
        for (int i = idxToBeRemoved; i < names.length; i++) {
            names[idxToBeRemoved] = names[idxToBeRemoved + 1];
        }
        names[idxToBeRemoved + 1] = null;
    }
},

 

 

 


전체 코드 

 

package kosta.mission.Mission05;

import java.util.Arrays;
import java.util.Objects;
import java.util.Scanner;

public class Mission05_01 {

    private static final String REQUEST_COMMAND = "숫자를 입력하세요.";
    private static final String MENU_ADDITION = "추가 메뉴를 선택했습니다.\n";
    private static final String MENU_PRINT = "출력 메뉴를 선택했습니다.\n";
    private static final String MENU_SEARCH = "검색 메뉴를 선택했습니다.\n";
    private static final String MENU_END = "종료 메뉴를 선택했습니다.\n";
    private static final String REQUEST_ADDITIONAL_NAME = "추가할 이름을 입력하세요.";
    private static final String NAME_NOT_IN_THE_MENU = "%s은 저장되어 있지 않습니다!\n";
    private static final String NAME_IN_THE_MENU_WITH_INDEX = "%s은 %d에 메뉴에 저장되어 있습니다.\n";
    private static final String NAME_TO_BE_ALTERED_PREVIOUS = "수정할 기존의 이름을 입력하세요";
    private static final String NAME_TO_BE_ALTERED_NEW = "수정할 새로운 이름을 입력하세요";
    private static final String NAME_TO_BE_REMOVED = "삭제할 이름을 입력하세요";

    public static void main(String[] args) {
        // 메뉴를 선택해서 해당 메뉴의 명령문을 실행해 보자.
        // 1.추가 2.출력 3.검색 4.수정 5.삭제 6.종료

        int number;
        String[] names = new String[5];

        do {
            number = inputViewNumber();
            executeCommand(number, names);
        } while (isEndCommand(number));
    }

    private static void executeCommand(int number, String[] names) {

        Command command = Arrays.stream(Command.values())
                .filter(v -> v.command.equals(number))
                .findFirst()
                .orElseThrow(IllegalArgumentException::new);

        command.findMenu(number, names);
    }

    private static Integer inputViewNumber() {
        System.out.println(REQUEST_COMMAND);
        Scanner scanner = new Scanner(System.in);
        return scanner.nextInt();
    }

    private static String inputViewString(String requestMessage) {
        System.out.println(requestMessage);
        Scanner scanner = new Scanner(System.in);
        return scanner.nextLine();
    }

    private static boolean isEndCommand(Integer number) {
        return number != 6;
    }

    public enum Command {

        ADDITION(1) {
            @Override
            public void findMenu(int command, String[] names) {
                System.out.println(MENU_ADDITION);

                int nextInput = getNameIdx(names, null);

                names[nextInput] = String.valueOf(inputViewString(REQUEST_ADDITIONAL_NAME));
            }
        },

        PRINT(2) {
            @Override
            public void findMenu(int command, String[] names) {
                System.out.println(MENU_PRINT);
                Arrays.stream(names).filter(Objects::nonNull).forEach(System.out::println);
            }
        },

        SEARCH(3) {
            @Override
            public void findMenu(int command, String[] names) {
                String requestedName = inputViewString(MENU_SEARCH);
                int nameIdx = getNameIdx(names, requestedName);
                if (!isContains(names, requestedName)) {
                    System.out.printf(NAME_NOT_IN_THE_MENU, requestedName);
                    return;
                }
                System.out.printf(NAME_IN_THE_MENU_WITH_INDEX, requestedName, nameIdx + 1);

            }

            private boolean isContains(String[] names, String requestedName) {
                //                Arrays.stream(names).anyMatch(requestedName::equals);
                return Arrays.asList(names).contains(requestedName);
            }
        },

        ALTER(4) {
            @Override
            public void findMenu(int command, String[] names) {
                names[getNameIdx(names, inputViewString(NAME_TO_BE_ALTERED_PREVIOUS))]
                        = inputViewString(NAME_TO_BE_ALTERED_NEW);
            }
        },

        REMOVE(5) {
            @Override
            public void findMenu(int command, String[] names) {
                String nameToBeRemoved = inputViewString(NAME_TO_BE_REMOVED);
                int idxToBeRemoved = getNameIdx(names, nameToBeRemoved);

                removeName(names, idxToBeRemoved);
            }

            private void removeName(String[] names, int idxToBeRemoved) {
                for (int i = idxToBeRemoved; i < names.length; i++) {
                    names[idxToBeRemoved] = names[idxToBeRemoved + 1];
                }
                names[idxToBeRemoved + 1] = null;
            }
        },

        END(6) {
            @Override
            public void findMenu(int command, String[] names) {
                System.out.println(MENU_END);
            }
        };

        private static int getNameIdx(String[] names, String requestedName) {
            return Arrays.asList(names).indexOf(requestedName);
        }

        private final Integer command;

        Command(int command) {
            this.command = command;
        }

        public abstract void findMenu(int command, String[] names);

    }
}

 

 

 


2차원 배열  : 각 1차원 배열마다 2차원 배열의 크기를 생성 

-> 각각의 1차원 배열을 쪼갠다 ! 

 

// 2차원 배열은 각 1차원 배열마다 2차원의 배열 크기를 생성
int arr[][];
arr = new int[3][2];

 

 

2차원 부분의 크기를 각기 다르게 설정할 수 있다. 

 

// 2차원 배열의 크기를 다르게 생성하는 방법
int arr2[][] = new int[3][];
arr2[0] = new int[2];
arr2[1] = new int[3];
arr2[2] = new int[4];

 

 

2차원 배열을 선언, 생성, 초기화 하는 방법 

 

// 2차원 배열 선언, 생성, 초기화
int arr3[][] = {{1, 2}, {3, 4}, {5, 6}}; //== [3][2]

 

 

 

2차원 배열은 2중 for문을 사용해서 각각 출력해줄 수 있다. 

 

for (int i =0; i<3; i++){
    for (int j = 0; j<2; j++){
        System.out.printf("arr[%d][%d] = %d\n", i,j, arr3[i][j]);
    }
}

 


2차원 배열을 출력하는 연습을 해보자 ! 

 

package kosta.mission2;

public class Mission2_03 {
    public static void main(String[] args) {
        // 여러명의 성적을 관리할 수 있는 프로그램을 구현해 보자
        // 번호 국어 영어 수학 총점 평균
        // 1    90 98  91 290 88
        // 2    21 45  43 180 43
        // ======================
        // 평균  80  60  50

        int[][] scoreSubjects = {      // 4 x 3 배열
                {98, 90, 80},
                {90, 98, 91},
                {90, 68, 35},
                {10, 25, 76}
        };

        int row = scoreSubjects.length;
        int column = scoreSubjects[0].length;

        int[][] scoreTotal = new int[row][column + 2];

        for (int i = 0; i < row; i++) {
            int sum = 0;

            for (int j = 0; j < column; j++) {
                int score = scoreSubjects[i][j];
                scoreTotal[i][j] = score;
                sum += score;
            }

            scoreTotal[i][column] = sum;
            scoreTotal[i][column + 1] = sum / column;
        }

        System.out.println("번호  국어 영어 수학  총점  평균");

        int idx = 1;
        for (int[] scores : scoreTotal) {
            System.out.printf("%d    %d  %d  %d  %d  %d\n", idx, scores[0], scores[1], scores[2], scores[3], scores[4]);
            idx++;
        }

        System.out.println("=========================");

        System.out.print("    ");
        for (int i = 0; i < column; i++) {
            System.out.print(getSubjectSum(scoreTotal, i) + " ");
        }

    }

    private static int getSubjectSum(int[][] scoreTotal, int subjectIdx) {
        int subjectSum = 0;
        for (int[] subjects : scoreTotal) {
            subjectSum += subjects[subjectIdx];
        }
        return subjectSum;
    }
}

 

번호  국어 영어 수학  총점  평균
1    98  90  80  268  89
2    90  98  91  279  93
3    90  68  35  193  64
4    10  25  76  111  37
=========================
    288 281 282 

반응형