최적화 기법들은 거의 항상 양날의 검 적인 면모를 갖고 있는 것 같다.
예를들어 데이터베이스에서 조회속도를 높이겠다고 무작위로 인덱스를 생성할 경우, 오히려 full table scan 보다 메모리 낭비 뿐만 아니라 속도 측면에서 그리 좋은 결과를 얻지 못하는 경우도 있다.
이번에 살펴볼 지연 초기화 역시 , 생성 비용을 줄이기 위해 지연 초기화를 적용하는 것이 오히려 성능을 느리게 할 수 있다.
이에 대해 살펴보자
지연 초기화
- 무엇인가?
- 필드의 초기화 시점을 , 해당 필드가 실제로 필요할 때(실제로 접근할 때 ) 까지로 미루는 것을 의미한다.
- 객체 생성이 비용이 큼에도, 이를 초기화하고 나서는 실제로 한번도 사용 되지 않는 경우도 존재한다. 따라서 그 비용을 아끼고자 하는 최적화 기법으로 등장 하였다.
- 용도
- 최적화
- 순환 문제를 해결하기 위하여. (❓ )
지연초기화가 적절하지 않은 경우
- 해당 클래스(정적 필드 일 때) or 인스턴스(인스턴스 필드 일 때) 생성 시 의 초기화 비용은 줄지만, 해당 필드에 대한 “접근 비용”이 커질 수 있다.
- 대부분 해당 필드에 대한 접근 로직을 추가하는 것이기 때문
- 따라서, 초기화 비용 < 필드 사용 비율 인 경우에는 ==⇒ 오히려 지연초기화 가 성능을 저하시킬 수도 있다.
대부분 상황에서는 “일반적인 초기화” 가 더 낫다!!
인스턴스 필드 초기화
인스턴스 필드의 초기화는, 생성시점에 초기화 하는 것이 가장 일반적이다 . 즉시 초기화 하는 것이다
private final FieldType field = computeFieldValue();