코드를 실행하면 사용자로부터 두 개의 숫자와 연산자를 입력받아서 해당 연산을 수행하고 결과를 출력하며, 계산 결과가 출력될 때마다 useMemory 변수가 true로 설정되어 이전 결과를 메모리에 저장된다.
해당 소스코드에는 0으로 나누는 경우에 대한 예외 처리도 포함되어 있으며, 'M' 연산자를 사용하여 현재 결과 값을 메모리에 저장하고, 'R' 연산자를 사용하여 메모리에 저장된 값을 불러와서 계산에 활용할 수 있고, 'C' 연산자를 사용하면 메모리를 초기화 할 수 있다.
소스코드
package domain;
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double num1, num2, result = 0; // 숫자와 결과를 저장하는 변수
char operator; // 연산자를 저장하는 변수
boolean useMemory = false; // 메모리 사용 여부를 저장하는 변수
double memoryValue = 0; // 메모리에 저장된 값
while (true) {
System.out.print("첫 번째 숫자를 입력하세요: ");
num1 = scanner.nextDouble();
System.out.print("두 번째 숫자를 입력하세요: ");
num2 = scanner.nextDouble();
System.out.print("연산자를 입력하세요 (+, -, *, /, ^, M, R, C): ");
operator = scanner.next().charAt(0);
switch (operator) {
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으로 나눌 수 없습니다.");
continue;
}
break;
case '^':
result = Math.pow(num1, num2);
break;
case 'M': // Memory 저장
memoryValue = result;
System.out.println("메모리에 저장되었습니다.");
continue;
case 'R': // Memory 불러오기
if (useMemory) {
num1 = result;
num2 = memoryValue;
} else {
System.out.println("저장된 값이 없습니다.");
continue;
}
break;
case 'C': // Memory 초기화
memoryValue = 0;
useMemory = false;
System.out.println("메모리가 초기화되었습니다.");
continue;
default:
System.out.println("유효하지 않은 연산자입니다.");
continue;
}
System.out.println("결과: " + result);
useMemory = true;
}
}
}
✔️Scanner 클래스: 사용자로부터 입력을 받기 위해 Scanner 클래스를 사용했다.
Scanner(System.in)은 표준 입력으로부터 데이터를 읽어오는 역할을 한다.
✔️num1과 num2: 첫 번째와 두 번째 숫자를 저장하는 변수로, double 타입으로 선언했다.
nextDouble() 메서드를 사용하여 사용자로부터 실수 값을 입력받을 수 있다.
✔️operator: 연산자를 저장하는 변수로, char 타입으로 선언했다.
next().charAt(0)을 사용하여 사용자로부터 입력받은 문자열 중 첫 번째 문자를 추출한다.
✔️switch 문: 입력받은 연산자에 따라 해당 연산을 수행한다.
입력된 연산자가 '+'일 경우 덧셈을 수행하고, '-'일 경우 뺄셈을 수행하고, '*'일 경우 곱셈을 수행하고, '/'일 경우 나눗셈을 수행하고, '^'일 경우 제곱 연산을 수행한다.
'M'일 경우 결과 값을 메모리에 저장하고, 'R'일 경우 메모리에 저장된 값을 불러와서 계산에 사용한다. 'C'일 경우 메모리를 초기화한다.
✔️while 루프: 사용자로부터 반복적으로 입력을 받기 위해 무한 루프를 사용한다
✔️예외 처리: 나눗셈을 수행할 때, 두 번째 숫자가 0인 경우에는 0으로 나눌 수 없으므로 예외 처리가 필요하다. if (num2 != 0)를 사용하여 두 번째 숫자가 0이 아닐 때만 나눗셈을 수행하고, 그렇지 않은 경우에는 "0으로 나눌 수 없습니다."라는 메시지를 출력한다.
✔️useMemory, memoryValue: 메모리 사용 여부와 메모리에 저장된 값을 저장하는 변수로, boolean과 double 타입으로 선언되었다.
✔️ 메모리 관련 기능
'M': 현재 결과 값을 메모리에 저장한다. memoryValue 변수에 result 값을 저장한다.
'R': 메모리에 저장된 값을 불러와서 계산에 사용한다. 이전 계산 결과 result에 저장된 값을 num1으로, 메모리 값 memoryValue를 num2로 설정하여 계산한다.
'C': 메모리를 초기화한다. memoryValue를 0으로 설정하고 useMemory 변수를 false로 설정한다.
실행결과
첫 번째 숫자를 입력하세요: 876
두 번째 숫자를 입력하세요: 283
연산자를 입력하세요 (+, -, *, /, ^, M, R, C): *
결과: 247908.0
첫 번째 숫자를 입력하세요: 0
두 번째 숫자를 입력하세요: 0
연산자를 입력하세요 (+, -, *, /, ^, M, R, C): M
메모리에 저장되었습니다.
첫 번째 숫자를 입력하세요: 10
두 번째 숫자를 입력하세요: 10
연산자를 입력하세요 (+, -, *, /, ^, M, R, C): R
결과: 247908.0
첫 번째 숫자를 입력하세요: 10
두 번째 숫자를 입력하세요: 5
연산자를 입력하세요 (+, -, *, /, ^, M, R, C): ^
결과: 100000.0
첫 번째 숫자를 입력하세요: 100
두 번째 숫자를 입력하세요: 0
연산자를 입력하세요 (+, -, *, /, ^, M, R, C): /
0으로 나눌 수 없습니다.
1. 숫자 876을 입력하였고, 두 번째 입력에서 숫자 283을 입력했다.
연산자로 '*'를 입력하였으므로 두 숫자를 곱한 결과인 247908.0이 출력된다.
2. 숫자 0을 입력하였고, 두 번째 입력에서도 숫자 0을 입력했다.
연산자로 'M'을 입력하였으므로 이전에 계산된 결과인 247908.0이 메모리에 저장된다.
3. 숫자 10을 입력하였고, 두 번째 입력에서 숫자 10을 입력했다.
연산자로 'R'을 입력하였으므로 이전에 메모리에 저장된 값을 사용하여 계산을 수행한다.
이전 결과인 247908.0이 첫 번째 숫자로 설정되고, 메모리 값인 247908.0이 두 번째 숫자로 설정된다. 따라서 결과로 247908.0이 출력된다.
4. 숫자 10을 입력하였고, 두 번째 입력에서 숫자 5를 입력했다.
연산자로 '^'를 입력하였으므로 첫 번째 숫자인 10을 두 번째 숫자인 5번 곱한 값인 100000.0이 출력된다.
5. 숫자 100을 입력하였고, 두 번째 입력에서 숫자 0을 입력했다.
연산자로 '/'를 입력하였으므로 두 번째 숫자인 0으로 나눌 수 없기 때문에 에러 메시지인 "0으로 나눌 수 없습니다."가 출력된다.
이렇게 입력된 숫자와 연산자에 따라 계산이 수행되고, 결과가 출력되는 것을 확인할 수 있다. 메모리 기능을 통해 이전 결과를 저장하고 불러오는 기능도 제대로 동작하는 것으로 보인다.