이펙티브 자바
-
객체의 생성과 파괴 - 아이템 9. try-finally보다는 try-with-resource를 사용하라Study/Effective Java 2022. 12. 13. 14:07
try-finally보다는 try-with-resource를 사용하라 try-finally 문제점 자바 라이브러리에는 close() 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. InputStream, OutputStream, java.sql.Connection 등이 그 예이다. 자원 닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 문제로 이어지기도 한다. static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br.close(); } } 위 코드는 Buffer..
-
객체 생성과 파괴 - 아이템 8. finalizer와 cleaner 사용을 피하라Study/Effective Java 2022. 12. 13. 11:09
finalizer와 cleaner 사용을 피하라 사용하지 말아야 하는 이유 Java에서 제공하는 두 가지 객체 소멸자인 finalize와 cleaner는 기본적으로 쓰지 말아야 한다. 사용하지 말아야 하는 이유는 다음과 같다. 1. finalizer : 예측할 수 없고, 위험하며, 느리고, 일반적으로 불필요하다. 2. cleaner : finalizer보다는 덜 위험하지만 여전히 예측할 수 없고, 느리며, 보통을 불필요하다. 좀 더 구체적으로 살펴보도록 하겠다. 단점 1. 즉시 수행된다는 보장이 없다. finalizer와 cleaner는 즉시 수행된다는 보장이 없다. 즉, finalizer와 cleaner로는 제때 실행되어야 하는 작업을 절대 할 수 없다. finalizer와 cleaner의 수행 속도는..
-
객체 생성과 파괴 - 아이템 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..