그 동안 코드스테이츠에서 setter를 사용하며 setter에만 익숙해져있던 나에게 신선한 충격을 준 말이 있었다.
"setter는 현업에서 안써~ builder쓰지."
ㅇㅇ엥? 이 편한 setter를 안쓴다고? 왜지? 왜!!!?라고 생각해서 한번 찾아보고 정리해봤다.
setter를 사용할때는 매개변수가 굉장히 많은 경우에 일일이 설정하기 굉장히 번거롭다.
setter의 사용을 지양하라는 이유중 가장 큰 두가지중 첫번째이유는 의도를 파악하기 힘들다는것이다. 두번째 이유는 객체의 일관성을 유지하기 힘들다는것이다. 물론 setter 대신 생성자를 사용해 객체의 매개변수값들을 설정해 줄 수 있지만, 어떤 매개변수가 필요하지 않을 수도 있다. 고로 builder패턴을 사용하는것이 좋다고 한다.
예를 들어, 우리가 자동차 클래스를 가지고 있다고 가정해 보자. 이 클래스에는 제조사, 모델, 연식, 가격 등의 속성이 있다고 치자.
public class Car {
private String make;
private String model;
private int year;
private double price;
public static class Builder {
private String make;
private String model;
private int year;
private double price;
public Builder make(String make) {
this.make = make;
return this;
}
public Builder model(String model) {
this.model = model;
return this;
}
public Builder year(int year) {
this.year = year;
return this;
}
public Builder price(double price) {
this.price = price;
return this;
}
public Car build() {
return new Car(this);
}
}
private Car(Builder builder) {
this.make = builder.make;
this.model = builder.model;
this.year = builder.year;
this.price = builder.price;
}
}
Car car = new Car.Builder()
.make("Toyota")
.model("Camry")
.year(2022)
.price(25000.00)
.build();
이렇게 사용해도 되고, Lombok의 @Builder 를 사용하면,
@Getter
@NoArgsConstructor
@Entity
public class Car {
private String make;
private String model;
private int year;
private double price;
@Builder
public Car(String make, String model, int year, double price){
this.make = make;
this.model = model;
this.year = year;
this.price = price;
}
setter를 사용할땐,
public class Car {
private String make;
private String model;
private int year;
private String color;
public void setMake(String make) {
this.make = make;
}
public void setModel(String model) {
this.model = model;
}
public void setYear(int year) {
this.year = year;
}
public void setColor(String color) {
this.color = color;
}
// getters
}
Car car = new Car();
car.setMake("Honda");
car.setModel("Civic");
car.setYear(2022);
car.setColor("Red");
builder 패턴을 사용함으로써 얻는 이점
- 가독성: Builder 패턴은 가독성이 높음. 객체의 속성을 설정할 때 메소드 체인을 사용하여 자연스럽게 읽을 수 있는 코드를 작성할 수 있다. 또한, 객체를 생성하고 초기화하는 데 필요한 모든 코드가 하나의 빌더 클래스에 포함되므로 코드가 더 읽기 쉽고 이해하기 쉬움 .
- 유연성: Builder 패턴은 객체 생성 및 초기화를 유연하게 제어할 수 있음. 빌더 클래스를 사용하면 객체의 일부 속성만 설정하거나 기본값을 사용하거나, 객체의 속성을 변경하거나 추가할 수 있음. 객체를 생성할 때 필요한 매개변수를 전달하는 방법도 유연하게 선택할 수 있다.
- 불변성: Builder 패턴을 사용하면 불변 객체를 생성할 수 있음. 빌더 클래스에서 객체를 생성할 때 객체의 모든 속성을 한 번에 설정할 수 있으므로, 객체가 생성되면 속성이 변경될 수 없음. 이것은 불변 객체를 사용하는 이점을 가져올 수 있다. 예를 들어, 다중 스레드 환경에서 안전하고 예측 가능한 코드를 작성할 수 있음.
- 컴파일 타임 검증: Builder 패턴은 컴파일 타임에 객체의 속성을 검증할 수 있다. 빌더 클래스에서 객체의 속성을 설정할 때 매개변수의 유효성을 검증할 수 있다. 런타임에러를 방지할 수 있다.
이 블로그를 참고했다. 이분이 훨씬 정리를 잘해둬서 링크를 첨부한다.
'Java > 자바공부' 카테고리의 다른 글
부트캠프가 끝난뒤...(5) (0) | 2023.05.11 |
---|---|
부트캠프가 끝난뒤...(4) (0) | 2023.05.03 |
부트캠프가 끝난뒤...(3) (0) | 2023.04.27 |
부트캠프가 끝난뒤...(2) (0) | 2023.04.26 |
부트캠프가 끝난뒤...(1) (0) | 2023.04.11 |