이번 포스팅에서는 자바의 리플렉션에 대해 알아보도록 하겠습니다.
|
|
위 코드의 의미는 런타임에 뷰모델을 만들기 위해 BookSearchViewModel
클래스를 ViewModelProvider에게 전달해준다는 의미입니다. 이 때 ViewModelProvider의 get 메소드는 다음과 같이 Class를 전달받아서 ViewModelStoreOwner에게 ViewModel을 반환하게 됩니다.
|
|
ViewModelProvider
는 컴파일 타임이 아니라 런타임에 실행되어 BookSearchViewModel
을 만들어야 하는데 런타임에는 BookSearchViewModel
의 클래스 정보를 알 수가 없습니다.
여기서 ::
은 자바의 리플렉션 문법인데, 리플렉션은 클래스 타입을 몰라도 그 클래스의 속성에 접근할 수 있게 해주는 API입니다. 그러니까 위의 코드에서는 리플렉션을 통해 ViewModelProvider
에게 BookSearchViewModel
클래스 정보를 전달해 준 것이고 따라서 런타임에 BookSearchViewModel
인스턴스가 만들어지게 된 것입니다.
리플렉션 작업은 java.lang.reflect라는 패키지에 의해 수행되는데 다음과 같은 프로퍼티에 대해 접근할 수 있습니다.
리플렉션을 이용하면 이렇게 런타임에 클래스 정보를 다룰 수 있지만 다음과 같은 단점도 있기 때문에 제한적으로만 사용하는 것이 좋습니다.
- 컴파일 불가 : 컴파일시 타입 검사나 예외 검사를 할 수 없어 런타임에 문제를 야기할 수 있습니다.
- 성능 저하 : 리플렉션을 통한 작업은 일반 작업보다 훨씬 느립니다.
- 내부 노출 : 리플렉션을 사용하면 접근 지시자를 무시할 수 있기 때문에 추상화가 깨지고 플랫폼 업그레이드 시 동작이 변경될 수 있습니다.