ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [과제] 계산기 Lv1
    내일배움캠프/과제 2025. 3. 5. 19:57

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

     

    1️⃣ 과제 조건

    • 양의 정수(0 포함)를 입력받기
      • Scanner를 사용하여 양의 정수 2개(0 포함)를 전달 받을 수 있음
      • 양의 정수는 각각 하나씩 전달 받음
      • 양의 정수는 적합한 타입으로 선언한 변수에 저장
      • 예시코드 
        public class App {
            public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
        
                System.out.print("첫 번째 숫자를 입력하세요: ");
                // Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
        		    System.out.print("두 번째 숫자를 입력하세요: ");
                // Scanner를 사용하여 양의 정수를 입력받고 적합한 타입의 변수에 저장합니다.
            }
        }
    • 사칙연산 기호( ➕,➖,✖️,➗ )를 입력받기
      • Scanner를 사용하여 사칙연산 기호를 전달 받을 수 있음
      • 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장 ( charAt(0) )
      • 예시코드
        public class App {
            public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                ...
                System.out.print("사칙연산 기호를 입력하세요: ");
                // 사칙연산 기호를 적합한 타입으로 선언한 변수에 저장합니다. 
            }
        }
         
    •  위에서 입력받은 양의 정수 2개와 사칙연산 기호를 사용하여 연산을 진행한 후 결과값을 출력하기
      • 키워드 : if switch
      • 사칙연산 기호에 맞는 연산자를 사용하여 연산 진행
      • 입력받은 연산 기호를 구분하기 위해 제어문 사용
      • 연산 오류가 발생할 경우 해당 오류에 대한 내용을 정제하여 출력
        • ex) "나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다."
        • 예시코드
          public class App {
              public static void main(String[] args) {
                  Scanner sc = new Scanner(System.in);
                  ...
                  int result = 0;
                  /* 제어문을 활용하여 위 요구사항을 만족할 수 있게 구현합니다.*/
                  System.out.println("결과: " + result);
              }
          }
    • 반복문을 사용하되, 반복의 종료를 알려주는 “exit” 문자열을 입력하기 전까지 무한으로 계산을 진행할 수 있도록 소스 코드를 수정하기
      • 키워드 : 무한으로 반복, 수정 (처음부터 무한 반복하는 것이 아니라, 위 스텝별로 진행하며 수정)
      • 반복문을 사용 (예를 들어, 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을 입력 받으면 반복 종료 */
            }
        }

    2️⃣ 구현

    우선 나는 Scanner 말고 BufferedReader 를 사용하였다.

     

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));​

     

    BufferedReader

    • 내부에 버퍼를 사용하여 입력 스트림으로부터 데이터를 한 번에 읽어오기 때문에, 대용량 데이터 처리 시 효율적이고 빠름.
    • 단, 문자열을 읽은 후 숫자나 다른 자료형으로 변환하려면 추가적인 파싱 작업이 필요.

     

    이러한 이유로 사용하였다.

     

    List<String> operatorList = new ArrayList<>(Arrays.asList("+", "-", "*", "/"));

     

    List를 활용하여 사칙연산 기호 List 를 만들었다.

     

     while (!exitStr.equals("exit")) { // exit 를 입력받을 때 까지 실행
     	...
    	System.out.print("더 계산하시겠습니까? (exit 입력 시 종료) : ");
    	exitStr = br.readLine().trim();
     }

     

    마지막에 입력 받는 exitStr 이 exit 일 때 까지 계산기가 작동하도록 while 문을 사용하였다.

     

    num1 = -1;
    num2 = -1;
    
    while (num1 < 0) { // 양의 정수를 입력 받을 때 까지
        System.out.print("첫번째 양의 정수를 입력해주세요 : ");
        num1 = Integer.parseInt(br.readLine());
    }
    
    while (num2 < 0) { // 양의 정수를 입력 받을 때 까지
        System.out.print("두번째 양의 정수를 입력해주세요 : ");
        num2 = Integer.parseInt(br.readLine());
    }
    
    operator = "";
    while (!operatorList.contains(operator)) { // 올바른 사칙연산 기호를 입력 받을 때 까지
        System.out.print("사칙연산 기호를 입력하세요(+, -, *, /) : ");
        operator = br.readLine().trim();
    }

     

    입력 받은 숫자를 저장할 변수  num1, num2 는 먼저 음수로 지정해준 다음 입력받은 숫자가 양의 정수가 될 때 까지 while을 활용하여 반복해주었고, 사칙연산 기호도 list에 속하는 사칙연산 기호를 입력받을 때 까지 반복해주었다.

     

    Integer.parseInt()의 경우 String 을 int 형태로 parsing 해주는 함수이다.

     

    try {
    	...
    } catch (NumberFormatException e) {
    	System.out.println("정수를 입력해주세요.");
    }

    만약 숫자가 아닌 다른 문자열을 int 로 parsing 을 시도할 경우를 대비하여 try-catch 로 Exception 을 처리해주었다.

     

    try {
        // 사칙연산 기호에 따라 분기
        result = switch (operator) {
            case "+" -> num1 + num2;
            case "-" -> num1 - num2;
            case "*" -> num1 * num2;
            case "/" -> num1 / num2;
            default -> throw new IllegalArgumentException(); // 올바르지 않은 값 입력 시
        };
    } catch (IllegalArgumentException e) {
        System.out.println("올바른 사칙연산 기호를 입력해주세요.");
    }

     

    입력받은 사칙연산 기호를 기반으로 switch 문을 작성해주었다.

    +, - , *. / 각각의 경우에 맞는 사칙연산을 수행해준 결과를 return 해준다.

     

    이전에 검증을 받고 넘어오지만 혹시모를 예외를 default 로 throw 처리해주었다.

     

    System.out.printf("%d %s %d = %d \n", num1, operator, num2, result);

     

    printf 함수를 사용하여 각 타입에 맞는 변수들을 입력해주어서 결과를 반환하였다.

    catch (ArithmeticException e) {
        System.out.println("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다.");
    }

     

    만약 정수를 0으로 나눌려고 할 경우 ArithmeticException 이 발생하므로 catch 해주어서 log 를 찍어주었다.

     

    3️⃣ 최종 코드

    import java.io.*;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class App {
    
        public static void main(String[] args) throws IOException {
            // 사칙연산 기호 List
            List<String> operatorList = new ArrayList<>(Arrays.asList("+", "-", "*", "/"));
    
            // 입력기
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            String exitStr = "";
            int num1;
            int num2;
            String operator;
            int result;
    
            System.out.println("계산기를 시작합니다.");
    
            while (!exitStr.equals("exit")) { // exit 를 입력받을 때 까지 실행
                try {
                    num1 = -1;
                    num2 = -1;
    
                    while (num1 < 0) { // 양의 정수를 입력 받을 때 까지
                        System.out.print("첫번째 양의 정수를 입력해주세요 : ");
                        num1 = Integer.parseInt(br.readLine());
                    }
    
                    while (num2 < 0) { // 양의 정수를 입력 받을 때 까지
                        System.out.print("두번째 양의 정수를 입력해주세요 : ");
                        num2 = Integer.parseInt(br.readLine());
                    }
    
                    operator = "";
                    while (!operatorList.contains(operator)) { // 올바른 사칙연산 기호를 입력 받을 때 까지
                        System.out.print("사칙연산 기호를 입력하세요(+, -, *, /) : ");
                        operator = br.readLine().trim();
                    }
    
                    // 사칙연산 기호에 따라 분기
                    result = switch (operator) {
                        case "+" -> num1 + num2;
                        case "-" -> num1 - num2;
                        case "*" -> num1 * num2;
                        case "/" -> num1 / num2;
                        default -> throw new IllegalArgumentException(); // 올바르지 않은 값 입력 시
                    };
    
                    // 결과
                    System.out.printf("%d %s %d = %d \n", num1, operator, num2, result);
    
                    System.out.print("더 계산하시겠습니까? (exit 입력 시 종료) : ");
                    exitStr = br.readLine().trim();
    
                    System.out.println(); // 개행
                } catch (NumberFormatException e) {
                    System.out.println("정수를 입력해주세요.");
                } catch (IllegalArgumentException e) {
                    System.out.println("올바른 사칙연산 기호를 입력해주세요.");
                } catch (ArithmeticException e) {
                    System.out.println("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다.");
                }
            }
            System.out.println("계산기가 종료되었습니다.");
            br.close();
        }
    }

     

    '내일배움캠프 > 과제' 카테고리의 다른 글

    [과제] 키오스크 필수 Lv3  (0) 2025.03.13
    [과제] 키오스크 필수 Lv2  (1) 2025.03.13
    [과제] 키오스크 필수 Lv1  (0) 2025.03.13
    [과제] 계산기 Lv3  (1) 2025.03.06
    [과제] 계산기 Lv2  (0) 2025.03.06
Designed by Tistory.