Study
-
객체 생성과 파괴 - 아이템 7. 다 쓴 객체 참조를 해제하라Study/Effective Java 2022. 12. 13. 09:44
다 쓴 객체 참조를 해제하라 메모리 누수 문제 public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } privat..
-
객체 생성과 파괴 - 아이템 6. 불필요한 객체 생성을 피하라Study/Effective Java 2022. 12. 12. 16:49
불필요한 객체 생성을 피하라 1. 객체를 매번 생성하기보다는 재사용하는 편이 좋다. 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 좋을 때가 많다. 특히, 불변 객체는 언제든지 재사용이 가능하다. 만약, 무거운 객체라면 매번 생성할 때마다 많은 자원이 들어갈 것이고, 인스턴스를 자주 생성하게 되면 GC가 동작하게 될 확률이 높아지고 이는 애플리케이션의 성능을 저하시키는 요인 중 하나이다. Java에서 String을 생성하는 방식을 통해 그 이유를 알아보자. String string01 = new String("hello"); // new 연산자를 이용한 방식 String string02 = "hello"; // 리터럴을 이용한 방식 첫 번째 코드는 실행될 때마다 String 인스턴..
-
객체 생성과 파괴 - 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라Study/Effective Java 2022. 12. 12. 15:12
자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 유연하지 못한 정적 유틸리티 클래스 public class AutoLottoNumberGenerator { private static final List LOTTO_TOTAL_NUMBERS = IntStream.rangeClosed(1, 45) .boxed() .collect(Collectors.toList()); private AutoLottoNumberGenerator() { } public static List generate(int size) { List lottoTotalNumbers = new ArrayList(LOTTO_TOTAL_NUMBERS); Collections.shuffle(lottoTotalNumbers); return lott..
-
객체 생성과 파괴 - 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라Study/Effective Java 2022. 12. 12. 14:23
인스턴스화를 막으려거든 private 생성자를 사용하라 기본적으로 정적 메서드, 정적 필드만 담은 클래스는 때때로 유용하게 쓰일 수 있다. 사용하는 경우는 아래와 같이 크게 세 가지가 있다. 1. 기본 타입 값이나 배열 관련 메서드를 모은 클래스 예컨대, java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있다. public class Arrays { private Arrays() {} public static boolean isArray(Object o) { ... } public static Object[] asObjectArray(Object array) { ... } public sattic List asList(Object array..
-
객체 생성과 파괴 - 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라Study/Effective Java 2022. 12. 12. 13:48
private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴이란? 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴의 전형적인 예로는 함수와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. public static final 필드 방식의 싱글턴 생성 public class User { public static final User INSTANCE = new User(); /** private 생성자 */ private User() { ... }; } private 생성자는 public static final 필드인 User.INSTANCE를 초기화할 때 딱 한 번만 호출된다. public이나 protected 생성자가 없으므로 User 클래스가 초기화될..
-
객체 생성과 파괴 - 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라Study/Effective Java 2022. 12. 12. 11:10
생성자에 매개변수가 많다면 빌더를 고려하라 점층적 생성자 패턴 public class User { private final int age; // 필수 private final int phoneNumber; // 필수 private final int weight; // 선택 private final int tall; // 선택 private final int birthday; // 선택 } 생성자와 정적 팩토리 메서드는 똑같은 제약이 하나 있다. 바로, 위 코드와 같이 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 위와 같은 클래스용 생성자 혹은 정적 팩토리 메서드를 위해 프로그래머들은 점층적 생성자 패턴을 즐겨 사용했다. 필수 매개 변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를..