Effective Java
-
객체 생성과 파괴 - 아이템 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..
-
객체 생성과 파괴 - 아이템 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 클래스가 초기화될..
-
객체 생성과 파괴 - 아이템 1. 생성자 대신 정적 팩토리 메서드를 고려하라Study/Effective Java 2022. 12. 8. 17:21
생성자 대신 정적 팩토리 메서드를 고려하라 정적 팩토리 메서드의 장점 1. 이름을 가질 수 있다. public static Position createStartPosition() { return new Position(START_POSITION_VALUE); } Position position = Position.createStartPosition(); 생성자 자체는 생성되는 객체의 특성을 직관적으로 설명하지 않는다. 위 코드와 같이 메서드명을 명시함으로써 어떠한 객체가 생성되는지 더 구체적으로 알 수 있다. public class Person { String name; String age; public Person(String name) { this.name = name; } public Person(..