아이템 76. 가능한 한 실패 원자적으로 만들어라. 실패 원자성이란 실패 전후로 객체의 상태가 바뀌지 않는 것을 의미함. 실패한 후, 프로그램이 계속 진행된다면 이 때는 실패 원자적으로 만드는 것이 좋음. 실패 원자성 구현 방법 불변 객체로 만듦. 가변 객체의 경우 매개변수의 유효성 검사. 실패할 가능성이 있는 모든 코드를 객체의 상태를 바꾸는 코드보다 앞에 배치. 임시 복사본에서 작업 수행 후, 작업 성공되면 원래 객체와 교환하기 실패 원자성을 보장하지 않아도 되는 경우 실패 원자성을 달성하기 위한 연산의 비용 / 복잡도가 클 경우. ConcurrentModificationException이 발생한 경우. → 이미 콜렉션은 변했기 때문에 어떻게 할 수가 없음 실패 원자성이란? 특정 객체의 메서드를 실행..
아이템 83. 지연 초기화는 신중히 사용하라 지연초기화는 성능 최적화 기법중 하나다. 따라서 안하는게 일단은 최선임. 지연 초기화란? Object lazy; // 수많은 코드 이후. lazy = new Object(); 지연 초기화는 필드가 필요한 시점까지 초기화하는 기법이다. 위의 코드가 간단한 예시이다. 지연 초기화는 '성능 최적화'를 위해 사용되는 기법 중 하나다. 따라서 안하는게 더 좋을 가능성이 있으며, 가급적이면 하지 않는 것이 좋다. 지연 초기화가 도움이 되는 경우 지연 초기화는 실제 필드가 필요한 시점까지 인스턴스를 생성하지 않는다. 이것이 도움이 되는 경우는 다음 조건을 모두 만족할 때다. 물론 만족한다고 해서 성능 개선을 항상 보장하지는 않는다. 초기화 비용이 크다. 이 필드가 잘 호출..
아이템 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 인스턴스를 가져올 수 있다...