다음을 정리

이전 영상을 보면서 배웠던 내용은 View -> Presenter -> Model -> Presenter -> View -> Adapter을 정의하였다. 오늘은 아래 그림과 같이 View -> Presenter -> Model -> Presenter -> Adapter View/Model을 바로 갱신하게 된다. 그래서 Activity/Fragment의 View를 한 단계 더 분리하고, 이를 좀 더 편하게 관리하기 위함이다.

생각해보기

MVP를 공부하면서 이번에는 AdapterContract를 분리해서 그 안에 View와 Model을 만들었다. 이렇게 함으로써 View를 거쳐서 Adapter에 접근해야 하는 과정을 줄이고 Presenter에서 Adapter로 바로 update하거나 notify 하도록 함으로써 결합도를 낮출 수 있었다.

하지만 내가 아직 이해가 잘 되지 않는 부분이 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private lateinit var presenter : MainPresenter
private lateinit var imageAdapter : ImageAdapter

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
toolbar.setOnClickListener(this)

imageAdapter = ImageAdapter(this)
recycler_view.adapter = imageAdapter

presenter = MainPresenter().apply {
view = this@MainActivity
imageData = SampleImageData
adapterModel = imageAdapter
adapterView = imageAdapter
}

이 부분은 View에서 Presenter를 사용하는 부분이다. View에서 데이터를 Presenter에게 요청하기 위함이다. 여기서 adapterModel = imageAdapter 이 부분이 나한테는 관건이었다.

분명 adapterModel은 MainPresenter에 정의되어 있고 타입은 ImageAdapterContract.View이다. 그런데 imageAdapter를 대입함으로써 초기화를 진행하고 있다.

깊게 생각해보고 구조를 손으로 그려보니 이해가 갔다. ImageAdapter는 ImageAdapterContract.View, ImageAdapterContract.Model을 상속 받고 있다. 즉, ImageAdapterContract가 부모 또는 상위가 되는 것이고 그를 상속받는 ImageAdapter는 자식 또는 서브가 되는 것이다. 그래서 자식은 상속을 통해서 부모의 메소드를 사용할 수 있는 것처럼 부모 객체에 자식 객체를 대입함으로써 자식 객체의 메소드에 접근할 수 있는 것이라고 생각을 했다.

혹시나 나의 생각이 잘못되었다면 메일이나 댓글을 부탁한다.

참고