-
[과제] 계산기 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 - 양의 정수(0 포함)를 입력받기