반응형
https://giken.tistory.com/entry/Java-if%EB%AC%B8-%EC%A0%9C%EA%B1%B0%ED%95%98%EA%B8%B0
위 포스팅의 코드와 이어서 진행됩니다.
getter
ublic class Client {
public int someMethod(CalculateCommand calculateCommand) {
CalculateType calculateType = calculateCommand.getCalculateType();
int num1 = calculateCommand.getNum1();
int num2 = calculateCommand.getNum2();
int result = calculateType.calculate(num1, num2);
return result;
}
}
클라이언트가 calculateCommand 의 getter 를 알아야한다.
즉 client 와 calculateCommand 의 결합도가 높은 것이다..
이제 결합도는 낮추고, 응집도는 높이면서 캡슐화를 진행시켜보자.
public class Client {
public int someMethod(CalculateCommand calculateCommand) {
int result = calculateCommand.getCalculateResult();
return result;
}
}
public class CalculateCommand {
private CalculateType calculateType;
private int num1;
private int num2;
public CalculateCommand(CalculateType calculateType, int num1, int num2) {
if(calculateType == null) {
throw new RuntimeException("CalculateType은 필수 값 입니다.");
}
if(calculateType.equals(CalculateType.DIVIDE) && num2 == 0) {
throw new RuntimeException("0으로 나눌 수 없습니다.");
}
this.calculateType = calculateType;
this.num1 = num1;
this.num2 = num2;
}
public int getCalculateResult() {
CalculateType calculateType = this.calculateType;
int num1 = this.num1;
int num2 = this.num2;
int result = calculateType.calculate(num1, num2);
return result;
}
}
이제부터 클라이언트는 calculateCommand 의 getCalculateResult() 메서드 호출만 하면 된다.
calculateCommand 의 getCalculateResult() 에서는 자신의 필드들을 알아서 초기화시키고, 계산한 결과를 return 한다.
setter 와 생성자
public class CalculateCommand {
private CalculateType calculateType;
private int num1;
private int num2;
public void setCalculateType(CalculateType calculateType) {
this.calculateType = calculateType;
}
public void setNum1(int num1) {
this.num1 = num1;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public int getCalculateResult() {
CalculateType calculateType = this.calculateType;
int num1 = this.num1;
int num2 = this.num2;
int result = calculateType.calculate(num1, num2);
return result;
}
}
calculateCommand 의 생성자에서 필드를 정하고 있었는데 위와 같이 생성자를 없애고 setter 로 초기화를 시키도록 만든다면?
-> 문제가 발생한다.
public class SetterCodeExampleMain {
public static void main(String[] args) {
CalculateCommand calculateCommand = new CalculateCommand();
// 실수로 아래 코드를 누락한다면?
// calculateCommand.setCalculateType(CalculateType.ADD);
calculateCommand.setNum1(100);
calculateCommand.setNum2(3);
Client client = new Client();
int result = client.someMethod(calculateCommand);
System.out.println(result);
}
}
이 경우 실수로 필드를 하나라도 setter 해주지 않는다면, error 가 발생하게된다.
생성자는 누락이 없도록 생성 당시에 모두 초기화 시키는 반면, 여기서는 누락이 발생하게 되었다.
-> 인스턴스를 만들 때 setter 보다는 생성자를 적극적으로 활용하자 !
기술적인 문제로 getter 가 필요한 경우
대부분은 getter 와 setter 를 제거하는 것이 객체지향적인 코드인데, 상황에 따라서는 이게 불가능한 경우가 있다.
DTO : 외부와 접점이 있는 데이터 클래스
- DTO 에 getter 가 필요한 경우
- DTO 에 있는 값을 꺼내서 내부에서 사용하는 데이터 클래스로 가져올 때
- DTO 가 Controller 의 반환값으로 사용되는 경우
- 이 때 DTO 에 getter 가 없다면 http 응답에 반환값이 없고 이는 http 요청의 실패로 인식된다.
- http 요청과 http 응답 실패의 무한 반복이 되는 것이다.
반응형
'백엔드 데브코스' 카테고리의 다른 글
[Java] stream API 와 Optional (0) | 2023.09.26 |
---|---|
[Java] stream API (0) | 2023.09.26 |
[Java] if문 제거하기 - 리팩토링 (0) | 2023.09.25 |
[Java] Optional - nullPointException을 잘 다뤄보자 (0) | 2023.09.25 |
[Java] Object 클래스와 주요 메서드 - equals(), hashCode(), toString() (0) | 2023.09.22 |