Lazy는 lazy initalization 기능을 제공한다
즉, 선언 즉시 생성이 아니라 접근(access by Value 프로퍼티)하려하면 그때 생성시켜 준다.
어떤 경우에 더 유용할까?
lateinit
lazy
@Inject
이를 써서 얻은 장점이 여러가지가 있겠지만, @Test
가 붙은 메서드를 작성하기 쉽게 한다는 점에서 둘은 밀접한 관계가 있다.
단위 테스트의 중요성이 강조되는 분위기가 의존 관계 주입의 인기에 촉매가 되기도 했다는데..
의존 관계 주입을 활용한 프로그래밍에서는 객체가 자신이 사용할 객체를 스스로 선택하지 않고, 제 3의 객체가 사용할 객체를 주입한다.
의존 관계 역전이라고 불리는 이 과정에서 반드시 프레임워크가 필요하지는 않다. 객체의 관계를 조립하는 팩토리 클래스를 만들어서 사용할 수도 있다. 다만 DI 프레임워크는 객체 조립 과정을 더 편리하게 한다.
객체의 생성 주기를 제어한다.
@Inject
같은 애노테이션으로 표시하여 객체 주입객체에 부가 기능을 추가한다.
실행 환경에 따라 구현 객체를 바꿔치기도 한다.
관점 지향 프로그래밍, 횡단 관심사의 분리를 허용해 모듈성을 증가시키기 위한 목적인 프로그래밍 패러다임
→ 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원한다
여러 장벽이 있긴 하다.
여러 프레임워크가 있지만, Dagger는 안드로이드 전용이 아니여도 경량이라 android에서 문제 없이 실행된다.
dagger는 android를 염두에 두고 개발했다고 밝혔다.
아래는 안드로이드 대거 문서 중 일부다. 자세한건 링크를 타고 가서 살펴보자
종속 항목 삽입은 앱에 다음과 같은 이점을 제공합니다.
- 클래스 재사용 가능 및 종속 항목 분리: 종속 항목 구현을 쉽게 교체할 수 있습니다. 컨트롤 반전으로 인해 코드 재사용이 개선되었으며 클래스가 더 이상 종속 항목 생성 방법을 제어하지 않지만 대신 모든 구성에서 작동합니다.
- 리팩터링 편의성: 종속 항목은 API 노출 영역의 검증 가능한 요소가 되므로 구현 세부정보로 숨겨지지 않고 객체 생성 타임 또는 컴파일 타임에 확인할 수 있습니다.
- 테스트 편의성: 클래스는 종속 항목을 관리하지 않으므로 테스트 시 다양한 구현을 전달하여 다양한 모든 사례를 테스트할 수 있습니다.