- 사칙연산을 수행하는 계산기 ArithmeticCalculator 클래스와 원과 관련된 연산을 수행하는 계산기 CircleCalculator 클래스 2개를 구현합니다.
- 기존에 만들어둔 Calculator 클래스를 수정합니다
- 수정한 Calculator 클래스를 활용하여 ArithmeticCalculator, CircleCalculator 클래스를 구현 해봅니다. (상속)
- 위 요구사항을 구현하게되면 App 클래스의 main 메서드에 오류가 발생할 겁니다.
- 구현한 클래스들을 활용하여 오류가 발생하지 않고 활용될 수 있도록 수정 해보세요!
- 기존에 사칙연산을 저장하던 컬렉션 필드의 타입을 Double로 변경해도 괜찮습니다.
- 필드의 접근 제어자를 변경해도 괜찮습니다.
이 문제를 풀면서 상속에 대해 다시 생각해 보게 되었다. 자식클래스보다 부모 클래스가 더 큰 범위인지 부모클래스보다 자식클래스가 더 큰 범위인지 헷갈렸다.
여기서 정리를 하자면,
1. 부모클래스에 새로운 필드와 메서드가 추가되면 자식 클래스는 이를 상속받아 사용할 수 있다.
2. 자식 클래스에 새로운 필드와 메서드가 추가되어도 부모클래스는 어떠한 영향도 받지 않는다.
3. 따라서 자식 클래스의 멤버 개수는 부모클래스와 항상 같거나 많다.
이렇게 정리를 할 수 있다.
이렇게 정리를 된 개념을 가지고 위의 문제를 해결해 보았다.
import java.util.ArrayList;
import java.util.List;
public class Calculator {
private List<Integer> res;
private List<Double> circle_res;
// 3.14 반지름은 변하지 않는 값이라 변경할 수 없게 final을 사용하여 작성
final double pi = 3.14;
// 필드에 접근해 가져올수 있도록 Getter 메서드
public List<Integer> getRes() {
return res;
}
// 필드에 접근해 수정할 수 있도록
public void setRes(List<Integer> res) {
this.res = res;
}
public List<Double> getCircle_res() {
return circle_res;
}
public void setCircle_res(List<Double> circle_res) {
this.circle_res = circle_res;
}
public Calculator(){
res = new ArrayList<>();
circle_res = new ArrayList<>();
}
// 가장 오래된 값을 지워야 하기때문에 인덱스 0
public void removeResult(){
if(!res.isEmpty()){
res.remove(0);
}
}
public void inquiryResults(){
System.out.println(getRes());
}
public int calculate(int num1, int num2, char op) throws InputExcetpion {
int result = 0;
switch (op){
case '+' -> {
result = num1 + num2;
break;
}
case '-' -> {
result = num1 - num2;
break;
}
case '*' -> {
result = num1 * num2;
break;
}
case '/' -> {
// 분모가 0보다 작거나 같으면 Exception 발생
if(num2 <= 0) {
throw new InputExcetpion();
}
result = num1/num2;
}
// case외에 다른 연산자가 들어오면 Exception 발생
default -> throw new InputExcetpion();
}
res.add(result);
return result;
}
public double calculateCircleArea(int r){
double area = 0;
area = r * r * pi;
circle_res.add(area);
return area;
}
public void circleInquiryResult(){
System.out.println(getCircle_res());
}
}
public class CircleCalculator extends Calculator {
private Calculator calculator;
public CircleCalculator() {
calculator = new Calculator();
}
public double CircleArea(int r) {
return calculator.calculateCircleArea(r);
}
public void result() {
calculator.circleInquiryResult();
}
}
public class ArithmeticCalculator extends Calculator {
private Calculator calculator;
public ArithmeticCalculator() {
calculator = new Calculator();
}
public int add(int x, int y) throws InputExcetpion {
return calculator.calculate(x, y, '+');
}
public int sub(int x, int y) throws InputExcetpion {
return calculator.calculate(x, y, '-');
}
public int multi(int x, int y) throws InputExcetpion {
return calculator.calculate(x, y, '*');
}
public int divide(int x, int y) throws InputExcetpion {
return calculator.calculate(x, y, '/');
}
public void inquiryResults() {
calculator.inquiryResults();
}
public void remove() {
calculator.removeResult();
}
}
맞는지 틀린지는 모르겠지만, 오늘 올라온 정답을 가지고 다시 작성해 수정할 예정이다.
'TIL' 카테고리의 다른 글
240502 TIL (0) | 2024.05.02 |
---|---|
240501 TIL (0) | 2024.05.01 |
240429 TIL (0) | 2024.04.30 |
240426 TIL : 계산기 (0) | 2024.04.26 |
240425 TIL (0) | 2024.04.25 |