TIL

TIL - 2024/05/08

기석김 2024. 5. 8. 20:40

배운 내용 🏃

 

개인과제 계산기 만들기를 진행했다

 

요구사항 1-4

반복문을 사용하여 반복의 종료를 알려주는 “exit” 문자열을 입력하기 전까지

무한으로 계산을 진행할 수 있도록 소스 코드를 수정합니다.

반복문을 사용합니다. (e.g. for, while …)

 

요구사항 힌트

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        /* 반복문 사용 해서 연산을 반복 */
        ...
        System.out.println("결과: " + result);
        
        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
        /* exit을 입력 받으면 반복 종료 */
    }
}

구현 코드

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (true) {//while 문 반복
            System.out.print("첫 번째 숫자를 입력하세요: ");
            int firstNumber = sc.nextInt();

            System.out.print("사칙연산 기호를 입력하세요: ");
            char operator = sc.next().charAt(0);

            System.out.print("두 번째 숫자를 입력하세요: ");
            int secondNumber = sc.nextInt();


            int result = 0;
            boolean realOperation = true;

            switch (operator) {
                case '+':
                    result = firstNumber + secondNumber;
                    break;
                case '-':
                    result = firstNumber - secondNumber;
                    break;
                case '*':
                    result = firstNumber * secondNumber;
                    break;
                case '/':
                    if (secondNumber == 0) {
                        System.out.println("다시 입력하세요. 나누기에서 두번째 수는 0이 될 수 없습니다.");
                        realOperation = false; // 나눗셈 실패 시 끝
                    } else {
                        result = firstNumber / secondNumber;
                    }
                    break;
                default:
                    System.out.println("사칙연산 기호를 다시 입력하세요.");
                    realOperation = false; // 이상한거 넣을시 끝
            }

            if (realOperation) {
                System.out.println("결과: " + result);
            }

            // exit 입력시 종료 되신 go or 해 입력시 계속 , 그 외 종료
            System.out.println("더 계산하시겠습니까? ('go' 또는 '해'를 입력하면 계속합니다, 그 외는 종료)");
            String input = sc.next();
            if (!input.equals("go") && !input.equals("해")) {
                break;
            }
        }

        sc.close();
    }
}

 

요구사항 1-5

  연산 결과 10개를 저장할 수 있는 배열을 선언 및 생성하고 연산의 결과를 저장합니다

연산의 결과를 저장할 수 있도록 적합한 타입의 배열을 생성합니다

연산의 결과를 비어있는 곳에 저장하기 위해 저장할 때마다 count 합니다

 

요구사항 힌트

public class App {
    public static void main(String[] args) {
        /* 연산의 결과를 저장할 수 있도록 적합한 타입의 배열을 생성합니다. */
        /* 연산의 결과가 저장된 배열의 마지막 index를 저장하는 변수를 선언 */
        Scanner sc = new Scanner(System.in);
        ...
        System.out.println("결과: " + result);
        /* 연산의 결과를 배열에 저장합니다. */
        /* index를 증가 시킵니다. */
        ...
    }
}

구현코드

public class App {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 배열생성
        int[] results = new int[10];
        int index = 0; // 초기화

        while (true) {
            System.out.print("첫 번째 숫자를 입력하세요: ");
            int firstNumber = sc.nextInt();

            System.out.print("사칙연산 기호를 입력하세요: ");
            char operator = sc.next().charAt(0);

            System.out.print("두 번째 숫자를 입력하세요: ");
            int secondNumber = sc.nextInt();

            int result = 0;
            boolean realOperation = true;

            switch (operator) {
                case '+':
                    result = firstNumber + secondNumber;
                    break;
                case '-':
                    result = firstNumber - secondNumber;
                    break;
                case '*':
                    result = firstNumber * secondNumber;
                    break;
                case '/':
                    if (secondNumber == 0) {
                        System.out.println("다시 입력하세요. 나누기에서 두번째 수는 0이 될 수 없습니다.");
                        realOperation = false;
                    } else {
                        result = firstNumber / secondNumber;
                    }
                    break;
                default:
                    System.out.println("사칙연산 기호를 다시 입력하세요.");
                    realOperation = false;
                    System.exit(0);
            }

            if (realOperation) {
                System.out.println("결과: " + result);
                // 결과를 배열에 저장
                if (index < 10) {
                    results[index] = result;
                    index++; // 인덱스 증가
                    System.out.println("현재 저장된 결과의 수: " + index); //계산할때마다 몇개저장된지 몰라서 넣음
                } else {
                    System.out.println("10개초과");
                }
            }

            // 계산 계속 여부 확인
            System.out.println("더 계산하시겠습니까? ('go' 또는 '해'를 입력하면 계속합니다, 그 외는 종료)");
            String input = sc.next();
            if (!input.equals("go") && !input.equals("해")) {
                break;
            }
        }
        // 배열에 저장된 모든 결과 출력
        System.out.println("저장된 결과:");
        for (int i = 0; i < index; i++) {
            System.out.println("결과 " + (i + 1) + ": " + results[i]);
        }

        sc.close();
    }
}

요구사항 1-6

 연산 결과가 10개를 초과하는 경우 가장 먼저 저장된 결과를 삭제하고

새로운 연산 결과가 저장될 수 있도록 소스 코드를 수정합니다.

 

현재 저장된 index가 마지막(9)라면 가장 먼저 저장된 결과 값이 삭제 되고

새로운 결과 값이 마지막 index에 저장될 수 있도록 구현합니다

Hint : 결과 값들이 한칸씩 앞으로 이동되면 되지 않을까?

 

