본 캠프_10일차

졸용·2025년 2월 28일

TIL

목록 보기
11/144

⭐ Lv1. 클래스 없이 기본적인 연산을 수행할 수 있는 계산기 만들기

첫 개인 프로젝트라 문법 이해와 학습을 위해 코드마다 메모처럼 주석처리를 했다. 나중에 익숙해진 문법들부터 차차 주석 제거 예정이다

요구사항 체크리스트 ⬜✅ :

  • 양의 정수(0 포함)를 입력받기

    ✅ Scanner를 사용하여 양의 정수 2개(0 포함)를 전달 받을 수 있다.

    ✅ 양의 정수는 각각 하나씩 전달 받는다.

    ✅ 양의 정수는 적합한 타입으로 선언한 변수에 저장한다.

  • 사칙연산 기호(➕,➖,✖️,➗)를 입력받기

    ✅ Scanner를 사용하여 사칙연산 기호를 전달 받을 수 있다.

    ✅ 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장한다.(charAT(0))

  • 위에서 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행한 후 결과값을 출력하기

    ✅ 사칙연산 기호에 맞는 연산자를 사용하여 연산을 진행한다.

    ✅ 입력받은 연산 기호를 구분하기 위해 제어문을 사용한다. (if switch)

    ✅ 연산 오류가 발생할 경우 해당 오류에 대한 내용을 정제하여 출력한다.

  • 반복문을 사용하되, 반복의 종료를 알려주는 "exit" 문자열을 입력하기 전까지 무한으로 계산을 진행할 수 있도록 소스 코드 수정하기

    ✅ 반복문 사용하기 (for while)

    ✅ 무한으로 반복 수정하기 (처음부터 무한 반복하는 것이 아니라, 위 스텝별로 진행하도록 수정)

⭐ 코딩 & 트러블슈팅 & 실시간 수정

코드를 한 번에 모두 작성한 뒤에 문제점 발견 및 수정 하려면 어디서부터 어느 부분이 문제인지 초보인 나로서는 아직 찾기도, 수정하기도 어려울 것 같아 그때 그때 바로 확인하면서 메모해두었다가 수정하면서 코딩했다

  • 숫자 입력받는 부분에서 num1 = 0 으로 초기값 설정했더니 0 입력시에 다음 입력받기로 넘어가지 않고 첫 번째 숫자를 입력하라는 문구 반복 출력 → num1 = -1 로 수정해서 해결

  • 사칙연산 기호를 char 타입으로 선언한 변수에 저장

  • 사칙연산에서 연산 기호랑 다른 문자 함께 입력 시의 상황 대처 없음

    (예) -5, +3, *f 등등

// 사칙연산 입력받기
char AddSubMulDiv = ' ';  // 변수 선언 (이미 메서드 내에서 선언됨)
boolean validAddSubMulDiv  = false;

while (!validAddSubMulDiv ) {
    System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
    AddSubMulDiv = scanner.next().charAt(0);  // 여기서 다시 선언하지 않고 값을 할당만 합니다.
    
    // 입력값이 사칙연산 기호인지 체크
    if (AddSubMulDiv == '+' || AddSubMulDiv == '-' || AddSubMulDiv == '*' || AddSubMulDiv == '/') {
        validAddSubMulDiv  = true;  // 유효한 연산자면 루프 종료
    } else {
        System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
    }
}

➡️➡️➡️

// 사칙연산 입력받기
        char AddSubMulDiv = ' '; // 초기화
        boolean validAddSubMulDiv = false;

        while (!validAddSubMulDiv) {
            System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
            String operatorInput = scanner.next();
            if (operatorInput.length() == 1 &&
                    (operatorInput.charAt(0) == '+' || operatorInput.charAt(0) == '-' || operatorInput.charAt(0) == '*' || operatorInput.charAt(0) == '/')) {
                validAddSubMulDiv = true;
            } else {
                System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
            }
        }
  • 연산 결과값이 양의 정수가 아닌 경우 연산 안됨

➡️➡️➡️

양의 정수 아니라서가 아니라 어디서 잘못된건지 아예 연산 안됨

➡️➡️➡️

