TIL

[계산기 만들기] 계산기를 만들기 3일차

oceanflow 2025. 1. 9. 23:51
package com.example.calculator3;

import java.util.LinkedList;
import java.util.Scanner;

public class App {
    public static void main(String[] args) {


        Scanner scan = new Scanner(System.in);
        ArithmeticCalculator cal = new ArithmeticCalculator();
        boolean reVal = true;
        double result = 0;

        while (reVal) {
            System.out.print("계산할 첫번째 숫자를 입력하세요! : ");
            double a = scan.nextDouble();

            System.out.print("계산할 두번째 숫자를 입력하세요! : ");
            double b = scan.nextDouble();

            System.out.print("사칙연산 기호를 입력하세요! : ");
            String c = scan.next();
            char allSym = c.charAt(0);

            cal.calculate(a, b, allSym);
            LinkedList<Double> results = cal.getResultData();

            if (results.size() > 6)
                cal.setRemoveFirstResult();

            System.out.printf("결과 : %.2f\n", results.getLast());
            System.out.println("========================");
            System.out.println("전체 계산 기록: " + results);
            System.out.println();

            System.out.println("더 계산하시겠습니까? (exit 입력 시 종료) : ");
            String rework = scan.next();

            if (rework.equals("exit")) {
                reVal = false;
            }
        }
    }
}

 

package com.example.calculator3;

import java.util.LinkedList;

public class ArithmeticCalculator {
    private LinkedList<Double> resultData = new LinkedList<>();

    public LinkedList<Double> getResultData() {
        return resultData;
    }

    public void setRemoveFirstResult() {
        if (!resultData.isEmpty()) {
            resultData.removeFirst();
        }
    }

    public <T extends Number> void calculate(T a, T b, char symbol) {
        OperatorType operator = OperatorType.fromSymbol(symbol);
        double result = operator.calculate(a, b);
        resultData.add(result);
    }
}

 

package com.example.calculator3;

public enum OperatorType {

    PLUS('+') {
        @Override
        public <T extends Number> double calculate(T a, T b) {
            return a.doubleValue() + b.doubleValue();
        }
    },
    MINUS('-') {
        @Override
        public <T extends Number> double calculate(T a, T b) {
            return a.doubleValue() - b.doubleValue();
        }
    },
    MULTIPLY('*') {
        @Override
        public <T extends Number> double calculate(T a, T b) {
            return a.doubleValue() * b.doubleValue();
        }
    },
    DIVIDE('/') {
        @Override
        public <T extends Number> double calculate(T a, T b) {
            if (b.doubleValue() == 0)
                throw new ArithmeticException("0으로 나눌 수 없습니다!");

            return a.doubleValue() / b.doubleValue();
        }
    };

 

 

Enum 타입을 활용하여 연산자 타입에 대한 정보를 관리하고 제너릭을 적용하였다.