아이템 67. 최적화는 신중히 하라 좋은 구조의 소프트웨어를 만들고, 필요하다면 최적화를 해라. 성능을 위해 견고한 구조를 희생하지 말자. 빠른 프로그램보다는 좋은 프로그램을 작성하라. 프로파일링 도구를 이용해 성능 병목 지점을 찾아서 해결하라. 공개 API 설계 시, 성능에 주는 영향을 고려하라. public 가변 객체의 경우 불필요한 방어적 복사를 요구함 (최적화 관점) Composition으로 해결가능한 것을 상속으로 해결할 경우, public 가변 객체의 단점을 그대로 안고 감. 최적화 시도 전후로 성능을 측정하라. 요약 최적화를 할 때는 다음 두 규칙을 따라야한다. 첫번째, 하지마라. 두번째, 아직 하지 마라. 다시 말해 완전히 명백하고 최적화되지 않은 해법을 찾을 때까지는 하지마라. 최적화는 ..
아이템 66. 네이티브 메서드는 신중히 사용하라. JNI는 사용 경우 : OS 플랫폼 특화 기능이 필요하거나, 네이티브 라이브러리를 대체할 자바 라이브러리가 없는 경우. JNI 사용하면 안되는 경우 : 성능 개선을 위해서 사용할 때. JNI 단점 : 네이티브 언어가 타입 안전하지 않아 자바가 타입 안전하지 않게 되고, 플랫폼 이식성이 낮아짐. JNI란? JNI(Java Native INterface)는 자바 프로그램이 네이티브 메서드를 호출하는 기술이다. 네이티브 메서드는 C, C++ 같은 네이티브 프로그래밍 언어로 작성된 메서드를 의미한다. JNI를 사용해야 할 필요가 있을 때 OS 플랫폼 특화 기능을 활용하고 싶을 때 네이티브 라이브러리를 대체할만한 자바 라이브러리가 없을 때 자바는 최근 성숙해가면서..
아이템 65. 리플렉션보다는 인터페이스를 사용하라. 리플렉션은 Class 객체를 이용해 특정 클래스의 생성자, 메서드, 필드 등을 가져와서 이런저런 작업을 실행해 볼 수 있음. 리플렉션이 필요한지 확신할 수 없다면, 대부분 사용할 필요가 없는 것이다. 리플렉션의 단점 컴파일타임의 타입 검사가 주는 이점을 누릴 수 없음. 코드가 장황해 짐 성능이 떨어짐. 리플렉션의 사용 시점 최대한 제한된 형태로 단순히 사용해야 함. 리플렉션은 객체를 생성하는데만 사용하고, 생성한 객체는 가장 최상위 인터페이스로 받아라. (예를 들면 Set) 리플렉션이란? Class 객체 (Clazz) 가 주어지면, 그 클래스의 생성자, 메서드, 필드에 해당하는 Constructor, Method, Field 인스턴스를 가져올 수 있다...
아이템 84. 프로그램의 동작을 스레드 스케쥴러에 기대지 말라 운영체제 쓰레드 스케쥴러에 의존하지 마라 자바 어플리케이션의 운영체제에 대한 이식성을 낮춘다. 쓰레드를 효율적으로 사용하는 방법은 실행 가능한 스레드가 프로세서보다 너무 많지 않도록 유지하는 것. 실행 가능한 스레드를 가능한 적게 유지하는 것은 컨텍스트 스위칭 비용을 적게 가져가고, Busy Waiting 하는 쓰레드를 줄이라는 의미임. 쓰레드는 바쁜 대기(Busy Waiting)을 하면 안됨. 아무 작업도 하지 않는데 CPU만 점유하는 꼴이 됨. 쓰레드의 상태는 다음으로 나눌 수 있음. 대기 쓰레드 : Object.wait()로 대기중 / synchronized 모니터락을 얻기 위해 대기중인 쓰레드 / Thread.sleep()을 만나 대기..
아이템 81. wait(), notify()보다는 동시성 유틸리티를 애용하라. 동시성 유틸리티(Concurrent 패키지)는 세 가지 맥락을 제공함. Exeuctor Service 관련 (ExeutorService) Concurrent Collection 관련 (ConcurrentHashMap 같은 것들) 동기화 장치 관련 (Semaphour, CountdownLatch 같은 것들) Concurrent Collection 관련 여러 메서드의 원자적인 동작은 필요한 경우 default 메서드로 제공됨. (putIfAbsent) 없는 경우 외부에서 락을 이용한 동기화 필요함. (그러나 느림) 동기화 컬렉션(Collections.synchronizedMap) 대신 동시성 컬렉션(ConcurrentHashMap..