AddSubMulDiv 변수는 사칙연산 기호를 저장하기 위해 선언되었다. 하지만, operatorInput 변수에서 사용자가 입력한 연산자를 AddSubMulDiv에 할당해주지 않아서 발생했던 오류

// 사칙연산 입력받기
        char AddSubMulDiv = ' '; // 초기화
        boolean validAddSubMulDiv = false;

        while (!validAddSubMulDiv) {
            System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
            String operatorInput = scanner.next();
            if (operatorInput.length() == 1 &&
                    (operatorInput.charAt(0) == '+' || operatorInput.charAt(0) == '-' || operatorInput.charAt(0) == '*' || operatorInput.charAt(0) == '/')) {
                AddSubMulDiv = operatorInput.charAt(0); // 연산자를 변수에 할당
                validAddSubMulDiv = true;
            } else {
                System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
            }
        }

  • 숫자 입력받는 부분 while, if 대신에 while, if, else로 수정 시도해보기
// 첫 번째 숫자 입력받기 (0 포함 양의 정수 조건 반복문)
        int num1 = -1;
        while (num1 < 0) {
            System.out.println("첫 번째 숫자를 입력하세요: ");
            num1 = scanner.nextInt();
            if (num1 < 0) {
                System.out.println("잘못된 입력입니다. 0 이상의 수를 입력해주세요.");
            }
        }

➡️➡️➡️

// 첫 번째 숫자 입력받기 (0 포함 양의 정수 조건 반복문)
        boolean validNum1 = false;
        int num1 = -1;

        while (!validNum1) {
            System.out.println("첫 번째 숫자를 입력하세요: ");
            num1 = scanner.nextInt();
            if (num1 >= 0) {
                validNum1 = true;
            } else {
                System.out.println("잘못된 입력입니다. 0 이상의 수를 입력해주세요.");
            }
        }

이 과정에서 while, if문을 더 이해하게 되었지만, 전자의 코드가 더 간략해서 다시 재수정


  • Lv1 완성
package firstproject;

import java.util.Scanner;

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

        while (true) {   // "exit"를 입력하기 전까지 계속 반복

            // 첫 번째 숫자 입력받기 (0 포함 양의 정수 조건 반복문)
            int num1 = -1;
            while (num1 < 0) {   // 0 미만이면 루프 반복하기
                System.out.println("첫 번째 숫자를 입력하세요: ");
                num1 = scanner.nextInt();   // num1에 값 입력받기
                scanner.nextLine();   // 버퍼 비우기
                if (num1 < 0) {
                    System.out.println("잘못된 입력입니다. 0 이상의 수를 입력해주세요.");   // 0 미만이면 메시지 출력하기
                }
            }

            // 사칙연산 입력받기
            char AddSubMulDiv = ' '; // 초기화
            boolean validAddSubMulDiv = false;

            while (!validAddSubMulDiv) {
                System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
                String operatorInput = scanner.next();   // 사칙연산 입력받기
                if (operatorInput.length() == 1 &&
                        (operatorInput.charAt(0) == '+' || operatorInput.charAt(0) == '-' || operatorInput.charAt(0) == '*' || operatorInput.charAt(0) == '/')) {
                    AddSubMulDiv = operatorInput.charAt(0); // 연산자를 변수에 할당
                    validAddSubMulDiv = true;
                } else {
                    System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
                }
            }

            // 두 번째 숫자 입력받기 (0 포함 양의 정수 조건 반복문)
            int num2 = -1;
            while (num2 < 0) {
                System.out.println("두 번째 숫자를 입력하세요: ");
                num2 = scanner.nextInt();
                scanner.nextLine();
                if (num2 < 0) {
                    System.out.println("잘못된 입력입니다. 0 이상의 수를 입력해주세요.");
                }
            }

            int result = 0;

            // 반복문을 사용하되, 반복의 종료를 알려주는 “exit” 문자열을 입력하기 전까지 무한으로 계산을 진행할 수 있도록 소스 코드를 수정하기
            // 무한으로 반복, 수정하기 (처음부터 무한 반복하는 것이 아니라, 위 스텝별로 진행하며 수정)

            // 사칙연산 수행하기
            switch (AddSubMulDiv) {
                case '+':
                    result = num1 + num2;
                    break;

                case '-':
                    result = num1 - num2;
                    break;

                case '*':
                    result = num1 * num2;
                    break;

                case '/':
                    if (num2 != 0) {
                        result = num1 / num2;
                    } else {
                        System.out.println("0으로 나눌 수 없습니다.");
                    }
                    break;
                default:
                    System.out.println("유효하지 않은 연산입니다.");
                    return;
            }

            System.out.println("계산 결과: " + result);

            // 계속 계산할지 물어보기
            String continueInput = "";
            boolean validInput = false;
            while (!validInput) {
                System.out.println("계속 계산하시겠습니다? (yes / exit): ");
                continueInput = scanner.nextLine();   // 엔터를 눌러 빈 줄이 남지 않게 하기
                if (continueInput.equalsIgnoreCase("exit")) {
                    System.out.println("계산기를 종료합니다.");
                    return;
                } else if (continueInput.equalsIgnoreCase("yes")) {
                    validInput = true;
                } else {
                    System.out.println("잘못된 입력입니다. 'yes' '또는 'exit' 를 입력해주세요.");
                }
            }
        }
    }
}
  • 인 줄 알았으나, 숫자 입력받는 부분에서도 숫자 외의 문자 입력시 상황 대처 없음. 바로 실행 종료된다는 문제 또 발견😂😂😂

    (예) _1, %4, ^2

    수정하면서 코드를 아예 전체적으로 수정했다

    더 간략하고 알아보기 쉽게


