자바의 리플렉션이란

이번 포스팅에서는 자바의 리플렉션에 대해 알아보도록 하겠습니다.

1
val bookSearchViewModel = ViewModelProvider(this, factory)[BookSearchViewModel::class.java]

위 코드의 의미는 런타임에 뷰모델을 만들기 위해 BookSearchViewModel 클래스를 ViewModelProvider에게 전달해준다는 의미입니다. 이 때 ViewModelProvider의 get 메소드는 다음과 같이 Class를 전달받아서 ViewModelStoreOwner에게 ViewModel을 반환하게 됩니다.

1
2
@MainThread
open operator fun <T : ViewModel> get(modelClass: Class<T>): T

ViewModelProvider는 컴파일 타임이 아니라 런타임에 실행되어 BookSearchViewModel을 만들어야 하는데 런타임에는 BookSearchViewModel의 클래스 정보를 알 수가 없습니다.

여기서 ::은 자바의 리플렉션 문법인데, 리플렉션은 클래스 타입을 몰라도 그 클래스의 속성에 접근할 수 있게 해주는 API입니다. 그러니까 위의 코드에서는 리플렉션을 통해 ViewModelProvider에게 BookSearchViewModel 클래스 정보를 전달해 준 것이고 따라서 런타임에 BookSearchViewModel 인스턴스가 만들어지게 된 것입니다.

리플렉션 작업은 java.lang.reflect라는 패키지에 의해 수행되는데 다음과 같은 프로퍼티에 대해 접근할 수 있습니다.

출처 : https://docstore.mik.ua/orelly/java/fclass/ch13_01.htm

출처 : https://docstore.mik.ua/orelly/java/fclass/ch13_01.htm

리플렉션을 이용하면 이렇게 런타임에 클래스 정보를 다룰 수 있지만 다음과 같은 단점도 있기 때문에 제한적으로만 사용하는 것이 좋습니다.

  • 컴파일 불가 : 컴파일시 타입 검사나 예외 검사를 할 수 없어 런타임에 문제를 야기할 수 있습니다.
  • 성능 저하 : 리플렉션을 통한 작업은 일반 작업보다 훨씬 느립니다.
  • 내부 노출 : 리플렉션을 사용하면 접근 지시자를 무시할 수 있기 때문에 추상화가 깨지고 플랫폼 업그레이드 시 동작이 변경될 수 있습니다.
Licensed under CC BY 4.0
Built with Hugo
Theme Stack designed by Jimmy