[안드로이드스튜디오_문화][Hilt_Lazy_Provider]

기말 지하기포·2024년 1월 13일
0

-일반적으로는 객체가 Hilt Component에 바인딩이 되고 , 클라이언트가 Hilt Component에게 바인딩 된 의존성을 주입해달라고 요청을 하는 과정을 통해서 클래스가 의존성을 주입받게 된다.

-그렇다면

Lazy

-Lazy 키워드를 사용하면 의존성이 주입되는 시기가 늦춰진다고 생각할 수 있지만 사실은 그렇지 않다. Lazy 키워드를 사용하여도 의존성이 주입되는 시기는 동일하다.

-하지만 실제 객체는 Hilt Component에 늦게 바인딩이 된다. 즉, Lazy는 의존성이 주입되는 시기를 조절하는 것이 아니라 , 객체 생성 시점을 지연시키고 요청이 있을 때 객체를 생성함으로서 의존성을 주입하는 과정을 의미한다.

-Lazy<>를 사용하면 객체의 초기화를 늦출 수 있고 내가 원하는 특정시점에 객체를 생성할 수 있다.

  • 예시코드(1)
  • Lazy<>에 주입받을 의존성의 타입을 작성해주고 get()을 호출하여 인스턴스를 생성 한 후 사용하면 된다.
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
	
    @Inject
    lateinit var fooLazy : Lazy<Foo>
    
    override fun onCreate(savedInstanceState : Bundle?) {
    	super.onCreate(savedInstanceState)
        
        val foo1 = fooLazy.get()
    }
}

Lazy<>의 특징

-Lazy< T >의 get() 메서드를 호출할 때 T를 반환하며 , get() 메서드가 호출될 때 T가 인스턴스화 된다.

-Lazy< T >의 get() 메서드를 호출한 이후에 다시 get()을 호출하면 동일한 T 인스턴스를 얻는다. 즉, get()을 호출할 때마다 새로운 객체가 생성되는 것이 아니라는 것이다.

-T의 바인딩에 스코프가 지정되어 있다면 , 각 Lazy< T >의 요청에 대해서 동일한 Lazy< T > 인스턴스가 주입된다.

-특정 시점에 바인딩 인스턴스화를 할 때 사용하면 좋다.

-인스턴스 생성의 비용이 큰 경우에 사용하면 좋다.

Provider

-Lazy와 단 한가지 빼고 모두 동일하다.

-Lazy와 다른 차이점 한가지는 get 메서드를 통해 생성되는 객체가 모두 다 새로운 인스턴스라는 것이다. 그러나 get()을 사용했더라도 무조건 새로운 인스턴스가 반환되는 것은 아니다. 자세한 내용은 하단에 작성되어 있다.

Provider<>의 특징

-Provider< T >의 get() 메서드를 호출할 때마다 새로운 인스턴스 T를 반환한다.

-T의 바인딩에 스코프가 비정되어 있다면 , Provide< T >의 get() 메서드를 호출 할 때 동일한 인스턴스 T를 반환한다.

-T의 바인딩에 스코프가 비정되어 있다면 , 각각의 Provide< T > 요청에 대한 동일한 Provider< T > 인스턴스가 주입된다.

-하나의 Provider< T >로 여러 T 인스턴스를 생성하기 원할 때 사용 할 수 있다.

profile
포기하지 말기

0개의 댓글