새소식

TIL

[TIL] 240426 <자바> 계산기 만들기

  • -

 

 

Step1.
더하기,빼기,나누기,곱하기,나머지 연산 수행하는 Calculator 클래스 생성

 

 

Calculator.java

package week03.homework3;

public class Calculator {
    
    public double calculate (String operator, int num1, int num2) {
        double result = 0;
        
        switch (operator) {
            case "+" :
                result = num1 + num2;
                break;
            case "-" :
                result = num1 - num2;
                break;
            case "*" :
                result = num1 * num2;
                break;
            case "/" :
                result = num1 / num2;
                break;
            case "%" :
                result = num1 % num2;
                break;
                
        }
        
        return result;
    }
}

 

 


Step2.
AddOperation(더하기), SubstractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스를 만든 후 클래스 간의 관계를 고려하여 Calculator 클래스와 관계를 맺습니다. (→ 포함관계!!!)

  • Calculator 클래스와 포함관계를 맺고 생성자를 통해 각각의 연산 클래스 타입의 필드에 객체를 주입합니다.
  • calculate 메서드에서 직접 연산을 하지 않고 주입받은 연산 클래스들의 operate 메서드를 사용하여 연산을 진행합니다.

 

 

 

 

Calculator.java

package week03.homework3;

public class Calculator {

    // Calculator클래스는 AddOperation,SubstractOperation,MultiplyOperation,DivideOperation클래스를 포함함.
    private final AddOperation addOperation;
    private final SubstractOperation substractOperation;
    private final MultiplyOperation multiplyOperation;
    private final DivideOperation divideOperation;



    // Calculator 생성자
    public Calculator(AddOperation addOperation,
                      SubstractOperation substractOperation,
                      MultiplyOperation multiplyOperation,
                      DivideOperation divideOperation){

        this.addOperation = addOperation;
        this.substractOperation = substractOperation;
        this.multiplyOperation = multiplyOperation;
        this.divideOperation = divideOperation;
    }


    public double calculate (String operator, int num1, int num2) {
        double result = 0;

        switch (operator) {
            case "+" :
                result = addOperation.operate (num1,num2);
                break;
            case "-" :
                result = substractOperation.operate (num1,num2);
                break;
            case "*" :
                result = multiplyOperation.operate (num1,num2);
                break;
            case "/" :
                result = divideOperation.operate (num1,num2);
                break;
            case "%" :
                result = num1 % num2;
                break;
        }

        return result;
    }
}

 

 

Main.java

package week03.homework3;

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, 25));
        System.out.println(calculator.calculate("-", 40, 25));
        System.out.println(calculator.calculate("*", 20, 10));
        System.out.println(calculator.calculate("/", 10, 5));
    }
}

 

 


Step3.
AddOperation(더하기), SubstractOperation(빼기), MultiplyOperation(곱하기), DivideOperation(나누기) 연산 클래스들을 AbstractOperation(추상 클래스)를 사용하여 추상화하고 Calculator 클래스의 내부 코드를 변경합니다.

 

 

AbstractOperation.java

package week03.homework3;

// 추상 클래스
public abstract class AbstractOperation {
    // 추상 메서드 : 블록{}이 없음 (내용X)
    public abstract double operate (int num1, int num2);
    // 상속받은 클래스(Add,Abstract,Multiply,DivideOperation)
    // 에서 추상 클래스의 추상 메서드(operate)는 반드시 오버라이딩되어야함!
}

 

 

 

 

Calculator.java

  • 생성자 혹은 Setter를 사용하여 연산을 수행할 연산 클래스의 객체를 AbstractOperation 클래스 타입의 필드에 주입합니다.(다형성)
  • calculate 메서드에서는 더 이상 연산자 타입을 받아 구분할 필요 없이 주입 받은 연산 클래스의 operate 메서드를 통해 바로 연산을 수행합니다.
package week03.homework3;

public class Calculator {

    // AddOperation,SubstractOperation,MultiplyOperation,DivideOperation클래스들은
    // AbstractOperation 추상클래스를 상속함!
    
    //Calculator클래스는 4개의 연산클래스들이 상속받고있는 AbstractOperation 클래스만 포함!!!
    private AbstractOperation operation;



    // Calculator 생성자
    public Calculator(AbstractOperation operation){
        this.operation = operation;
    }
    
    
    // setter
    public void setOperation(AbstractOperation operation){
        this.operation = operation;
    }
    
    
    
    
    //더 이상 연산자 타입을 받아 구분할 필요가 없어짐
    public double calculate (int num1, int num2) {
        double result = 0;

        result = operation.operate(num1,num2);

        return result;
    }
}

 

 

Main.java

package week03.homework3;

public class Main {
    public static void main(String[] args) {

        //Calculator.java에서 연산자타입 구별하지 않고
        //"주입받은 연산클래스"의 operate메서드를 통해 바로 연산수행
        
        //연산을 수행할 연산 클래스의 객체를 AbstractOperation 클래스 타입의 필드에 주입
        // : 다형성
        Calculator calculator1 = new Calculator(new AddOperation());
        Calculator calculator2 = new Calculator(new MultiplyOperation());


        System.out.println(calculator1.calculate(10, 25));  //덧셈
        System.out.println(calculator2.calculate(10, 25));  //곱셈
    }
}

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.