[JAVA][계산기 만들기-5] Lv3. Generics를 활용한 계산기 만들기
이전 포스팅
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);
}
}
이건 제출 이후 진행되는 과제 해설 세션에서 뭘 의도한건지 봐야겠다..