본문 바로가기

이펙티브 자바9

[아이템 49] 매개변수가 유효한지 검사하라 메서드와 생성자의 입력 매개변수의 값에 제약조건이 있다면 필수적으로 해야 할 것. 메서드에 대한 문서화. 메서드 몸체가 시작되기 전에 매개변수 유효성 검사. 메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을 때 즉각적이고 깔끔한 방식으로 예외를 던질 수 있다. 검사를 제대로 하지 못하면 잘못된 반환 값을 던지거나, 메서드와 관련 없는 예외를 던질 수 있으니 주의해야 한다. 아래 코드는 문서화와 유효성 검사의 전형적인 예이다. 자바 7엔 Objects.requireNonNull 메서드가 추가되어 간편하게 null 검사가 가능하다. public static T requireNonNull(T obj) { if (obj == null) throw new NullPointerException.. 2022. 2. 14.
[아이템 8] finalizer와 cleaner 사용을 피하라 자바는 finalizer와 cleaner라는 두 개의 소멸자가 있다. 결론은 두 소멸자를 사용할 시 오작동, 낮은 성능, 이식성 문제의 원인이 될 수 있어 사용을 지양해야 한다. finalizer와 cleaner는 즉시 수행된다는 보장이 없다. finalizer를 달아두면 그 인스턴스의 자원 회수가 제멋대로 지연될 수 있다. finalizer 스레드는 다른 애플리케이션 스레드보다 우선순위가 낮아서 실행될 기회를 얻지 못할 수 있다. cleaner는 자신을 수행할 스레드를 제어할 수 있지만 즉각 수행되라는 보장이 없다. 수행 시점 뿐만 아니라 수행 여부조차 보장받지 못한다. System.gc, System.runFinalization 메서드가 실행 가능성을 높여줄 수 있으나, 보장은 못한다. finaliz.. 2022. 1. 1.
[아이템 7] 다 쓴 객체 참조를 해제하라 자바는 GC가 메모리 관리를 해주긴 하지만 개발자가 메모리에 신경을 쓰지 않아도 된다는 것은 아니다. 책에서 나온 사례를 간략하게 설명해보겠다. ▶ scope에 따라 GC의 대상이 안될 수 있다. 메서드와 같은 중괄호 { } 안에 만들어진 객체 같은 경우 괄호를 빠져나오게 되면 GC 대상이 되어 수거된다. 하지만 인스턴스 변수나 전역 변수는 GC 대상이 안되기 때문에 사용하지 않는 객체라면 null을 선언해주어 GC 대상이 되도록 만들어야 메모리 낭비가 안된다. ▶ 캐시 데이터를 빠르게 접근하기 위해 캐시라는 임시 저장 공간을 사용한다. 하지만 객체를 캐시에 넣고 나서 그대로 나누면 메모리를 낭비한다. WeakHashMap 사용 : key 값이 null 되면 key, value 값을 제거한다. Sched.. 2021. 12. 23.
[아이템 6] 불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 있다. 무거운 객체라면 매번 생성할 때마다 많은 자원이 들어갈 것이고, 인스턴스를 자주 생성하게 되면 GC가 동작하게 될 확률이 높아진다.(GC는 애플리케이션 성능을 저하시키는 요인 중 하나) String s = new String("hi"); String s = "hi"; String s = new String("hi"); 정확하진 않지만 "hi"라는 문자열은 리터럴 스트링 풀에 저장이 될 것이고, new String()을 호출할 때마다 heap 영역에 String 인스턴스가 저장이 된다. String s = "hi"; String pool에 "hi" 문자열이 저장이 되고, "hi"를 생성할 시 String pool에 있는.. 2021. 12. 21.
[아이템 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 SpellChecker라는 맞춤법을 검사하는 클래스가 있다. 이 클래스는 Lexicon이란 사전 클래스를 의존한다. 코드는 아래와 같다. class SpellChecker { private static final Lexicon dictionary = new KoreanDictionary(); public static boolean isValid(String word) { return true; } public static List suggestions(String typo) { return new ArrayList(); } } class KoreanDictionary implements Lexicon { } interface Lexicon { } 코드에선 KoreanDictionary를 직접 생성해서 사.. 2021. 12. 20.
[아이템 4] 인스턴스화를 막으려거든 private 생성자를 사용하라 정적 필드나 정적 메서드만 가지고 클래스를 구성한다면 인스턴스를 생성할 필요가 없는 클래스가 된다. 이런 경우 private 생성자를 통해 인스턴스화를 막으면 된다. class UtilityClass { private UtilityClass() { throw new AssertionError("인스턴스 생성 방지"); } } 2021. 9. 30.