BaseActivity 혹은 BaseFragment를 만들다보면
abstract class BaseActivity<B: ViewDataBinding>(@LayoutRes private val layoutId: Int): AppCompatActivity() {
protected lateinit var binding: B
...
}
위와 같이 쓰게 된다. 근데 왜 binding의 타입을 단순히 ViewDataBinding으로 명시하지 않고 제네릭타입 B로 주는 것인지 궁금했다. 그 이유는 다음과 같다.
우선 제네릭을 사용하는 이유는 무엇이냐.
각 레이아웃마다 고유한 바인딩 클래스가 생성된다. MainActivity에는 ActicvityMainBinding, SplashActivity에는 ActivitySplashBinding이 생성된다.
Base들은 재사용되어야 하고 매번 binding을 정의하는 것은 비효율적이다. 이때, 제네릭을 사용하므로써 BaseActivity를 재사용할 수 있게 된다.
binding의 타입에 제네릭 타입 B를 사용하게 되면 구체적인 바인딩 클래스 타입을 지정하게 되는 것이고 컴파일 시점에 타입 검사가 가능하므로 오류를 줄일 수 있다.