구현기능
- 사칙연산 + 나누기 몫
- 첫번째 계산한 값 삭제
- 계산한 값 모두 불러오기
- 사칙연산 값 저장, 원 넓이 저장 값 분리
- 원 넓이 구하기
- if문을 활용한 사칙연산 모드와 원넓이 모드 선택가능
App class
package calculator;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArithmeticCalculator arithmeticCalculator = new ArithmeticCalculator();
CircleCalculator circleCalculator = new CircleCalculator();
while (true) {
System.out.println("사칙연산 or 원의 넓이 (press: 1 사칙연산, press: 2 원의 넓이, exit: 종료)");
String choosemath = sc.nextLine();
if (choosemath.equals("1")) {
while (true) {
System.out.println("첫 번째 숫자를 입력하세요:");
double num1 = sc.nextDouble();
System.out.println("두 번째 숫자를 입력하세요:");
double num2 = sc.nextDouble();
sc.nextLine(); // num1, num2 뒤의 줄 바꿈 문자 처리
System.out.println("사칙연산의 기호를 입력하세요 (+, -, *, /,%)");
String operator = sc.nextLine();
if (operator.length() != 1) {
System.out.println("유효하지 않은 연산자입니다. 다시 입력하세요");
continue;
}
double result = arithmeticCalculator.calculate(operator, num1, num2);
if (Double.isNaN(result)) {
continue; // 오류가 발생했으므로 루프의 시작으로 돌아감
}
System.out.println("계산 결과는: " + result);
// 추가 명령어 처리
System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력)");
String std = sc.nextLine();
if (std.equalsIgnoreCase("remove")) {
arithmeticCalculator.removeResult();
System.out.println("첫 번째 결과값이 삭제되었습니다.");
}
// 저장된 연산결과 조회
System.out.println("저장된 연산결과를 조회 (inquiry 입력 시 조회)");
String stf = sc.nextLine();
if (stf.equalsIgnoreCase("inquiry")) {
arithmeticCalculator.inquiryResult();
}
System.out.println("계속 진행하시겠습니까? (yes: 계속, no: 종료)");
String continueChoice = sc.nextLine();
if (continueChoice.equalsIgnoreCase("no")) {
break; // 사칙연산 모드 종료
}
}
} else if (choosemath.equals("2")) {
while (true) {
System.out.println("반지름을 입력하세요:");
double radius = sc.nextDouble();
sc.nextLine(); // num1, num2 뒤의 줄 바꿈 문자 처리
double crresult = circleCalculator.calculateCircleAre(radius);
if (Double.isNaN(crresult)) {
continue; // 오류가 발생했으므로 루프의 시작으로 돌아감
}
System.out.println("계산 결과는: " + crresult);
// 추가 명령어 처리
System.out.println("가장 먼저 저장된 원 넓이 결과를 삭제하시겠습니까? (remove 입력)");
String sta = sc.nextLine();
if (sta.equalsIgnoreCase("remove")) {
circleCalculator.removeResult();
System.out.println("첫 번째 결과값이 삭제되었습니다.");
}
// 저장된 원 넓이 결과 조회
System.out.println("저장된 원 넓이 결과를 조회 (inquiry 입력 시 조회)");
String stb = sc.nextLine();
if (stb.equalsIgnoreCase("inquiry")) {
circleCalculator.inquiryResult();
}
System.out.println("계속 진행하시겠습니까? (yes: 계속, no: 종료)");
String continueChoice = sc.nextLine();
if (continueChoice.equalsIgnoreCase("no")) {
break; // 원 넓이 모드 종료
}
}
} else if (choosemath.equalsIgnoreCase("exit")) {
System.out.println("계산 종료");
break; // 전체 프로그램 종료
} else {
System.out.println("유효하지 않은 입력입니다. 다시 시도해 주세요.");
}
}
sc.close(); // Scanner 자원 해제
}
}
코드 보시다시피 저장 연산결과를 따로 생성해서 코드를 좀 더 간결하게 할려 했지만 무슨 이유인지 따로 생성하면 오류가 난다.
내일 다시 시도해봐야겠다.
Calculator class
package calculator;
import java.util.ArrayList;
import java.util.List;
public class Calculator {
private ArrayList<Double> resultList;
public Calculator() {
this.resultList = new ArrayList<>();
}
public List<Double> getResultList() {
return resultList;
}
public void addResult(double result) {
resultList.add(result);
}
public void removeResult() {
if (!resultList.isEmpty()) {
resultList.remove(0); // 처음 저장된 결과를 삭제
} else {
System.out.println("삭제할 결과가 없습니다.");
}
}
// Placeholder methods to be overridden by subclasses if needed
public void inquiryResult() {
if (resultList.isEmpty()) {
System.out.println("저장된 결과가 없습니다.");
} else {
System.out.println("저장된 연산결과:"); // 리스트에서 값을 불러온다
for (Double item : resultList) {
System.out.println(item);
}
}
}
}
ArithmeticCalculator class
package calculator;
public class ArithmeticCalculator extends Calculator {
private Operation addOperator;
private Operation subtractOperator;
private Operation multiplyOperator;
private Operation divideOperator;
private Operation modOperator;
public ArithmeticCalculator() {
this.addOperator = new AddOperator();
this.subtractOperator = new SubtractOperator();
this.multiplyOperator = new MultiplyOperator();
this.divideOperator = new DivideOperator();
this.modOperator = new ModOperator(); // 새로운 연산자 추가
}
public double calculate(String operator, double num1, double num2) {
double result = 0;
try {
switch (operator) {
case "+":
result = addOperator.operate(num1, num2);
break;
case "-":
result = subtractOperator.operate(num1, num2);
break;
case "*":
result = multiplyOperator.operate(num1, num2);
break;
case "/":
result = divideOperator.operate(num1, num2);
break;
case "%": // 나머지 연산 추가
result = modOperator.operate(num1, num2);
break;
default:
System.out.println("유효하지 않은 연산자입니다. 다시 입력하세요.");
return Double.NaN; // 유효하지 않은 연산자
}
} catch (ArithmeticException e) {
System.out.println(e.getMessage()); // 예외 메시지 출력
return Double.NaN; // Not a Number
}
addResult(result);
return result;
}
}
private를 이용해 ArithmeticCalculator class 안에서만 접근가능하게 하고 연산자 클래스를 참조 가능하게 this문을 사용하였다.
(조상 클래스는 super, 같은 클래스에 다른 생성자 호출은 this())
AddOperator class
package calculator;
public class AddOperator implements Operation { //더하기 클래스
public double operate(double num1, double num2){
return num1 + num2;
}
}
더하기 연산자 클래스
SubstractOperator class
package calculator;
public class SubtractOperator implements Operation {
public double operate(double num1, double num2) {
return num1 - num2;
}
}
빼기 연산자 클래스
MultiplyOperator class
package calculator;
public class MultiplyOperator implements Operation {
public double operate(double num1, double num2) {
return num1 * num2;
}
}
곱하기 연산자 클래스
DividOperator class
package calculator;
public class DivideOperator implements Operation{
public double operate(double num1, double num2) {
if (num2 == 0) {
throw new ArithmeticException("0으로 나눌 수 없습니다.");
}
return num1 / num2;
}
}
나누기 연산자 클래스
num2가 0일 경우 나누지 못하게 예외처리하였다.
ModOperator class
package calculator;
public class ModOperator implements Operation{
public double operate(double num1, double num2) {
if (num2 == 0) {
throw new ArithmeticException("0으로 나눌 수 없습니다.");
}
return num1%num2;
}
}
나누기 몫도 나누기 클래스와 동일하게 예외처리를 하였다.
CircleCalculator class
package calculator;
public class CircleCalculator extends Calculator {
public static final double PI = 3.14159265358979323846;
public double calculateCircleAre(double radius) {
double circleresult = 0;
if (radius > 0) {
circleresult = radius * radius * PI;
} else {
System.out.println("유효하지 않은 반지름입니다. 다시 입력하세요.");
return Double.NaN; // 유효하지 않은 반지름
}
// 최근 원넓이 계산 결과 저장
addResult(circleresult);
return circleresult;
}
}
파이값은 변하면 안되기 때문에 static final문을 사용하여 고정시켜놨다
값은 0이상일 경우만 true
결과 값은 circleresult로 간다
interface Operation
package calculator;
public interface Operation {
double operate(double num1, double num2);
}
interface정의(매개변수를 num1, num2를 생성하였다.)
interface를 처음 다뤄봐서 어떻게 정의하는지 찾아보느라 시간좀 걸린듯...;
알고리즘
'Java로 이용한 기능' 카테고리의 다른 글
자바로 이용해 만든 일반 계산기(사칙연산만 가능) (0) | 2024.07.25 |
---|