아이템 2 - 생성자에 매개변수가 많다면 빌더를 고려하라
생성자나 정적 팩토리 메서드는 객체를 효율적으로 생성할 수 있는 방법이지만, 매개변수가 많은 경우에는 코드가 복잡해지고 가독성이 떨어질 수 있다. 빌더 패턴은 이러한 문제를 해결하는 방식으로, 특히 매개변수가 많은 객체를 만들 때 유용하다.
장점
- 가독성 향상
빌더 패턴을 사용하면 매개변수가 많은 객체를 생성할 때 매개변수의 의미를 명확하게 표현할 수 있다. 또한, 메서드 체이닝을 통해 각 매개변수를 명확하게 설정할 수 있다.
위 코드에서는 필수적인 매개변수인 servingSize와 servings는 생성자에서 설정하고, 선택적인 매개변수인 calories, sodium, carbohydrate는 빌더 패턴을 통해 가독성 향상!!NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8) .calories(100) .sodium(35) .carbohydrate(27) .build();
- 매개변수 조합의 유연성
점층적 생성자 패턴도 쓸 수 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. 따라서 빌더 패턴은 필요한 매개변수만 설정하고, 불필요한 매개변수는 생략할 수 있는 유연성을 제공한다.NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8) .calories(100) .build(); // 나머지 선택 매개변수는 생략 가능
단점
- 코드 복잡성 증가 빌더 패턴을 구현하려면 추가적인 클래스(빌더 클래스)를 작성해야 하기 때문에 코드가 다소 복잡해질 수 있다. 특히, 간단한 객체 생성에 빌더 패턴을 적용하면 코드가 불필요하게 장황해질 수 있다.
- 객체 생성 비용 증가 빌더 패턴은 내부적으로 객체를 생성하는 과정에서 여러 번의 메서드 호출이 이루어지기 때문에 생성 비용이 증가할 수 있다.
아이템 3 - private 생성자나 열거 타입으로 싱글턴임을 보장하라
싱글턴은 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 이 패턴을 올바르게 구현하는 방법은 여러 가지가 있지만, 가장 대표적인 방법은 private 생성자를 사용하는 방식과 열거 타입(enum)을 사용하는 방식이다.
방법 1: private 생성자를 사용한 싱글턴 패턴
public class Singleton {
// 미리 인스턴스를 생성해두고, 외부에서 접근할 수 있도록 함
private static final Singleton INSTANCE = new Singleton();
// private 생성자로 외부에서의 인스턴스 생성을 방지
private Singleton() {
// 인스턴스 생성 방지 코드(Optional)
throw new AssertionError();
}
// 싱글턴 인스턴스를 제공하는 정적 메서드
public static Singleton getInstance() {
return INSTANCE;
}
}
-> private 생성자는 public static 필드를 초기화할 때 한 번만 호출된다.
방법 2: 열거 타입(enum)을 이용한 싱글턴 패턴
public enum Singleton {
INSTANCE;
}
->열거 타입을 사용한 싱글턴 패턴은 자바의 열거형 특성을 활용하여 스레드 안전성과 직렬화 대응까지 자동으로 처리된다. 대부분의 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법이다.
장점
- 유일한 인스턴스 보장 싱글턴 패턴을 사용하면 단 하나의 인스턴스만 유지되므로 메모리 효율성을 높이고, 전역적으로 동일한 인스턴스를 사용할 수 있다.
- 스레드 안전성 싱글턴 인스턴스는 클래스가 로드될 때 한 번만 생성되기 때문에 멀티스레드 환경에서도 안전하게 사용할 수 있다.
- 직렬화 안전성 특히 열거형을 사용하면 싱글턴 인스턴스를 직렬화/역직렬화할 때 역직렬화 과정에서 새로운 인스턴스가 생성되는 문제를 방지할 수 있다.
단점
- 유연성 부족 싱글턴은 단 하나의 인스턴스만 유지해야 하므로, 인스턴스 상태를 변경하는 경우 문제가 될 수 있다.
- 클래스 확장 불가능 싱글턴 클래스를 상속하여 확장하는 것은 불가능
'Backend 🖥️' 카테고리의 다른 글
[Effective Java] 2장 객체 생성과 파괴 : item 6 (0) | 2024.10.31 |
---|---|
[Effective Java] 2장 객체 생성과 파괴 : item 4, 5 (0) | 2024.10.22 |
[Effective Java] 2장 객체 생성과 파괴 : item 1 (0) | 2024.09.16 |
HTTP 와 HTTPS의 개념과 차이점 (0) | 2024.09.12 |
CI/CD 란? (1) | 2024.08.19 |