포스트

CallBack 사용


콜백 함수(Callback function)이란?

일반적인 함수 호출(call)은 호출하는 함수, 호출자와 호출되는 함수, 피호출자로 나눠져서 호출자가 피호출자를 불러 함수의 기능을 수행한다고 한다.

반면 콜백(callback)은 호출(call)을 거꾸로(back) 하는 것이라고 한다. 피호출자가 호출자를 부르는 것이다.

즉, 일반적으로 사용자가 시스템에 임의의 서비스를 호출하는 것이 보편적이다. 처리 루틴은 시스템에 있고 사용자가 해당 루틴을 요청함에 따라 동작이 일어나는 것이다.

이 호출과는 달리

시스템 측에서 이벤트를 발생시켜 이 처리를 해달라고 요청해오는 과정에서 콜백이 사용된다.

일반적인 경우와는 반대인 상황이다.

이러한 콜백의 장점은 특정 조건이 만족됐을 때 지정한 기능을 수행하는 경우, 조건을 확인하기 위해 계속해서

조건을 만족하는지 확인하는 과정 없이 조건이 만족됐을 때 기능을 호출하기 때문에 효율적으로 기능을 수행할 수 있다는 것이다.

비동기로 조건에 대한 작업을 수행할 수 있게 되기 때문이다.

사용법

예시 : 아래 사용은 Fragment에서 처리하지 못하는 함수를 Activity에 콜백하여 처리하는 방법

  1. Fragment에서 처리하지 못하는 함수를 Activity에 콜백하여 처리하게 하기 위해서 Fragment에 Callback 인터페이스와 관련 생명주기 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
	class StopWatchFragment : Fragment() {
	
	    interface Callbacks {
	        fun onRecordSelected(recordId: UUID)
	    }
	
	    private var callbacks: Callbacks? = null
	
	override fun onAttach(context: Context) {
	        super.onAttach(context)
	        callbacks = context as Callbacks?
	
	    }
	
	override fun onDetach() {
	        super.onDetach()
	        callbacks = null
	    }
	}
  1. Activity에서 콜백함수 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
	class MainActivity : AppCompatActivity(), StopWatchFragment.Callbacks {
	
	override fun onCreate(savedInstanceState: Bundle?) {
					...
			}
	
	//    스탑워치 프래그먼트에서 레코드디테일프래그먼트 호출
	    override fun onRecordSelected(recordId: UUID) {
	        val fragment = RecordDetailFragment.newInstance(recordId)
	
	        supportFragmentManager
	            .beginTransaction()
	            .replace(R.id.fragment_container, fragment, TAG_RECORD_DETAIL)
	            .addToBackStack(null)
	            .commit()
	    }
	
	}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.