기기

(동기) 콜백 함수 본문

Java

(동기) 콜백 함수

notEmpty 2020. 10. 11. 22:24

콜백함수

called at back함수. 즉 나중에 다시 호출되는 함수다.

내가(클래스/메서드) 어떤 함수를 넘겨줬는데(or 호출 or 다른 클래스에 정의) 어떤 이벤트/조건에 의해 나중에 거꾸로 호출받는 것(or 결과만 받거나 or 결과가 없어도된다)

중요한 것은 특정 조건에 의해 나중에 호출되는 함수임   

 

예를들면 아래와 같음 

caller 클래스(나) -> callee클래스로 콜백함수를 넘겨줌( 또는 callee 내부에 정의)

이후에 특정 조건에서 callee에서 콜백함수를 실행

 

 

그럼 자바에서 콜백함수는 어떻게 구현될까? 

나는 콜백함수가 무조건 비동기적으로 수행되는건줄 알았지만 아니었다. 

동기적 콜백함수 호출은 다음과 같다. 

 

  1. (콜백)함수를 정의한 Interface 생성
  2. Interface를 구현하는 callee 클래스 정의
  3. 콜백함수를 등록하기 위해 다른 caller 클래스에 callee 객체 주입/생성/추가 등등 
  4. caller에서 callee객체를 통해 콜백 함수 호출

caller는 callee의 (콜백)함수를 호출한다. 그럼 함수가 끝날때까지 기다림(sync)

이후 callee 객체의 (콜백)함수는 결과 또는 결과 없이 종료된다. 

 

+ 비동기 콜백

콜백함수를 처음 접했을때, 비동기 콜백이 어떻게 가능할지 생각했지만, 

새로운 스레드를 생성하고, 그 스레드에서 특정 조건에 콜백을 수행하면 된다 

 

 

새로운 예제 다음과 같다.

인터페이스 : OnGeekEventListener로 onGeekEvent(콜백함수)이벤트 정의

Callee 클래스 : OnGeekEventListener를 구현한다. ( 또는 Caller에서 Callee를 등록할때, 콜백함수를 정의할 수 있다. )

Caller 클래스 : Callee 객체( OnGeekEventListener ) 를 만들고, 등록한다.

 

예를 들기 앞서 예시 이벤트 리스너란

  • 이벤트에 대해 대기중인 함수
  • 이벤트 발생 시 이벤트 리스너가 실행
  • on + '이벤트 명'으로 명명된다. ex) onClick
  • 또 다른 방법으로 addEventListener 로 여러 이벤트 등록 및 제거
  • 여기서의 콜백은 이벤트가 실행됐을때, 사용자에게 다시 알려주는 것을 의미한다.

 

흐름

  1. Caller에 등록되어 대기 중이던 Callee 객체(리스너) 의 이벤트가 발생
  2. Callee의 콜백함수인 onGeekEvent 실행 ( 콜백실행 )
  3. Caller는 콜백함수가 끝날때까지 기다림
// Java program to illustrate synchronous callback 
interface OnGeekEventListener { 

	// this can be any type of method 
	void onGeekEvent(); 
} 

// Caller
class B { 

	private OnGeekEventListener mListener; // listener field 

	// setting the listener 
	public void registerOnGeekEventListener(OnGeekEventListener mListener) 
	{ 
		this.mListener = mListener; 
	} 

	// my synchronous task 
	public void doGeekStuff() 
	{ 

		// perform any operation 
		System.out.println("Performing callback before synchronous Task"); 

		// check if listener is registered. 
		if (this.mListener != null) { 

			// invoke the callback method of class A 
			mListener.onGeekEvent(); 
		} 
	} 

	// Driver Function 
	public static void main(String[] args) 
	{ 
		B obj = new B(); 
		OnGeekEventListener mListener = new A(); 
		obj.registerOnGeekEventListener(mListener); 
		obj.doGeekStuff(); 
	} 
} 

// Callee
class A implements OnGeekEventListener { 

	@Override
	public void onGeekEvent() 
	{ 
		System.out.println("Performing callback after synchronous Task"); 
		// perform some routine operation 
	} 
	// some class A methods 
} 

 

 

 

출처: https://www.geeksforgeeks.org/asynchronous-synchronous-callbacks-java/