개발하는 햄팡이

[JAVA][계산기 만들기-5] Lv3. Generics를 활용한 계산기 만들기 본문

Back-End/Java

[JAVA][계산기 만들기-5] Lv3. Generics를 활용한 계산기 만들기

hampangee 2025. 4. 23. 06:08

이전 포스팅

https://bitj-bitbox.tistory.com/43

 

[JAVA][계산기 만들기-4] Lv3. Enum을 활용한 계산기 만들기

https://bitj-bitbox.tistory.com/40 [JAVA][계산기 만들기-1] github 라벨 편집, Issue Template 생성, PR Template 생성저번 주에 HTML, CSS, JavaScript를 사용하여 간단한 팀소개 페이지 만들기가 끝나고이번 주 부터는 Jav

bitj-bitbox.tistory.com


 

 

 

음..

제네릭을 활용해서 여러 타입을 받을 수 있게 하라고 되어있는데 나는 연산 메소드를 열거형 OperatorType에 만들어서

새로운 계산기를 하나 더 만들어야 할 것 같다.

OperatorType 파일을 수정하고 싶지는 않고...

새로 다시 만들기로 했다.

 

그래서 GenericsCalculator라는 이름으로 계산기 코드를 복제하고 제네릭을 활용한 계산기로 만들기로 했다.

T extends Number로 제한하면 숫자만 들어올 수 있기 때문에 연산이 알아서 잘 될줄 알았는데

Number에 포함된 BigInteger때문에 a-b 같은 간단한 연산을 못하는 상황

 

이거 각 매개변수 타입마다 오버로딩을 해줘야되는건가..근데 그럴거면 제네릭을 왜 써...ㅜ

 

 

제네릭 클래스를 어떻게 만들어야할까 도저히 감이 안와서 그냥 제네릭 메소드로만 구현했다..

어쨌든 피연산자로 여러 타입을 받을 수 있게 했으니 요구사항을 만족한게 아닐까..?

package calculator;

import java.util.LinkedList;
import java.util.List;

public class GenericCalculator {
    private final List<Double> results;

    public <S extends Number, U extends Number> double calculate(S num1, U num2, char operator) {
        double doubleNum1 = num1.doubleValue();
        double doubleNum2 = num2.doubleValue();
        double result = 0;

        switch (operator) {
            case '+':
                result = doubleNum1 + doubleNum2;
                break;
            case '-':
                result = doubleNum1 - doubleNum2;
                break;
            case '*':
                result = doubleNum1 * doubleNum2;
                break;
            case '/':
                if (doubleNum2 == 0) {
                    throw new ArithmeticException("0으로 나눌 수 없습니다.");
                }

                result = doubleNum1 / doubleNum2;
                break;
            default:
                System.out.println("[Error] : 알 수 없는 연산자입니다.");
        }

        this.results.add(result);
        return result;
    }

    public GenericCalculator() {
        this.results = new LinkedList<>();
    }

    public List<Double> getResults() {
        return this.results;
    }

    public void setResults(List<Double> newResults) {
        this.results.clear();
        if (newResults != null) {
            this.results.addAll(newResults);
        }
    }

    public void deleteFirstResult() {
        this.results.remove(0);
    }


}

 

 

 

이건 제출 이후 진행되는 과제 해설 세션에서 뭘 의도한건지 봐야겠다..