본문 바로가기
카테고리 없음

다형성(Polymorphism)

by 수수남매 2023. 10. 19.
  • 추상 클래스를 이용하여 사칙연산을 수행하는 계산기 만들기
    - 추상화, 오버라이딩의 개념은 이해함 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());