BaseActivity(혹은 Fragment), binding: B -> 왜 제네릭타입으로 줘요 ViewDataBinding을 타입으로 주면 안되나요?

Hue·2024년 7월 31일

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를 사용하게 되면 구체적인 바인딩 클래스 타입을 지정하게 되는 것이고 컴파일 시점에 타입 검사가 가능하므로 오류를 줄일 수 있다.

0개의 댓글