버그 잡이

[Kotlin] Generic 제네릭 #base 클래스 generic 코드 해석하기 본문

안드로이드/코틀린

[Kotlin] Generic 제네릭 #base 클래스 generic 코드 해석하기

버그잡이 2020. 6. 15. 16:54

 

1. Generic이란?

 

- 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법

- 인스턴스화 할때 지정됨

 

-> (클래스를 정의할때는 데이터 타입을 확정하지 않고) 해당 클래스의 내용을 실체화할때 구체적으로 type을 명시하는 것

 

 

 

2. 왜 Generic을 사용하는가?

 

- 같은 구성의 클래스일 경우 코드 중복 제거를 위해서 클래스 type을 object로 받을 수 있다.

- 하지만, 이 경우 다른 타입으로 casting 할 경우 추후 casting 시 에러가 발생한다.

- Java는 type에 대한 명확한 지정을 요구하기 때문이다.(python, php, js는 그렇지 않다.)

 

-> "타입 안전 + 코드 중복 제거(다양한 type 대응)" 두 마리 토끼를 잡고 싶다.

 

 

 

3. Generic의 특성

 

"복수의 generic도 가능하다."

 

class Person<T, S>

 

 

"기본적으로 기본형은 generic으로 사용할 수 없다."

 

하지만 굳이 사용하고 싶다면 wrapper 클래스를 사용하면 된다.

ex) int -> Integer

 

 

참조 : opentutorials.org/course/1223/6237

 

 


 

 

(제가 generic을 찾아보게 된 것은 다음과 같은 BasrRecyclerAdapter와 RecyclerViewAdapter 코드를 이해하기 위함이었습니다.)

 

open class BaseRecyclerAdapter<ITEM, B : ViewDataBinding>(
    @LayoutRes val layoutResId: Int,
    val bindingVariableId: Int? = null
) : RecyclerView.Adapter<BaseViewHolder<B>>() {

    private val items = mutableListOf<ITEM>()

	...
}
class MovieRecyclerAdapter<ITEM : Any, B : ViewDataBinding>(
    private val tab: Tabs,
    layout: Int,
    bindingVariableId: Int
) : BaseRecyclerAdapter<ITEM, B>(layout, bindingVariableId) {

}
lateinit var searchResultAdapter: movieRecyclerAdapter<Movie, ItemMovieBinding>

...

movieRecyclerAdapter =
	MovieRecyclerAdapter(searchType, R.layout.item_contents, BR.item)
    binding.movieRecyclerView.adapter = movieRecyclerAdapter

 

 

배운 내용을 바탕으로 위 코드를 분석해보겠습니다.

 

1. BaseRecyclerAdapter 클래스는 ITEMB를 generic으로 설정하여 인스턴스 설정시 각각의 타입을 확정합니다.

 

2. MovieRecyclerAdapter 생성시 BaseRecyclerAdapter를 상속하는데 이때 BaseRecyclerAdapter 인스턴스가 생성됩니다. (이때 MovieRecyclerAdapter 생성시 받은 generic을 받아 넘겨줍니다)

 

 

 

(질문)

 

'BaseRecyclerAdapter<ITEM, B>(layout, bindingVariableId) 에서 <>안을 생략할 수는 없나요?'

 -> 생략 불가능 합니다. 자바에서는 가능하지만 코틀린에서는 generic을 명시적으로 꼭 적어주도록 만들었습니다.

 

 

 

 

3줄 요약

 

1.  Generic은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정해 사용할 수 있게 해준다.

 

2. 이를 통해서 복잡한 코드 없이 다양한 데이터 타입에 대응할 수 있다.

 

3. Base 클래스를 만들어 사용할때도 generic이 자주 쓰이니 패턴을 익혀두자.

 

 

 

반응형
Comments