본문 바로가기

이펙티브 자바

(61)
[이펙티브 자바] 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식을 사용하는 경우가 자주 있는데 이는 적합하지 않다. 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식인 의존 객채 주입 패턴이 좋다. 예시 : // 주문 처리를 담당하는 클래스 public class OrderProcessor { // 결제 서비스에 대한 의존성 private final PaymentService paymentService; // 재고 서비스에 대한 의존성 private final InventoryService inventoryService; // 생성자를 통한 의존 객체 주입 // OrderProcessor는 PaymentService와 InventoryService의 구체적인 구현에 의존하지 ..
[이펙티브 자바] 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 "인스턴스화를 막으려거든 private 생성자를 사용해라"는 조언은 유틸리타 클래스나 도우미 클래스와 같이 상태를 가지지 않고 단순 메서드만을 제공하는 클래스에서 주로 사용된다. 예시 : public class UtilityClass { // private 생성자를 추가하여 인스턴스화를 방지함 private UtilityClass() { throw new AssertionError("UtilityClass should not be instantiated"); } // 유틸리티 메서드 예시 public static void utilityMethod() { // 메서드 구현 } } 예시에 나온 UtilityClass 같이 오직 메서드만을 제공할 경우 private 생성자를 추가해, 외부에서 인스턴스 생성을 ..
[이펙티브 자바] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴(Singleton) : 인스턴스를 오직 하나만 생성할 수 있는 클래스 싱글턴 패턴 : 특정 클래스의 인스턴스가 오직 하나만 생성되어서 전역적으로 접근 가능하도록 보장하는 패턴이다. 이 패턴은 전역 상태를 관리하거나, 자원 관리, 로깅, 드라이버 객체 등 한 번의 인스턴스 생성으로 충분한 경우에 주로 사용된다. 싱글턴을 만드는 방식은 크게 2가지가 있다. 1. Private 생성자를 이용한 방식 2. Enum(열거형)을 이용한 방식 열거 타입을 이용한 방식의 예시 : public enum Singleton { INSTANCE; public void doSomething() { // 싱글턴 인스턴스가 할 작업 구현 } } 더 자세한 예시 : public enum DatabaseConnection { ..
[이펙티브 자바] 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩토리 메서드와 public 생성자 모두 제약이 있다. 바로 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 이 때 개발자들은 점층적 생성자 패턴을 사용했었다. 하지만 이것도 단점이 존재한다. 점층적 생성자 패턴도 쓸 수는 있지만, 배개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. 점층적 생성자 패턴의 예시 : public class Pizza { private int size; // 필수 private boolean cheese; // 선택적 private boolean pepperoni; // 선택적 private boolean bacon; // 선택적 public Pizza(int size) { this(size, false); // 기본값 사용 } public ..
[이펙티브 자바] 아이템 1. 생성자 대신 정적 팩토리 메서드를 고려하라 인스턴스 : 클래스(설계도)를 바탕으로 만들어진 구체적인 객체 public 생성자 : 클래스의 인스턴스를 생성할 때 초기화를 담당하는 특별한 메서드 public class Car { private String color; // Car 클래스의 필드 // Car 클래스의 public 생성자 public Car(String color) { this.color = color; // 생성자를 통해 Car 인스턴스의 색상을 초기화 } // Car 클래스의 메서드 public void drive() { System.out.println(color + " 차가 달립니다."); } } // Main 클래스에서 Car 클래스의 인스턴스 생성 및 사용 public class Main { public static void ..