본문 바로가기
Backend 🖥️

[Effective Java] 2장 객체 생성과 파괴 : item 2, 3

by 봄설날 2024. 9. 28.

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

생성자나 정적 팩토리 메서드는 객체를 효율적으로 생성할 수 있는 방법이지만, 매개변수가 많은 경우에는 코드가 복잡해지고 가독성이 떨어질 수 있다. 빌더 패턴은 이러한 문제를 해결하는 방식으로, 특히 매개변수가 많은 객체를 만들 때 유용하다.

 

장점

  1. 가독성 향상
    빌더 패턴을 사용하면 매개변수가 많은 객체를 생성할 때 매개변수의 의미를 명확하게 표현할 수 있다. 또한, 메서드 체이닝을 통해 각 매개변수를 명확하게 설정할 수 있다.
    NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
        .calories(100)
        .sodium(35)
        .carbohydrate(27)
        .build();
    
    위 코드에서는 필수적인 매개변수인 servingSize와 servings는 생성자에서 설정하고, 선택적인 매개변수인 calories, sodium, carbohydrate는 빌더 패턴을 통해 가독성 향상!!
  2. 매개변수 조합의 유연성
    점층적 생성자 패턴도 쓸 수 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. 따라서 빌더 패턴은 필요한 매개변수만 설정하고, 불필요한 매개변수는 생략할 수 있는 유연성을 제공한다.
    NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8)
        .calories(100)
        .build(); // 나머지 선택 매개변수는 생략 가능
    

단점

  1. 코드 복잡성 증가 빌더 패턴을 구현하려면 추가적인 클래스(빌더 클래스)를 작성해야 하기 때문에 코드가 다소 복잡해질 수 있다. 특히, 간단한 객체 생성에 빌더 패턴을 적용하면 코드가 불필요하게 장황해질 수 있다.

  2. 객체 생성 비용 증가 빌더 패턴은 내부적으로 객체를 생성하는 과정에서 여러 번의 메서드 호출이 이루어지기 때문에 생성 비용이 증가할 수 있다.

아이템 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;
}

 

->열거 타입을 사용한 싱글턴 패턴은 자바의 열거형 특성을 활용하여 스레드 안전성과 직렬화 대응까지 자동으로 처리된다. 대부분의 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법이다.

 

장점

  1. 유일한 인스턴스 보장 싱글턴 패턴을 사용하면 단 하나의 인스턴스만 유지되므로 메모리 효율성을 높이고, 전역적으로 동일한 인스턴스를 사용할 수 있다.
  2. 스레드 안전성 싱글턴 인스턴스는 클래스가 로드될 때 한 번만 생성되기 때문에 멀티스레드 환경에서도 안전하게 사용할 수 있다.
  3. 직렬화 안전성 특히 열거형을 사용하면 싱글턴 인스턴스를 직렬화/역직렬화할 때 역직렬화 과정에서 새로운 인스턴스가 생성되는 문제를 방지할 수 있다.

단점

  1. 유연성 부족 싱글턴은 단 하나의 인스턴스만 유지해야 하므로, 인스턴스 상태를 변경하는 경우 문제가 될 수 있다.
  2. 클래스 확장 불가능 싱글턴 클래스를 상속하여 확장하는 것은 불가능