Getter는 데이터에 수정을 가하지 않아 아무리 사용해도 무방하지만, Setter는 데이터의 불변성을 해치는 메서드로, 그 자유도가 매우 높아 비즈니스 로직을 구성할 때 최대한 그 사용을 지양해야 합니다.
다행히도, Setter 메서드를 대체할 수 있는 방법은 여러가지가 있습니다. 이러한 방법들은 객체 지향 프로그래밍 원칙을 준수하며, 불변성과 코드의 유지 보수성을 개선하는데 도움이 됩니다.
객체 생성과 초기화를 단계별로 수행할 수 있는 빌더 클래스를 사용하여 setter를 대체할 수 있습니다. 빌더 패턴을 사용하면 객체 생성 시점에 속성을 설정하고 변경 불가능하게 만들 수 있습니다.
public class Employee {
private final String firstName;
private final String lastName;
private Employee(Builder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
}
public static class Builder {
private String firstName;
private String lastName;
public Builder setFirstName(String firstName) {
this.firstName = firstName;
return this;
}
public Builder setLastName(String lastName) {
this.lastName = lastName;
return this;
}
public Employee build() {
return new Employee(this);
}
}
}
객체 생성 시점에 생성자를 통해 필요한 속성을 초기화할 수 있습니다. 이 방법을 사용하면 객체가 생성된 후 변경 불가능하게 만들 수 있습니다.
public class Employee {
private final String firstName;
private final String lastName;
public Employee(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// Getters...
}
setter 대신에 객체의 상태를 변경하는데 그 목적이 명확히 드러나는 메서드를 사용할 수 있습니다. 이 방법은 객체의 상태 변경을 더 명확하게 표현하며, 더 나은 캡슐화를 제공합니다.
public class Employee {
private String status;
public void setStatusToActive() {
this.status = "Active";
}
public void setStatusToInactive() {
this.status = "Inactive";
}
// Other methods...
}
이러한 방법들을 사용하면 객체의 불변성을 유지하고, 코드의 가독성과 유지 보수성을 개선할 수 있습니다. 한 가지만 외워두고 사용하기보단, 사용 사례에 따라 적절한 방법을 선택하는 것이 좋습니다.