[Android] Hilt의 Provider<T>와 Lazy<T>

박상군·2024년 10월 30일
0

Dependency Injection

목록 보기
4/5
post-thumbnail

안드로이드에서 많이 사용하는 DI 라이브러리인 Hilt에서 보이는 Provider<T>Lazy<T>의 차이점!


우선 위 두 개는 모두 의존성 객체를 지연 초기화(lazy initialization)하는 방법으로, 필요할 때만 생성하도록 도와준다.
코틀린에서 by lazy 키워드 같이 실제 사용 시 객체를 초기화 하여 주입 시켜주는 방법이다.

그렇다면 둘의 차이점은 뭘까?

1. Provider<T>

Provider<T>는 호출할 때마다 새로운 객체를 생성한다. 즉, 여러 번 호출할 경우 매번 다른 인스턴스를 얻는다.
이 방법은 매번 새로운 객체가 필요한 경우 유용하다.

class MyClass @Inject constructor(
    private val dependencyProvider: Provider<MyDependency>
) {
    fun useDependency() {
        val dependency = dependencyProvider.get() // 매 호출마다 새 인스턴스 반환
    }
}

의존성 객체를 여러 번 생성할 수 있으므로 각 호출에서 별도의 인스턴스가 필요할 때 유용하다.

2. Lazy<T>

Lazy<T>는 객체를 한 번만 생성하고, 이후에는 이미 생성된 인스턴스를 재사용하도록 한다.
Hilt에서 Lazy를 사용하려면 @Inject된 필드나 생성자에서 Lazy로 감싸면 된다.

class MyClass @Inject constructor(
    private val lazyDependency: Lazy<MyDependency>
) {
    fun useDependency() {
        val dependency = lazyDependency.get() // 첫 번째 호출 시에만 생성
    }
}

처음 접근할 때만 객체를 생성하므로 불필요한 초기화를 피할 수 있다. 이후 재사용되므로 메모리 사용량이 효율적이다.

0개의 댓글