Java/Effective Java
-
[Effective Java] Item 8. finalizer와 cleaner 사용을 피하라Java/Effective Java 2020. 8. 18. 21:14
자바에서는 두 가지 객체 소멸자를 제공합니다. 바로 finalizer와 cleaner 입니다. finalizer 는 예측할 수 없고, 상황에 따라 위험할 수 있기 때문에 일반적으로 불필요합니다. 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 합니다. 그래서 자바 9에서는 finalizer를 deprecated API로 지정하고 cleaner 를 그 대안으로 소개합니다. cleaner는 finalizer 보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요합니다. finalizer와 cleaner의 부작용 finalizer와 cleaner 는 즉시 수행된다는 보장이 없습니다. 객체에 접근할 수 없게 된 후 finalizer나 cleaner가 실행되기까지 얼마나 걸릴지 알 수 없습니..
-
[Effective Java] Item 7. 다 쓴 객체 참조를 해제하라Java/Effective Java 2020. 8. 18. 00:00
아래의 코드는 메모리 누수가 일어나고 있는 Stack 클래스 입니다. import java.util.Arrays; import java.util.EmptyStackException; 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 ..
-
[Effective Java] Item 6. 불필요한 객체 생성을 피하라Java/Effective Java 2020. 8. 16. 15:19
똑같은 기능의 객체 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많습니다. 특히 불편 객체는 언제든 재사용할 수 있습니다. 다음은 코드는 하지 말아야 할 극단적인 예입니다. String s = new String("hello"); 이 문장은 실행할 때마다 생성자를 통해 String 인스턴스를 매번 생성합니다. 만약 이 문장이 빈번히 호출되는 메서드를 만든다면 같은 기능을 하는 불변 객체를 쓸데없이 매번 생성하게 될 것입니다. 이는 아래와 같은 코드로 개선되어야 합니다. String s = "Hello"; 이 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 인스턴스만 사용합니다. 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴이 사용된다면 사용하는 모든 코드가 같은 객체를 재사용함이 보장..
-
[Effective Java] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라Java/Effective Java 2020. 8. 14. 23:47
의존 객체 주입은 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식입니다. 의존 객체 주입을 이용하면 환경에 따라 다양한 객체를 주입이 가능해짐으로써 사용하는 자원에 따라 동작이 달라지도록 클래스를 유연하게 설계할 수 있습니다. public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Lexicon lexicon) { this.dictionary = Objects.requireNonNull(lexicon); } public boolean isValid(String word) { //something.. return true; } public List suggestions(String typo) { // so..