public class MultiplyOperation extends AbstractOperation{
double operate(int x, int y){
return x * y;
}
}
1) AddOperation(더하기), SubstractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스를 만든 후 클래스 간의 관계를 고려하여 Calculator 클래스와 관계를 맺습니다.
- 관계를 맺은 후 필요하다면 Calculator 클래스의 내부 코드를 변경합니다.
- 나머지 연산자(%) 기능은 제외합니다.
- Step 2 와 비교하여 어떠한 점이 개선되었는지 스스로 생각해 봅니다.
- hint. 클래스의 책임(단일 책임 원칙)
package Calculator;
public class Calculator {
private final AddOperation add;
private final SubstractOperation sub;
private final MultiplyOperation multi;
private final DivideOperation divide;
public Calculator(AddOperation add, SubstractOperation sub,
MultiplyOperation multi, DivideOperation divide){
this.add = add;
this.sub = sub;
this.multi = multi;
this.divide = divide;
}
double calculate(String op,int x, int y){
double ans = 0;
switch (op){
case("+"):
ans = add.operate(x, y);
break;
case("-"):
ans = sub.operate(x, y);
break;
case("*"):
ans = multi.operate(x,y);
break;
case("/"):
ans = divide.operate(x,y);
break;
}
return ans;
}
}
public class Main {
public static void main(String[] args) {
Calculator calculator = new Calculator(new AddOperation(), new SubstractOperation(),
new MultiplyOperation(), new DivideOperation());
System.out.println(calculator.calculate("+", 10, 20));
System.out.println(calculator.calculate("*", 10, 20));
}
}
더보기
public class Calculator {
void calculate(String op, int firstNumber, int secondNumber){
switch (op) {
case "+" -> {
AddOperation addOperation = new AddOperation();
addOperation.operate(firstNumber, secondNumber);
}
case "-" -> {
SubstractOperation substractOperation = new SubstractOperation();
substractOperation.operate(firstNumber, secondNumber);
}
case "/" -> {
DivideOperation divideOperation = new DivideOperation();
divideOperation.operate(firstNumber, secondNumber);
}
case "*" -> {
MultiplyOperation multiplyOperation = new MultiplyOperation();
multiplyOperation.operate(firstNumber, secondNumber);
}
}
}
}
처음에는 Operation 각자의 객체를 만들어 주어 문제를 해결하려 했지만, 이 코드로 했을 경우에는 계속해서 객체를 생성해야해서 코드 중복의 문제와 유지보수 측면에서 어려울 수 있다는 평을 받았다. 이를 해결하기 위해 Calculator 생성자에서 객체를 한번만 생성하고 재사용하는 것이 좋다고 판단하였다.
Main에서 Calculator(new AddOperation, ...) 등으로 Operation에 대한 객체를 생성하고 Calculator 클래스에서 Operation에 대한 변수에 할당해주어 문제를 해결하였다. 또한 값을 두개 받아 계산하는 메서드를 따로 뺄 수 있다고 판단하여, abstract 추상화를 통해 위의 Calculator를 개선해보았다.
public abstract class AbstractOperation {
abstract double operate(int x, int y);
}
public class AddOperation extends AbstractOperation {
double operate(int x, int y){
return x+y;
}
}
public class SubstractOperation extends AbstractOperation{
double operate(int x, int y){
return x - y;
}
}
public class DivideOperation extends AbstractOperation{
double operate(int x, int y){
return x / y;
}
}
AbstractOperation이라는 추상 클래스를 작성하고 다른 AddOperation, SubstractOperation, MultipleOperation, DivideOperation 각각에 extends로 AbstractOperation 클래스를 상속해주었다.
public class Calculator {
private AbstractOperation abstractOperation;
public Calculator(AbstractOperation abstractOperation){
this.abstractOperation = abstractOperation;
}
// 변경되었을 떄 사용
public void setOperation(AbstractOperation abstractOperation){
this.abstractOperation = abstractOperation;
}
double calculate(int x, int y){
double answer = 0;
answer = abstractOperation.operate(x, y);
return answer;
}
}
public class Main {
public static void main(String[] args) {
Calculator cal = new Calculator(new SubstractOperation());
System.out.println(cal.calculate(5, 3));
cal.setOperation(new AddOperation());
System.out.println(cal.calculate(10, 40));
}
}
'TIL' 카테고리의 다른 글
240430 TIL (0) | 2024.05.01 |
---|---|
240429 TIL (0) | 2024.04.30 |
240425 TIL (0) | 2024.04.25 |
240424 TIL 3일차 (0) | 2024.04.24 |
240423 TIL 2일차 (0) | 2024.04.24 |