외부에서 필드에 직접 접근하는 것을 막기 위해 필드에 private, default 등의 접근제어자 사용
Getter : 외부에서 객체의 private한 필드를 읽을 때
public String getModel() {
return model;
}
Setter : 외부에서 객체의 private한 값을 저장,수정할 때
public void setModel(String model) {
this.model = model;
}
⚠️ 제어자 사용시 주의 사항
static
과 abstract
를 함께 사용할 수 없다.abstract
와 final
을 동시에 사용할 수 없다.abstract
메서드의 접근 제어자가 private
일 수 없다.private
와 final
을 같이 사용할 필요는 없다.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
}
}
생성자는 객체가 생성될 때 호출되며 객체를 초기화 한다.
한개 이상의 생성자가 존재할 때 컴파일러가 자동으로 기본 생성자를 추가해주지 않는다.
따라서 위와같이 생성자를 만들고 기본 생성자를 호출하면 기본 생성자가 없기 때문에 오류가 발생한다.