- 추상 클래스를 이용하여 사칙연산을 수행하는 계산기 만들기
- 추상화, 오버라이딩의 개념은 이해함 but...
- 클래스 안에서 다른 클래스를 필드로 받고 메서드에서 그걸 매개변수로 사용하고... 복잡해지기 시작함
- 최종적으로는 Parser 인스턴스만 만들어서 parser.executeCalculator()를 실행하면 됨
- 어떤 클래스를 만들고 거기에 어떤 필드와 메서드를 넣을지 구상하는 과정이 매우 중요할 것으로 생각됨
// 사칙연산 각각의 클래스를 추상화한 추상 클래스 생성
public abstract class AbstractOperation {
public abstract double operate(int firstNumber, int secondNumber);
}
// 추상 클래스를 인스턴스 필드로 가지는 클래스 생성
public class Calculator {
private AbstractOperation operation;
// 추상 클래스를 매개변수로 가지는 생성자 구현
public Calculator(AbstractOperation operation) {
this.operation = operation;
}
// 사칙연산 클래스를 추상 클래스로 형변환하여 매개변수로 받는 setter 메서드
public void setOperation(AbstractOperation operation) {
this.operation = operation;
}
// 각각의 사칙연산 클래스에서 Override로 구현한 메서드 호출
public double calculate() {
return operation.operate(this.firstNumber, this.secondNumber);
}
}
// Calculator 클래스를 인스턴스 필드로 가지는 클래스 생성
public class Parser {
private final Calculator calculator = new Calculator();
// Calculator 인스턴스의 setter 메서드를 사용하여 계산기 변환
public void parseOperator(String operationInput) {
switch (operationInput) {
case "+" -> this.calculator.setOperation(new AddOperation());
case "-" -> this.calculator.setOperation(new SubtractOperation());
case "*" -> this.calculator.setOperation(new MultiplyOperation());
case "/" -> this.calculator.setOperation(new DivideOperation());
}
}
// Parser 인스턴스에서 메서드를 호출하면 Calculator 인스턴스의 메서드를 호출해서 return
public double executeCalculator() {
return calculator.calculate();
}
}
- 다형성은 Calculator 클래스 생성자에 추상 클래스를 매개변수로 넣고 추상 클래스를 상속한 사칙연산 클래스를 돌려가며 쓸 수 있게 하는 것
- 여기서 형변환의 개념이 들어감 AbstractOperation abstractOperation = new AddOperation(); - (사족) Private 필드에 접근하는 두 가지 방법 : 생성자 or setter/getter
- 생성자를 통한 접근 : Calculator calculator = new Calculator(new AddOperation());
- setter/getter를 통한 접근 : calculator.setOperation(new Subtract/Multiply/DivideOperation());