[이펙티브 자바] 아이템2 - 생성자에 매개변수가 많다면 빌더를 고려하라

2025. 3. 27. 22:28·☕JAVA/이펙티브 자바

 


객체를 생성하는 방법 3가지

 

정적 팩터리와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다.

 

점층적 생성자 패턴

생성자를 호출하여 객체를 생성하는 방식에는 필수 매개변수를 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 2개를 받는 생성자... 형태로 생성자를 늘려나가는 점층적 생성자 패턴이 있는데 이 패턴은 매개변수가 많아지면 클라이언트 코드를 작성하기 어렵고 실수로 매개변수를 잘못 전달하여 런타임에 엉뚱한 동작을 하는 경우가 빈번하다.

 

JavaBeans 패턴

이 대안으로 매개변수가 없는 생성자로 객체를 만들고 setter 메서드를 호출해 원하는 매개변수의 값을 설정하는 JavaBeans 패턴이 존재하는데 이 방식은 점층적 생성자 패턴의 단점은 보완해주지만 객체 하나를 만들 때 여러 메서드를 호출하고 객체가 완전히 생성되기 전까지 일관성이 무너진 상태에 놓인다는 단점이 있다. (불완전한 상태의 객체가 사용될 수 있기 때문에)

 

위 두 가지 방법과 달리 안정성과 가독성을 모두 가져가는 방법이 있는데 바로 빌더패턴이다. 

 

 

Builder 패턴

 

public class NutritionFacts {
	
    private final int servingSize;
    private final int servings;
    private final int calories;
    pricate final int fat;
    
    public static class Builder {
    
    // 필수 매개변수
    private final int servingSize;
    private final int servings;
    
    // 선택 매개변수
    private int calories = 0;
    private int fat = 0;
    
    public Builder(int servingSize, int servings) {
    	this.servingSize = servingSize;
        this.servings = servings;
    }
    
    public Builder calories(int val){
    	calories = val;  
        return this;
    }
    
    public Builder fat(int val){
    	fat = val;  
    	return this;
    }
    
    public NutritionFacts build() {
    	return new NutritionFacts(this);
    }
}

	private NutritionFacts(Builder builder) { 
    	servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
    }
}

 

위 코드를 보면 Builder의 setter 메서드들이 Builder 자신을 반환하기 때문에 연쇄적으로 호출되는데 이를 플루언트 API 혹은 메서드 연쇄라고 한다.

 

이러한 빌더패턴을 활용하면 병렬 계층 구조를 활용하여 추상 클래스는 추상 빌더를 가지고, 구체 클래스는 구체 빌더를 가지는 방식으로 각 계층에 맞는 빌더를 제공하면서도 일관된 인터페이스를 유지할 수 있다. 또한 this를 반환하는 메서드 체이닝을 활용하여 한 줄의 코드로 여러 메서드를 연속해서 호출할 수 있게 할 수 있는데. 이는 코드를 더 간결하고 읽기 쉽게 만들어 준다.

 

빌더 패턴의 단점

 

모든 상황에 장점이 있는 것은 아닌데 객체를 만들려면, 빌더부터 만들어야 하는데 생성 비용이 크지는 않지만 성능이 민감한 상황에서는 문제가 될 수 있다고 한다. 또한 코드가 생성자 패턴보다 장황한지라 매개변수 4개 이상이 되어야 값어치르 랗지만 API는 시간이 지날수록 매개변수가 많아지기 때문에 빌더로 시작하는 편이 나을때가 많다고 한다.

'☕JAVA > 이펙티브 자바' 카테고리의 다른 글

[이펙티브 자바] 아이템3 - private 생성자나 열거 타입으로 싱글턴임을 보증하라  (2) 2025.03.27
[이펙티브 자바] 아이템1 - 생성자 대신 정적 팩터리 메서드를 고려하라.  (0) 2024.07.20
'☕JAVA/이펙티브 자바' 카테고리의 다른 글
  • [이펙티브 자바] 아이템3 - private 생성자나 열거 타입으로 싱글턴임을 보증하라
  • [이펙티브 자바] 아이템1 - 생성자 대신 정적 팩터리 메서드를 고려하라.
승9
승9
  • 승9
    코드 창고
    승9
  • 전체
    오늘
    어제
    • 분류 전체보기 (9)
      • ☕JAVA (4)
        • 이펙티브 자바 (3)
      • 💡알고리즘 (0)
        • Greedy (0)
      • ❓고민 해결 (4)
        • http (2)
        • JAVA (0)
        • Spring Framework (1)
      • ♺인프라 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
승9
[이펙티브 자바] 아이템2 - 생성자에 매개변수가 많다면 빌더를 고려하라
상단으로

티스토리툴바