카테고리 없음

[TIL] Lv.2 Calculator

Twisted 2024. 10. 15. 23:59

오늘은 과제로 나온 계산기 만들기중 Lv.2에 해당하는 계산기를 만들었다.

 

이와 같은 기능들이 들어가 있는 계산기를 만드는게 Lv.2의 과제이다.

 

가장먼저 필요한 사칙연산을 작성하기로 했다.

값을 과제의 조건에서는 숫자를 입력받을때 Int형으로 입력을 받지만 다 만들고 나서 실수형이 안받아지는게 불편해서 

받을때부터 Double형으로 받을 수 있게 만들었다.

 

import java.util.*;
public class Calculator {
    double nowNum = 0;
    private final  ArrayList<Double> arrResult = new ArrayList<>();

    public void getList() {
        for (int i = 0; i < arrResult.size(); i++) {
            System.out.println((i + 1) + "번째 결과: " + arrResult.get(i));
        }
    }

    public void remove(){
        arrResult.remove(0);
    }

    public Calculator(){}

    Operation operation;

    public double calculate(double num1, double num2, char operator){
        switch(operator){
            case '+':
                operation = new AddOperation();
                break;
            case '-':
                operation = new SubtractOperation();
                break;
            case '*':
                operation = new MultiplyOperation();
                break;
            case '/':
                operation = new DevideOperation();
                break;
            default:
                System.out.println("연산자가 없는데요?");
                return 0;
        }
        operation.setNum(num1, num2);
        nowNum = operation.operate();
        arrResult.add(nowNum);
        return nowNum;
    }
}

이 코드는 Calculator 객체의 코드이다.

Main에서 Calculator calculator = new Calculator();를 통해 객체를 생성한 후 사용을 할 수 있다.

 

가지고 있는 필드로는 계산의 결과값을 나타내는 nowNum과 이 계산 기록들을 저장할 arrResult를 ArrayList로 선언했다.

 

Main에서 숫자와 연산을 입력받아 calculator.calculate(매개변수들);을 사용하게 되면 각각의 연산기호에 맞는 연산이 진행된다.

 

다 똑같이 생겼으니 AddOperation.java파일 하나만 들고와서 설명 하겠다.

public class AddOperation extends Operation{

    public AddOperation(){}

    double operate(){
        result = a + b;
        return result;
    }

}

이런식으로 +기호가 들어온 경우 Operation operation; 을 통해 선언된 operation 변수를 통해 AddOperation이 선언이 된다. 위에서 Operation operation = new Operation(); 을 왜 안하나요? 할 수도 있다.

이 방법은 선언과 동시에 객체를 생성하는 방법인데 내가 작성한 Operation은 추상 클래스로 double operate()라는 추상메서드를 가지고 있다. 추상 클래스는 직접 인스턴스화를 진행할 수 없고 상속한 자식 클래스를 통해서만 구현이 가능하기 때문에 이를 상속받은 Add, Sub, Mul, Div 의 클래스를 만들도록 operation = new  AddOpeartaion();의 꼴을 가지고 있다.

 

 

do {

    System.out.println("첫번째 숫자를 입력해주세요 :");
    firstNum = scanner.nextDouble();
    System.out.println("두번째 숫자를 입력해주세요 :");
    secondNum = scanner.nextDouble();
    scanner.nextLine();
    System.out.print("사칙연산 기호를 입력하세요: ");
    char operator = scanner.next().charAt(0);
    scanner.nextLine();

    result = calculator.calculate(firstNum, secondNum, operator);
    System.out.println("결과입니다 : " + result + "\n");

    System.out.println("옵션을 선택해주세요.  (1. 이어서 계산하기   2.끝내기   3.기록보기)  :");
    use = scanner.nextLine();
    switch(use){
        case "1":
            System.out.println("가장 먼저 저장된 데이터를 삭제하시겠습니까? (Y/N)");
            String yn = scanner.nextLine();
            if(yn.equals("Y")){
                calculator.remove();
            }
            continue;
        case "2":
            action = false;
            break;
        case "3":
            calculator.getList();
    }

}while(action);

이게 Main.java의 주요 기능이 담긴 코드이다.

앞서 말한 calculator.calculate()를 통한 연산이 끝나게 되면 결과를 알려주고 옵션 선택을 통해 이어 계산을 하거나 끝내거나 여태껏 진행도니 기록을 볼 수 도 있다.

 

do-while문을 통해서 계산기의 계산이 끝나고 나서 옵션을 선택했을때 끝내기를 선택한 경우 while의 조건인 action이 false로 바뀌게 되어 계산기를 종료하도록 만들었다.