⭐ 계산기_Lv1 진짜 완성본

package firstproject;

import java.util.Scanner;

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

        while (true) {   // "exit"를 입력하기 전까지 계속 반복

            // 첫 번째 숫자 입력받기
            int num1 = getValidNumber(scanner, "첫 번째 숫자를 입력하세요: ");

            // 사칙연산 입력받기
            char operator = getValidOperator(scanner);

            // 두 번째 숫자 입력받기
            int num2 = getValidNumber(scanner, "두 번째 숫자를 입력하세요: ");

            // 사칙연산 수행 후 결과 출력
            int result = performCalculation(num1, num2, operator);

            if (result != Integer.MIN_VALUE) {
                System.out.println("계산 결과: " + result);
            }

            // 계속 계산할지 물어보기
            if (!getContinueInput(scanner)) {
                System.out.println("계산기를 종료합니다.");
                return;
            }
        }
    }

    // 숫자 입력받기 (유효성 검사 포함)
    private static int getValidNumber(Scanner scanner, String prompt) {
        int num;
        while (true) {
            System.out.println(prompt);
            String input = scanner.nextLine();
            try {
                num = Integer.parseInt(input);
                if (num >= 0) {
                    return num;
                } else {
                    System.out.println("0 이상의 수를 입력해주세요.");
                }
            } catch (NumberFormatException e) {
                System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
            }
        }
    }

    // 사칙연산 입력받기
    private static char getValidOperator(Scanner scanner) {
        while (true) {
            System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
            String operatorInput = scanner.nextLine();
            if (operatorInput.length() == 1 && "+-*/".indexOf(operatorInput.charAt(0)) != -1) {
                return operatorInput.charAt(0);
            } else {
                System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
            }
        }
    }

    // 계속 계산할지 묻기
    private static boolean getContinueInput(Scanner scanner) {
        while (true) {
            System.out.println("계속 계산하시겠습니까? (yes / exit): ");
            String continueInput = scanner.nextLine();
            if (continueInput.equalsIgnoreCase("exit")) {
                return false;
            } else if (continueInput.equalsIgnoreCase("yes")) {
                return true;
            } else {
                System.out.println("잘못된 입력입니다. 'yes' 또는 'exit'를 입력해주세요.");
            }
        }
    }

    // 사칙연산 수행
    private static int performCalculation(int num1, int num2, char operator) {
        switch (operator) {
            case '+':
                return num1 + num2;
            case '-':
                return num1 - num2;
            case '*':
                return num1 * num2;
            case '/':
                if (num2 != 0) {
                    return num1 / num2;
                } else {
                    System.out.println("0으로 나눌 수 없습니다.");
                    return Integer.MIN_VALUE; // 에러 표시
                }
            default:
                System.out.println("잘못된 연산자입니다.");
                return Integer.MIN_VALUE; // 에러 표시
        }
    }
} 

