Effective Java8 [아이템 50] 적시에 방어적 복사본을 만들라 클라이언트가 우리의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍을 해야 한다. Period.class final class Period { private final Date start; private final Date end; public Period(Date start, Date end) { if (start.compareTo(end) > 0) throw new IllegalArgumentException("start가 end보다 늦다."); this.start = start; this.end = end; } public Date getStart() { return start; } public Date getEnd() { return end; } } start와 end가 한번 .. 2022. 2. 15. [아이템 49] 매개변수가 유효한지 검사하라 메서드와 생성자의 입력 매개변수의 값에 제약조건이 있다면 필수적으로 해야 할 것. 메서드에 대한 문서화. 메서드 몸체가 시작되기 전에 매개변수 유효성 검사. 메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을 때 즉각적이고 깔끔한 방식으로 예외를 던질 수 있다. 검사를 제대로 하지 못하면 잘못된 반환 값을 던지거나, 메서드와 관련 없는 예외를 던질 수 있으니 주의해야 한다. 아래 코드는 문서화와 유효성 검사의 전형적인 예이다. 자바 7엔 Objects.requireNonNull 메서드가 추가되어 간편하게 null 검사가 가능하다. public static T requireNonNull(T obj) { if (obj == null) throw new NullPointerException.. 2022. 2. 14. [아이템 26] 로 타입(raw type)은 사용하지 말라 아이템 26부터 제네릭에 대한 내용이다. 로 타입이란 타입 매개변수가 없는 제네릭 타입으로 List를 예로 들 수 있다. List rawList = new ArrayList(); // 로 타입 리스트 List strings = new ArrayList(); // 문자열을 담는 리스트 List integers = new ArrayList(); // 정수를 담는 리스트 rawList.add(1); rawList.add(1.1); rawList.add("raw"); rawList.add('r'); strings.add(1); // 컴파일 에러 로 타입은 Object를 넣을 수 있어 어떤 객체도 담을 수 있다. 그래서 문제가 되는데 예상치 못하게 넣지 말아야 할 객체를 넣었다면 형 변환 런타임 오류가 발생할 수.. 2022. 2. 7. [아이템 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. 이전 1 2 다음