
오늘은 CH2 Java 계산기 과제를 해보았다.
저번 주, 어제 틈틈히 Java 강의를 들어서 오늘 바로 과제를 진행할 수 있었다.
클래스를 사용하지 않는 계산기:
필수 [STEP 1] : 클래스 없이 자바의 기본 문법만을 사용하여 구현한 계산기
클래스를 활용한 계산기:
필수 [STEP 2] : 객체 지향 개념을 적용하여 클래스 정의, 연산을 수행하는 메소드 작성한 계산기
도전 [STEP 3] : Java의 Enum, 제네릭, 람다 & 스트림을 적용한 계산기

Hello, Calculator! 잘 출력 되는 모습
이번 과제를 받고 단순히 기능을 구현하는 것보다
어떻게 접근하고 설계하는지가 더 중요한 과제
라는 느낌을 받았다.
그래서 바로 시작하기 보다는
어떻게 풀어나갈지를 정리해보기로 했다.
사용자 인터페이스는 콘솔 기반으로 결정했다.
이번 과제의 필수 목표는 계산 로직 자체에 있다고 생각이 되어 우선은 콘솔에서 수식을 입력받고 결과를 출력하는 방식으로 진행할 것이다.
추후에 GUI로 구현하는 것도 해볼 예정이다.
또한 계산기에서 발생할 수 있는 예외 상황도 함께 고려했다.
특히 0으로 나누는 경우나 잘못된 수식이 입력되는 경우에는
프로그램이 종료되지 않고,
오류 메시지를 출력한 뒤 다시 입력을 받을 수 있도록 처리하고 싶었다.
각 연산은 메서드 단위로 분리해 하나의 메서드가 하나의 역할만 하도록 구현하려고 한다.
이렇게 하면 코드가 길어지더라도 가독성을 유지할 수 있고, 이후 기능을 추가하거나 수정하기도 쉬울 것이라 생각했다.
특히 괄호와 연산자 우선순위를 처리해야 하기 때문에,
단순히 if/else로 계산하는 방식 보다는
문자열 형태의 수식을 해석해서 계산하는 구조로 설계하는 것이 필요하다고 판단했다.
Step 1에서는 클래스 없이 기본적인 연산을 수행하는 계산기를 만드는 것이 목표였기 때문에, 별도의 Calculator 클래스를 만들지 않고 App 클래스의 main 메서드 안에서 모든 기능을 구현했다.
또한 계산기가 한 번 계산하고 끝나는 구조가 아니라, 사용자가 종료를 입력하기 전까지 계속 계산할 수 있어야 하므로 전체 로직을 반복문 안에 넣는 방식으로 구성했다.
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
// 입력 → 연산 → 출력 → 종료여부 확인
}
}
}
사용자 입력은 Scanner를 사용해 받았다.
숫자 입력은 nextInt()로 두 번 받아 각각 num1, num2에 저장했고, 연산자는 문자열로 입력받은 뒤 charAt(0)을 사용해 첫 글자만 char로 가져왔다.
이렇게 하면 사용자가 + 같은 기호를 입력했을 때 조건문에서 쉽게 비교할 수 있다.
System.out.print("첫 번째 숫자를 입력하세요: ");
int num1 = sc.nextInt();
System.out.print("두 번째 숫자를 입력하세요: ");
int num2 = sc.nextInt();
System.out.print("사칙연산 기호를 입력하세요 (+, -, *, /): ");
char operator = sc.next().charAt(0);
연산자에 따라 다른 계산을 수행해야 하므로 switch문을 사용했다.
+, -, *, / 각각의 케이스에서 연산을 수행하고 결과를 result 변수에 저장한다.
switch를 사용하면 연산자에 따른 분기가 한눈에 보이고, if-else 체인보다 가독성이 좋다고 판단했다.
int result = 0;
boolean isValid = true;
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
// 나눗셈 예외처리는 아래 “예외 처리” 파트 참고
break;
default:
System.out.println("지원하지 않는 연산자입니다.");
isValid = false;
}
나눗셈의 경우 두 번째 숫자가 0이면 오류가 발생할 수 있으므로, / 케이스에서 num2 == 0인지 먼저 검사했다.
0으로 나누는 상황에서는 프로그램이 종료되지 않도록 오류 메시지를 출력하고, 결과 출력은 하지 않도록 isValid라는 플래그 변수를 사용했다.
또한 ₩+ - * /₩외의 문자가 입력될 수 있기 때문에 default 케이스에서 "지원하지 않는 연산자" 메시지를 출력하도록 처리했다.
case '/':
if (num2 == 0) {
System.out.println("나눗셈 연산에서 분모(두 번째 숫자)에 0이 입력될 수 없습니다.");
isValid = false;
} else {
result = num1 / num2;
}
break;
default:
System.out.println("지원하지 않는 연산자입니다.");
isValid = false;
package com.example.calculator.step1;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
// Scanner: 콘솔로부터 입력을 받기 위한 도구
Scanner sc = new Scanner(System.in);
// while(true): 무한 반복(계산을 계속 진행하기 위해)
// 사용자가 "exit"을 입력하면 break로 반복을 끝낸다.
while (true) {
// 1) 첫 번째 숫자 입력 받기
System.out.print("첫 번째 숫자를 입력하세요: ");
int num1 = sc.nextInt(); // 사용자가 입력한 정수를 num1에 저장
// 2) 두 번째 숫자 입력 받기
System.out.print("두 번째 숫자를 입력하세요: ");
int num2 = sc.nextInt(); // 사용자가 입력한 정수를 num2에 저장
// 3) 사칙연산 기호 입력 받기
// sc.next()는 문자열(String)로 입력을 받음
// charAt(0)은 그 문자열의 첫 번째 글자를 char로 가져옴
System.out.print("사칙연산 기호를 입력하세요 (+, -, *, /): ");
char operator = sc.next().charAt(0);
// 결과를 담을 변수, 초기값 0
int result = 0;
// 정상 연산 여부를 표시하는 변수
// 0으로 나누기 / 지원하지 않는 연산자 등의 상황에서 false로 바꿈
boolean isValid = true;
// 4) 연산자에 따라 다른 계산을 수행하기 위해 switch 사용
switch (operator) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
// 나눗셈은 두 번째 숫자가 0이면 오류가 발생하므로 예외 처리
if (num2 == 0) {
System.out.println("나눗셈 연산에서 분모(두 번째 숫자)에 0이 입력될 수 없습니다.");
isValid = false; // 정상 연산이 아니므로 결과를 출력하지 않게함
} else {
result = num1 / num2; // int 나눗셈이므로 소수점은 버려짐
}
break;
default:
// + - * / 가 아닌 다른 문자를 입력한 경우
System.out.println("지원하지 않는 연산자입니다.");
isValid = false;
}
// 5) 정상 연산일 때만 결과 출력
if (isValid) {
System.out.println("결과: " + result);
}
// 6) 계속 계산할지 종료할지 입력 받기
System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
String answer = sc.next(); // exit 입력 여부 확인
// 7) exit이면 반복문 종료
if (answer.equals("exit")) {
System.out.println("계산기를 종료합니다.");
break;
}
// exit이 아니면 while문이 다시 반복되면서 다음 계산을 진행
}
// Scanner 닫기: 프로그램 종료 직전에 닫아주면 좋음
sc.close();
}
}

