ViewPager를 사용하다보면, 페이지를 전환할 때, 

부모 Activity에서 Fragment의 메소드를 콜 해야하는 경우가 있습니다.

드물기는 하지만, Activity에서 refresh버튼을 클릭해서 fragment를 refresh 하는 경우도 그 중 하나인데요.


이를 구현하기 위해서는, 

Interface를 이용해서 콜백메소드를 실행하는 방법도 있을 거구요.

BaseFragment를 추상클래스로 생성하고 추상메소드를 만든다음, 

상속해서 사용하는 방법도 있을 것입니다.


오늘은 추상클래스와 interface사용하는 두가지 방법에 대해서 간단히 비교 및 정리해 보구요.

실제로 두가지 방법으로 구현해 보도록 하겠습니다.



1. 추상클래스 vs Interface


먼저, 간단하게 추상클래스와 interface에 대해서 간단하게 표로 정리하고 가도록 하겠습니다.


 

 추상클래스

Interface 

 메소드

- 추상 메소드를 가질 수 있다.

- 일반 메소드도 가질 수 있다. 

내부가 구현이 않된 추상 메소드만 가질 수 있다.

 변수 

일반 변수를 가질 수 있다. 

public static final 변수만 가질 수 있다.

 생성자

 생성자를 가질 수 있다.

없다. 

 객체화

 추상클래스를 상속받은 클래스를 통해서 객체화 가능 

interface를 구현한 클래스를 통해 객체화 가능

AInterface object = new ClassImplementedAInterface();

 용도

- 일반 변수나 메소드와 함께 추상메소드가 필요할 때

- 추상메소드만 사용할 때

- interface를 implement한 클래스들에 추상메소드들을 구현하도록 하고자 할 경우

 비고

- 상속을 통해서 구현 

(Java는 다중상속을 허용하지 않으므로 주의해야 함)

 - 상속이 아닌, implement하므로 다중상속이 가능하다.


interface가 여러개를 동시에 implement할 수도 있고, 구현을 함에 있어서도 어떤 메소드들을 구현해야 하는지 좀 더 명시적이구요.

추상클래스를 상속해서 사용할 경우에는 일반 메소드나 변수들을 사용할 수 있다는 장점이 있으므로,

이를 효과적으로 사용할 수 있는 경우에 사용하는 것이 좋을 것 같습니다.


그럼, 실제 코드에서 어떻게 달라지는지 비교해 보도록 하겠습니다.


먼저, 추상클래스와 interface를 비교하기 전에,

HomeActivity에 viewpager와 Refresh버튼을 두고,

Refresh버튼을 누를 경우에,

각 Fragment내의 onRefreshed메소드를 호출한다는 시나리오를 바탕으로,

준비해 보도록 하겠습니다.


참고로 ViewPager의 구현은 아래의 링크를 참조해 주시구요.

>>> 안드로이드에서 카톡방식의 ViewPager + Tab 레이아웃 구현 <<<


먼저, ViewPager의 페이지를 변경할 경우, 

콜백을 해주는 PageChangeListener를 implement 하도록 하겠습니다.



2. PageChangeListener Implement


interface를 implement하거나, 

혹은 추상클래스를 상속해서 사용하기 전에 addOnPageChangeListener를 통해서,

OnPageChangeListener를 implement하겠습니다.



이 interface는 아래의 세가지 메소드를 구현하도록 강제하는데요.




이 중 onPageSelected에서 선택된 페이지의 position을 알아올 수 있으므로,

여기서 position을 가져옵니다.



미리 만들어둔 refresh버튼에 OnClickListener를 set해주고,

버튼을 누를경우, 각 fragment내에 구현해둔 메소드를 호출해주어야 겠습니다.


이제 준비는 다 되었구요.

interface로 구현하던지,

baseClass를 생성해서, 추상클래스를 생성하던지 둘 중의 하나를 해주면 되는데요.

우선 interface를 사용해 보겠습니다.

(추상클래스를 사용하는 방법을 먼저 보시고자 하면, 4로 바로 넘어가셔도 됩니다.)



3. Interface로 메소드 호출하기


OnFragmentSelectedListener라는 인터페이스를 만들어서 각 Fragment에서 implement하도록 하겠습니다.

구현하도록 강제할 메소드는 onFragmentSelected메소드이구요.

이 메소드에서 refresh를 실행하도록 하겠습니다.



Fragment에서 위 interface를 implement하고, 

onFragmentSelected에서 refresh를 할 onRefresh()를 실행하도록 하겠습니다.

onRefresh는 여기서는 생략하겠습니다.

(네트워크를 호출하는 등의 구현을 하면 되겠네요.)




위의 interface를 구현한 Fragment는 어떻게 호출해야 할까요?

ViewPager의 어댑터에 getItem()이라는 메소드에 인자를 주면,

해당 아이템을 얻어올 수 있는데요.

이 방법을 사용해서 선택된 page를 알아올 수 있구요.

선택된 페이지에 구현된, onFragmentSelected를 실행해주면 됩니다.



이렇게 해서, interface를 사용하는 방법에 대해서 정리해 보았구요.

이번에는 추상클래스를 사용해 보겠습니다.



4. 추상클래스로 BaseFragment 구현해서 메소드 호출하기


이번에는 추상클래스를 사용해서 구현해 볼 텐데요.

먼저 아래와 같이 부모가 되는 추상클래스를 생성해 줍니다.




그리고, Viewpager에 들어가는 Fragment들이 이를 상속해주면 됩니다.



이제 해당 Fragment에서 onFragmentSelected를 구현해주기만 하면 됩니다.

interface에서 했던 것과 마찬가지로, 

onRefresh()를 호출해 주겠습니다.




마지막으로 HomeActivity의 refresh버튼을 누를시에,

아래와 같이 현재 선택된 Fragment를 찾아서 위에서 구현한,

onFragmentSelected를 실행해 주면 됩니다.




4. 정리


<1. 추상클래스 vs Interface>에서 비교한 내용대로 한다면,

이 경우는 static이 아닌 일반 변수나 메소드를 필요로 하지는 않는 경우로,

interface를 사용하는 것이 좋을 것 같기는 합니다.

하지만, 아래와 같이, BaseFragment를 사용해서, onAttachContext를 담아두고 사용하거나 하는 경우도 있을 수 있으므로,

그럴 경우에는 추상클래스를 사용하는 것도 좋을 수 있을 것 같습니다.



+ Recent posts