230525 생성자, 다형성

보트·2023년 5월 25일
0

JAVA

목록 보기
4/8

Getter, Setter

외부에서 필드에 직접 접근하는 것을 막기 위해 필드에 private, default 등의 접근제어자 사용

Getter : 외부에서 객체의 private한 필드를 읽을 때

public String getModel() {
    return model;
}

Setter : 외부에서 객체의 private한 값을 저장,수정할 때

public void setModel(String model) {
    this.model = model;
}

⚠️ 제어자 사용시 주의 사항

  • 메서드에 staticabstract를 함께 사용할 수 없다.
  • 클래스에 abstractfinal을 동시에 사용할 수 없다.
  • abstract메서드의 접근 제어자가 private일 수 없다.
  • 메서드에 privatefinal을 같이 사용할 필요는 없다.

다형성

계산기 만들기

3.

public class Calculator {

    AddOperation addOperation;
    SubstractOperation substractOperation;
    MultiplyOperation multiplyOperation;
    DivideOperation divideOperation;
    public double calculate(int firstNumber, int secondNumber, String operator){

        switch(operator) {
            case "+":
                return addOperation.operate(firstNumber,secondNumber);
            case "-":
                return substractOperation.operate(firstNumber,secondNumber);
            case "*":
                return multiplyOperation.operate(firstNumber,secondNumber);
            case "/":
                return divideOperation.operate(firstNumber,secondNumber);
        }

        return 0;
    }

}

4.

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;
    }
    public double calculate(int firstNumber, int secondNumber){

        double result = 0;
        result = operation.operate(firstNumber,secondNumber);
        return result;
    }
	public void setOperation(AbstractOperation operation){
        this.operation = operation;
    }
}
public abstract class AbstractOperation {
    public abstract double operate(int firstNumber, int secondNumber);
}
public class Main {
    public static void main(String[] args) {
        Calculator calculator = new Calculator(new AddOperation());
        System.out.println(calculator.calculate(3, 4));
        
        calculator.setOperation(new SubstractOperation());
        System.out.println(calculator.calculate(3, 4));
    }
}

문제

add 연산을 하려고 했는데 3번의 Calculator 클래스에서 addOperation이 null이라 오류가 생겼다.

시도와 해결

2번까지는 들어가는 것이 없었기 때문에 기본 생성자를 사용했다.
지금은 AddOperation, SubstractOperation, MultiplyOperation, DivideOperation이 들어와야 계산을 수행할 수 있으므로 생성자를 새로 만들어야 했다.

public class Calculator {

    // 상수처럼 사용할 것이기 때문에 private final
    private final AddOperation addOperation;
    private final SubstractOperation substractOperation;
    private final MultiplyOperation multiplyOperation;
    private final DivideOperation divideOperation;

    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(int firstNumber, int secondNumber, String operator){

        switch(operator) {
            case "+":
                return addOperation.operate(firstNumber,secondNumber);
            case "-":
                return substractOperation.operate(firstNumber,secondNumber);
            case "*":
                return multiplyOperation.operate(firstNumber,secondNumber);
            case "/":
                return divideOperation.operate(firstNumber,secondNumber);
        }

        return 0;
    }

}
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(3, 4, "+")); // 7.0
        System.out.println(calculator.calculate(3, 4, "-")); // -1.0
        System.out.println(calculator.calculate(3, 4, "*")); // 12.0
        System.out.println(calculator.calculate(3, 4, "/")); // 0.75
    }
}

알게된 점

생성자는 객체가 생성될 때 호출되며 객체를 초기화 한다.

한개 이상의 생성자가 존재할 때 컴파일러가 자동으로 기본 생성자를 추가해주지 않는다.
따라서 위와같이 생성자를 만들고 기본 생성자를 호출하면 기본 생성자가 없기 때문에 오류가 발생한다.

profile
일주일에 한 번

0개의 댓글