요구사항 힌트

public class App {
    public static void main(String[] args) {
        ...
        System.out.println("결과: " + result);
        ...
        /* 위 요구사항에 맞게 구현 */
        ...
        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
    }
}

구현코드

            if (realOperation) {
                System.out.println("결과: " + result);
                if (index < 10) {
                    results[index] = result;
                    index++; // 인덱스 증가
                } else {
                    // 한칸씩 이동
                    for (int i = 1; i < 10; i++) {
                        results[i - 1] = results[i];
                    }
                    results[9] = result;
                }
                System.out.println("현재 저장된 결과의 수: " + index);
            }
            System.out.print("현재 저장된 결과의 수: " + index);
            System.out.print(" (");
            for (int i = 0; i < index; i++) {
                System.out.print(results[i] + (i < index - 1 ? ", " : "")); // 옮겨지나 확인
            }
            System.out.println(")");

            // 더 계산 하려면 'go' '해' 입력 
            /*System.out.println("더 계산하시겠습니까? ('go' 또는 '해'를 입력하면 계속합니다, 그 외는 종료)");
            String input = sc.next();
            if (!input.equals("go") && !input.equals("해")) {
                break;
            }
             */

            // exit 입력하면 멈추기
            System.out.println("계속하시려면 아무 키나 입력하세요 ('exit'를 입력하면 종료합니다)");
            String input = sc.next();
            if ( input.equalsIgnoreCase("exit") ||  input.equalsIgnoreCase("ㄷ턋")) {
                break;
            }
        }
        // 배열에 저장된 모든 결과 출력
        System.out.println("저장된 결과:");
        for (int i = 0; i < index; i++) {
            System.out.println("결과 " + (i + 1) + ": " + results[i]);
        }

        sc.close();
    }

요구사항 1-7

 연산 결과가 10개로 고정되지 않고 무한이 저장될 수 있도록 소스 코드를 수정합니다

JCF(Java Collection Framework)를 사용합니다. (e.g. List, Set …)

“remove”라는 문자열을 입력받으면 가장 먼저 저장된 결과가 삭제될 수 있도록 구현합니다.

 

요구사항 힌트

public class App {
    public static void main(String[] args) {
		    /* 적합한 컬렉션 타입의 변수 선언 */
        ...
        System.out.println("결과: " + result);
        /* 배열에서 컬렉션으로 변경됨으로써 변경해야하는 부분 구현 */
        System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
        /* 위 요구사항에 맞게 구현 */
        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
    }
}

구현코드

        // ArrayList 생성
        List<Integer> results = new ArrayList<>();
        
        if (realOperation) {
                System.out.println("결과: " + result);
                results.add(result); // 결과를 리스트에 추가
                System.out.println("현재 저장된 결과의 수: " + results.size() + " " + results);

                System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
                String removeCmd = sc.next();
                if (removeCmd.equalsIgnoreCase("remove")) {
                    if (!results.isEmpty()) {
                        results.remove(0);
                        System.out.println("첫 번째 결과가 삭제되었습니다.");
                    } else {
                        System.out.println("삭제할 결과가 없습니다.");
                    }
                }
            }
            // 계속 계산할지 묻는 부분
            System.out.println("더 계산하시겠습니까? ('exit'를 입력하면 종료합니다)");
            String input = sc.next();
            if (input.equalsIgnoreCase("exit")) {
                break;
            }
        }
        // 저장된 모든 결과 출력
        System.out.println("최종 저장된 결과:");
        for (int i = 0; i < results.size(); i++) {
            System.out.println("결과 " + (i + 1) + ": " + results.get(i));
        }

        sc.close();

 

요구사항 1-8

“inquiry”라는 문자열이 입력되면 저장된 연산 결과 전부를 출력합니다

foreach(향상된 for문)을 활용하여 구현 해봅니다

 

요구사항 힌트

public class App {
    public static void main(String[] args) {
        ...
        System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
        ...
        System.out.println("저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
        /* 위 요구사항에 맞게 구현 */
        System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
    }
}

 

구현코드

           if (realOperation) {
                System.out.println("결과: " + result);
                results.add(result);
                System.out.println("현재 저장된 결과의 수: " + results.size() + " " + results);
                //저장된 결과 , 결과의수 출력 ( 이거는 계속 )


                System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
                String removeCmd = sc.next();
	@@ -63,8 +65,20 @@ public static void main(String[] args) {
                        System.out.println("삭제할 결과가 없습니다.");
                    }
                }
                System.out.println("저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
                String inquiryLook = sc.next();
                if (inquiryLook.equalsIgnoreCase("inquiry")) {
                    if (!results.isEmpty()) {
                        System.out.println("저장된 모든 결과:");
                        for (int res : results) {
                            System.out.println(res);
                        }
                    } else {
                        System.out.println("저장된 결과가 없습니다.");
                    }
                }
            }

            System.out.println("더 계산하시겠습니까? ('exit'를 입력하면 종료합니다)");
            String input = sc.next();
            if (input.equalsIgnoreCase("exit")) {
	@@ -73,8 +87,8 @@ public static void main(String[] args) {
        }
        // 저장된 모든 결과 출력
        System.out.println("최종 저장된 결과:");
        for (int res : results) {
            System.out.println(res);
        }

        sc.close();

 

마무리🔥

개인과제에서 계산기를 level1단계를 구현했다 1단계는

어찌저찌했지만 2단계는 많이 애를 먹었다

해설과 튜터님의 피드백을 보며 코드를 바꿔야겠다