728x90
Getter의 기능과 목적
- 값 반환: Getter는 객체의 특정 필드의 값을 반환하는 메서드입니다.
- 객체 캡슐화: 객체의 내부 상태를 외부로 노출하지 않고 값을 반환합니다.
- 내부 상태 보호: 객체의 내부 상태를 직접 변경하지 않고 조회만 가능하게 합니다.
public class User {
private String name;
public String getName() {
return name;
}
}
Setter의 기능과 목적
- 값 설정: Setter는 객체의 특정 필드에 값을 설정할 때 사용합니다.
- 유효성 감사: Setter 내에서 입력 값의 유효성을 검사해, 객체의 상태를 안전하게 유지할 수 있습니다.
- 객체 상태 변경: 객체의 상태를 변경할 때 사용되며, 이를 통해 객체의 라이프사이클을 관리합니다.
public class User {
private String name;
public void setName(String name) {
if(name != null && !name.isEmpty()) {
this.name = name;
}
}
}
Getter를 쓰면 안 되는 이유
- 객체의 캡슐화 침해: 객체의 내부 상태가 외부로 노출됩니다.
- 불필요한 의존성: 외부에서 객체의 상태에 직접 접근하게 되면, 해당 객체의 구현 변경 시 외부 코드도 영향을 받습니다.
- 객체의 책임 분리 문제: 객체 스스로가 해야 할 일을 외부에서 처리할 가능성이 생깁니다.
Setter를 쓰면 안 되는 이유
- 불안정성: 잘못된 값이 설정될 위험이 있습니다.
- 객체의 불변성 침해: Setter를 사용하면 객체의 상태를 변경할 수 있어, 불변 객체를 만들기 어려워집니다.
- 과도한 객체 상태 변경: Setter가 많아지면 객체의 상태를 자주 변경하는 설계가 될 수 있습니다.
Getter를 쓰지 않는다면, 어떻게 대처할 수 있는가?
- 메서드를 통한 접근: 객체의 상태를 바로 반환하는 대신, 해당 상태를 사용하는 동작을 매서드로 제공합니다.
- 불변 객체 사용: 객체의 상태를 변경할 수 없도록 설계하여 Getter의 필요성을 줄입니다.
- DTO 변환: 객체의 상태를 다른 객체로 변환하여 전달할 수 있습니다.
Setter를 쓰지 않는다면 어떻게 대처할 수 있는가?
- 생성자를 통한 초기화: 모든 필요한 값들을 생성자에서 받아 초기화하고, 이후에는 변경하지 않습니다.
- 빌더 패턴 사용: 객체 생성 시 필요한 값을 순차적으로 설정할 수 있게 합니다.
- 메서드를 통한 상태 변경: Setter 대신 특정 동작을 수행하는 메서드를 제공하여 객체의 상태를 안전하게 변경합니다.
Getter 사용을 고려하는 경우는?
- 불변 객체의 상태 조회: 객체의 상태가 변경되지 않는 경우, Getter를 사용해도 안전합니다.
- DTO나 VO에서의 사용: 데이터 전송이나 값 객체의 목적으로 사용되는 경우에는 Getter 사용을 고려할 수도 있습니다.
- 내부 컬렉션 반환 시 불변성 유지: 'Collections.unmodifiableList()' 등을 사용해서 불변 리스트를 반환할 수 있습니다.
Setter사용을 고려하는 경우는?
- 빈(Bean) 객체: 프레임워크나 라이브러리에서 요구하는 경우, Setter를 제공할 수 있습니다.
- 객체 초기화에 한정: 객체 생성 후 초기화 목적으로, 한정적으로 사용하는 경우에는 사용할 수 잇습니다.
- 유효성 검사가 필요한 경우: Setter 내부에서 입력값의 유효성을 검사하려는 경우에 사용할 수 있습니다.
728x90