➡️ 프로그램 흐름

  1. 사용자로부터 첫 번째 숫자 입력받기.

  2. 사칙연산 기호 입력받기.

  3. 두 번째 숫자 입력받기.

  4. 연산 수행하고 결과 출력.

  5. 계산을 계속할지 물어보기.

  6. "exit"을 입력하면 종료하고, "yes"를 입력하면 다시 반복.

  7. 이러한 흐름을 통해 프로그램은 사용자가 원하는 계산을 반복적으로 처리


⭐ 미래의 나를 위한 코드 설명

1. 패키지 선언과 Scanner 객체 생성

package firstproject;

import java.util.Scanner;

public class App {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
  • import java.util.Scanner; : 사용자로부터 입력을 받기 위한 클래스. Scanner 클래스를 사용하려면 java.util 패키지를 임포트해야 한다

  • Scanner scanner = new Scanner(System.in); : 사용자로부터 입력을 받기 위해 Scanner 객체를 생성. System.in은 콘솔(터미널)에서 사용자 입력을 받기 위해 사용


2. 무한 반복 루프 시작

        while (true) {   // "exit"를 입력하기 전까지 계속 반복
  • 조건이 항상 true이기 때문에 이 루프는 "exit"을 입력할 때까지 계속해서 반복된다

  • 루프 안에서는 계속해서 계산을 입력받고 결과를 출력한 후, 사용자가 "exit"을 입력하면 프로그램을 종료


3. 첫 번째 숫자 입력받기 (getValidNumber 함수 사용)

            // 첫 번째 숫자 입력받기
            int num1 = getValidNumber(scanner, "첫 번째 숫자를 입력하세요: ");
  • getValidNumber(scanner, "첫 번째 숫자를 입력하세요: ") : 사용자가 유효한 숫자를 입력할 때까지 계속해서 요청하는 함수

  • 이 함수는 숫자가 0 이상인지 확인하고, 유효한 숫자를 받으면 그 값을 num1에 저장한다


4. 사칙연산 기호 입력받기 (getValidOperator 함수 사용)

            // 사칙연산 입력받기
            char operator = getValidOperator(scanner);
  • getValidOperator(scanner): 사용자가 사칙연산 기호(+, -, *, /) 중 하나를 입력할 때까지 반복적으로 요청

  • 올바른 연산자를 입력하면 그 연산자를 반환하고, 그 외의 입력이 들어오면 오류 메시지를 출력하고 다시 입력을 요구

  • 연산자가 유효하면 그 값은 operator 변수에 저장


5. 두 번째 숫자 입력받기 (getValidNumber 함수 사용)

            // 두 번째 숫자 입력받기
            int num2 = getValidNumber(scanner, "두 번째 숫자를 입력하세요: ");
  • getValidNumber(scanner, "두 번째 숫자를 입력하세요: ") : 첫 번째와 마찬가지

6. 사칙연산 수행 (performCalculation 함수 사용)

            // 사칙연산 수행 후 결과 출력
            int result = performCalculation(num1, num2, operator);
  • performCalculation(num1, num2, operator) : 첫 번째 숫자 num1, 두 번째 숫자 num2, 그리고 연산자 operator 를 받아서 계산을 수행하고 결과를 반환

  • switch 문을 사용하여 사칙연산 기호를 처리. 나눗셈만 num2 가 0이면 에러메시지 출력하고 Integer.MIN_VALUE 를 반환

  • Integer.MIN_VALUE 는 계산이 잘못되었을 때 오류를 표시하기 위해 사용된다


7. 계산 결과 출력

            if (result != Integer.MIN_VALUE) {
                System.out.println("계산 결과: " + result);
            }
  • if (result != Integer.MIN_VALUE) : performCalculation 함수에서 결과가 Integer.Min_Value 인 경우는 계산 잘못됐다고 나타내며, 그런 경우 결과를 출력하지 않고 넘어간 뒤에 올바른 계산 결과만 출력

8. 계속할지 여부 물어보기 (getContinueInput 함수 사용)

            // 계속 계산할지 물어보기
            if (!getContinueInput(scanner)) {
                System.out.println("계산기를 종료합니다.");
                return;
            }
  • getContinueInput(scanner) : 사용자가 "yes" 를 입력하면 true 를 반환하고, "exit" 를 입력하면 false 를 반환하고, 그 외의 입력에 대해서는 다시 물어본다.

  • "yes" 입력시 계속 계산 반복, "exit" 입력시 return 을 통해 프로그램 종료


9. getValidNumber 함수

    private static int getValidNumber(Scanner scanner, String prompt) {
        int num;
        while (true) {
            System.out.println(prompt);
            String input = scanner.nextLine();
            try {
                num = Integer.parseInt(input);
                if (num >= 0) {
                    return num;
                } else {
                    System.out.println("0 이상의 수를 입력해주세요.");
                }
            } catch (NumberFormatException e) {
                System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
            }
        }
    }
  • 사용자로부터 유효한 숫자를 입력받기 위한 함수

  • scanner.nextLine() : 사용자가 입력한 값을 문자열로 받는다

  • Integer.parseInt() 메서드를 사용해 문자열을 정수로 반환한다

  • 숫자가 아닌 값을 입력하면 NumberFormatException 이 발생하여 오류 메시지를 출력하고 다시 입력을 받는다

  • 숫자가 () 이상이면 유효한 숫자이므로 그 값을 반환하고, () 미만이면 다시 입력을 받는다


10. getValidOperator 함수

    private static char getValidOperator(Scanner scanner) {
        while (true) {
            System.out.println("사칙연산(+, -, *, /)을 입력하세요: ");
            String operatorInput = scanner.nextLine();
            if (operatorInput.length() == 1 && "+-*/".indexOf(operatorInput.charAt(0)) != -1) {
                return operatorInput.charAt(0);
            } else {
                System.out.println("잘못된 입력입니다. 사칙연산 기호를 입력해주세요.");
            }
        }
    }
  • 사칙연산 기호를 입력받고, 유효한 연산자일 경우에만 그 값을 반환

  • operatorInput.length() == 1 : 입력받은 문자열이 한 글자인지 확인

  • "+-*/".indexOf(operatorInput,charAt(0)) != -1 : 그 문자가 유효하 연산자인지 확인

  • 잘못된 입력 하면 오류 메시지를 출력하고 다시 입력 받기


11 getContinueInput 함수

    private static boolean getContinueInput(Scanner scanner) {
        while (true) {
            System.out.println("계속 계산하시겠습니까? (yes / exit): ");
            String continueInput = scanner.nextLine();
            if (continueInput.equalsIgnoreCase("exit")) {
                return false;
            } else if (continueInput.equalsIgnoreCase("yes")) {
                return true;
            } else {
                System.out.println("잘못된 입력입니다. 'yes' 또는 'exit'를 입력해주세요.");
            }
        }
    }
  • 사용자가 "yes" 입력하면 계산 계속하고, "exit" 입력하면 프로그램 종료

  • 그 외의 입력은 메시지 출력하고 다시 물어본다


12. performCalculation 함수

    private static int performCalculation(int num1, int num2, char operator) {
        switch (operator) {
            case '+':
                return num1 + num2;
            case '-':
                return num1 - num2;
            case '*':
                return num1 * num2;
            case '/':
                if (num2 != 0) {
                    return num1 / num2;
                } else {
                    System.out.println("0으로 나눌 수 없습니다.");
                    return Integer.MIN_VALUE; // 에러 표시
                }
            default:
                System.out.println("잘못된 연산자입니다.");
                return Integer.MIN_VALUE; // 에러 표시
        }
    }
  • performCalculation 함수 : 연산자에 맞는 계산을 수행하는 함수

  • switch 문 : 입력받은 연산자에 따라 덧셈, 뺄셈, 곱셈, 나눗셈 처리

  • 나눗셈에서 num2 ㅣ 0이면 오류메시지 출력하고 Integer.Min_Value 를 반환

  • 잘못된 연산자 입력하면 메시지 출력하고 Integer.Min_Value 를 반환

profile
꾸준한 공부만이 답이다

0개의 댓글