JIVEPIA :::::

callback function

잡담

callback function

테크한스 2016. 4. 16. 16:49
반응형

written by http://yubylab.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%BD%9C%EB%B0%B1%ED%95%A8%EC%88%98-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0


http://blog.saltfactory.net/java/implement-java-callback.html


--------------------------------------------------------------------------------

Java 에서 Interface를 사용하여 Callback 구현하기

서론

프로그래밍에서 꽤 유용한 기능들이 있는데 그중에서 하나가 바로 Callback 이라는 것이다. Callback은 Windows 개발자라면 익히들 알고 있지만 Java 개발자라면 어쩌면 낯선 단어일수도 있다. 하지만 Java 개발자들에게 Listner와 비슷한거라고 하면 대략적인 Callback의 의미를 상상할 수 있을거라 예상된다. 보통 Callback과 Listener는 어떠한 일을 처리하기 위해서 프로세스가 진행하는 도중에 다른 이벤트 처리에 사용하기 때문이다. 하지만 은밀히 말하면 이 두가지는 디자인 패턴(Pattern)이 다르다. Callback은 Command Pattern을 따르고 있고 Listener는 Observer Pattern을 따르고 있기 때문이다. 이 두가지의 차이점은 나중에 다른 포스팅에서 Listener를 설명하면서 다시 한번 자세히 언급하겠다.

일반적으로 프로그래밍에서 Callback 이라는 용어를 다음과 같이 이야기 한다.

호출자(Caller)가 피호출자(Callee)를 호출하는 것이 아니라 피호출자(Callee)가 호출자(Caller)를 호출하는 것을 말한다.

(참조 http://cafe.naver.com/devctrl.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1727)

위키에서는 다음과 같이 정의하고 있다.

프로그래밍에서 콜백(callback)은 다른 코드의 인수로서 넘겨받는 서브루틴이다. 이를 통해 높은 수준의 층에 정의된 서브루틴(또는 함수)을 낮은 수준의 추상화층이 호출할 수 있게 된다. 일반적으로 먼저 높은 수준의 코드가 낮은 수준의 코드에 있는 함수를 호출할 때, 다른 함수의 포인터나 핸들을 넘겨준다. 낮은 수준의 함수를 실행하는 동안에 그 넘겨받은 함수를 적당히 회수, 호출하고, 부분 작업을 실행하는 경우도 있다. 다른 방식으로는 낮은 수준의 함수는 넘겨받은 함수를 ‘핸들러’로서 등록하고, 낮은 수준의 층에서 비동기적으로(어떠한 반응의 일부로서) 다음에 호출하는데 사용한다. 콜백은 폴리모피즘과 제네릭프로그래밍의 단순화된 대체 수법이며, 어떤 함수의 정확한 동작은 그 낮은 수준의 함수에 넘겨주는 함수 포인터(핸들러)에 의해 바뀐다. 이것은 코드 재사용을 하는 매우 강력한 기법이라고 말할 수 있다.

위의 정의에서 보듯 callback은 포인터나 핸들러를 넘겨줘서 피호출자(Callee)가 호출자(Caller)를 호출하는 기법으로 코드 재상용이 가능하고, 비동기적으로 처리할 수 있으며 함수를 추상화 할 수 있기 때문에 UI나 비동기 처리 시스템에서 callback 기법을 많이 사용한다.

Android에서 Callback

왜 Java에서 Callback을 포스팅하는가 하면 바로 Android 앱을 개발할 때 Fragment를 테스트하기 위한 샘플 코드를 만들게 되면 Activity와 Fragment가 바로 Callback을 사용하고 있기 때문이다. 아래는 이클립스에서 Fragment를 이용한 예제를 샘플로 만들면 만들어지는 코드이다.

package net.saltfactory.tutorial;

import net.saltfactory.tutorial.dummy.DummyContent;

import android.R;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;


public class ItemListFragment extends ListFragment {

    private static final String STATE_ACTIVATED_POSITION = "activated_position";

    private Callbacks mCallbacks = sDummyCallbacks;
    private int mActivatedPosition = ListView.INVALID_POSITION;

    public interface Callbacks {

        public void onItemSelected(String id);
    }

    private static Callbacks sDummyCallbacks = new Callbacks() {
        @Override
        public void onItemSelected(String id) {
        }
    };

    public ItemListFragment() {
    }

   ... 생략 ...

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        if (!(activity instanceof Callbacks)) {
            throw new IllegalStateException("Activity must implement fragment's callbacks.");
        }

        mCallbacks = (Callbacks) activity;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mCallbacks = sDummyCallbacks;
    }

    @Override
    public void onListItemClick(ListView listView, View view, int position, long id) {
        super.onListItemClick(listView, view, position, id);
        mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
    }

    ... 생략

위 코드를 자세히 살펴보면 Callback을 사용하기 위해서 Java의 Interface를 사용한 것을 확인 할 수 있다.

Interface를 사용하여 Callback 구현

Java에서는 Callback을 사용하기 위해서 interface를 사용한다. 좀더 이해를 돕기 위해서 다음 코드를 살펴보자.

처음으로 살펴볼 것은 Callback을 사용할 수 있는 Interface를 만드는 것이다. 그리고 그 안에는 callbackMethod를 추가한다.

/**
 * filename : CallbackEvent.java
 *
 */
package net.saltfactory.tutorial;

public interface CallbackEvent {
	public void callbackMethod();
}

다음은 Callback을 외부에서 Callback method를 등록할 수 있는 EventRegistration 을 만든다. 이때 생성자에서 Callback으로 구현된 객체를 외부에서 전달 받아서 EventRegistration의 doWork() 메소드에서 외부에서 정의한 callbackMethod를 실행하게 한다.

/**
 * filename : EventRegistration.java
 *
 */

package net.saltfactory.tutorial;

public class EventRegistration {
	private CallbackEvent callbackEvent;

	public EventRegistration(CallbackEvent event){
		callbackEvent = event;
	}

	public void doWork(){
		callbackEvent.callbackMethod();
	}
}

다음은 Main에서 호출자(Caller)와 피호출자(Callee)를 만들어서 콜백을 테스트한다. 아래와 같이 호출자(caller)에 구현된 callbackMethod를 등록해서 피호출자(callee)가 호출자(caller)에 구현된 callbackMethod를 실행할 수 있게 되었다.

/**
 * filename :EventApplication.java
 *  
 */

package net.saltfactory.tutorial;

public class EventApplication {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CallbackEvent callbackEvent = new CallbackEvent(){

			@Override
			public void callbackMethod() {
				// TODO Auto-generated method stub
				System.out.println("call callback method from callee");
			}

		};

		EventRegistration eventRegistration = new EventRegistration(callbackEvent);
		eventRegistration.doWork();
	}

}

이 코드를 실행하면 다음과 같은 결과를 확인 할 수 있다.

이 코드를 유사하게 Android에서는 Activity와 Fragment에 Callback을 사용하고 있는데 이는 Fragment는 반드시 Activity를 가져야하고 Fragment는 Activity의 메소드를 비동기적으로 요청해야하기 때문이다. 이와 같은 상황을 콜백메소드를 이용해서 비동기적인 문제를 해결하고 코드를 재사용할 수 있게 Java의 Interface를 사용해서 Callback을 구현한 것이다.

결론

Callback은 호출자(Caller)에서 구현한 메소드를 피호출자(Callee)가 호출해서 사용할 수 있다. 이렇게 외부에서 메소드를 구현화 시키기 때문에 코드의 재사용성이 높아진다. 그리고 Callback는 피호출자(Callee)가 호출자(Caller)에게 비동기적으로 메세지를 보내어서 데이터처리를 비동기 적으로 처리할 수 있는 장점을 가진다. 자바에서 이러한 Callback 구현은 Java의 Interface의 특징을 이용하여 구현할 수 있다.

참고

  1. http://blog.danieldee.com/2009/06/callback-vs-listener.html
  2. http://cafe.naver.com/devctrl.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1727
  3. http://ko.wikipedia.org/wiki/콜백
  4. http://www.javaworld.com/javatips/jw-javatip10.html




--------------------------------------------------------------------------------


최근 들어 node.js를 이용한 서버사이드 프로그래밍이 증가하면서 callback함수에 대한 이해도가 높아질 필요가 있었습니다.

또 흔히들 사용하는 jQuery의 경우에도 대부분의 함수들은 callback방식으로 일을 처리하고 있습니다. 그래서 Callback함수에 대한 이해와 제대로된 사용을 위해 공부하던중 좋은 자료가 있어 번역및 추가적인 내용들을 추가해 보았습니다.

읽고나면 callback함수에 대해 이해하시기에 충분하실듯 합니다.

출처는  : http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/ 입니다.



자바스크립트의 콜백함수의 이해와 사용법

 (Learn JavaScript Higher-order Functions—Callback Functions)

자바스크립트에서 함수는 일급객체입니다일급 객체가 되기 위해서는 몇 가지 조건을 만족하여야 합니다.

1. 변수나 데이터 구조 안에 담을 수 있다.

2. 파라미터로 전달 할 수 있다.

3. 반환값으로 사용 할 수 있다.

4. 런타임에 생성될 수 있다.


자바스크립트에서 함수가 일급객체이기 때문에 우리는 콜백함수로 자바스크립트에서 사용할 수 있습니다.

 

이제부터 우리는 콜백함수의 모든것에 대해서 알아보겠습니다.

자바스크립트에서 콜백함수는 가장 널리 사용되는 기법이고이를 이용해 jquery나 각종 자바스크립트로 만들어진 라이브러리에서 사용되고 있는 것을 확인 할 수 있습니다.

만약 자바스크립트를 개발하는 입장에서는 여전히 콜백함수가 명확하게 개념이 잡혀있지 않다면 이번기회에 확실히 이해를 하고 넘어 가는 것도 나쁘지 않을 것 입니다.

 

 

콜백합수는 함수형 프로그래밍에서부터 발생한 패러다임입니다간단히 말해 함수형 프로그래밍은 함수를 인자처럼 사용을 하는 것인데 이는 소수의 전문가들만이 이해하고 사용하는 기법으로 여전히 이해되고 있습니다.

그러나 운이 좋게도 함수형 프로그래밍은 지속적으로 누군가에 의해 설명되고 분석되어 오면서 우리가 쉽게 이해하고 사용 할 수 있는 수준에 되었습니다.

그중에 가장 두드러진 기술중의 하나가 바로 콜백함수 입니다.

간략하게 설명하자면 단순히 함수를 인자로 넘겨 사용하겠다 입니다이 기법은 매우 쉬워서 왜 이 기술이 높은 수준의 자바스크립트 기술인지 놀랄지경입니다.

 

 

What is a Callback or Higher-order Function?(콜백함수 또는 Higher-order Function이라는게 무슨말일까요?)

콜백함수 higher-order function 이라고 알려진 이녀석은 파라메터로 함수를 전달하는 녀석입니다그리고 전달받은 그 함수를 함수의 내부에서 실행시킵니다콜백함수를 사용한다는 말은 곧 콜백패턴을 안다는 말이기도 합니다.

그럼 Jquery에서 사용하는 간단한 콜백함수의 예를 볼까요?

//Note that the item in the click method's parameter is a function, not a variable.

//The item is a callback function

$("#btn_1").click(function() {

  alert("Btn 1 Clicked");

});

보시는것처럼 우리는 클릭이라는 함수 안에 함수를 파라메터로 전달하고 있습니다그리고 그 함수는 클릭이라는 함수 안에서 동작을 합니다이러한 형태가 가장 전형적인 모습의 자바스크립트에서의 콜백함수 입니다.

또 다른 매우 전형적인 콜백함수의 예제가 있습니다.

var friends = ["Mike""Stacy""Andy""Rick"];

 

friends.forEach(function (eachName, index){

console.log(index + 1 + ". " + eachName); // 1. Mike, 2. Stacy, 3. Andy, 4. Rick

});

forEach라는 함수안에 익명의 함수를 넣어서 forEach 구문이 동작을 하게 하고 있습니다.

지금까지 우리는 예제들을 통해서 익명의 함수를 전달받는 함수나 메서드를 보았습니다그럼 이제는 예제를 통한 이해가 아닌 실제 콜백함수가 어떤식으로 동작을 하는지에 대해서 조금 더 집중해 보겠습니다.

 

How Callback Functions Work?(콜백함수는 어떻게 동작하는가?)

자바스크립트에서의 함수는 일급객체이기 때문에 우리는 이를 객체로 다루면 됩니다이 말은 함수를 변수로 그리고 다른 함수의 리턴값으로 사용이 가능하다는 말입니다함수를 콜백으로 다른 함수의 인자처럼 사용할경우에는 오직 합수의 정의만을 넘겨주면 됩니다함수의 이름만을 넘겨주면 됩니다굳이 함수라고 하여 끝에 () 같은 것을 붙여줄필요가 없습니다.

함수의 인자로 전달된 함수의 경우에는 언제든 원하는 시점에 실행을 시킬수가 있습니다. 

이게 매우 중요한 점인데 콜백함수는 전달 받은 즉시 바로 실행이 될 필요가 없다는 말입니다함수의 이름처럼“called back” , 함수의 내부의 어느 특정시점에 실행을 합니다처음에 봤었던 jquery의 예제에서도 봤지만

//The anonymous function is not being executed there in the parameter.

//The item is a callback function

$("#btn_1").click(function() {

  alert("Btn 1 Clicked");

});

 

익명의 함수는 click이라는 함수의 내부에서 나중에 호출이 됩니다아무런 이름이 없지만 이 함수를 담고 있는 click 이라는 함수는 언제든지 이 함수를 호출할 수가 있습니다.

 

Callback Functions Are Closures(콜백함수는 클로저다.)

우리가 다른 함수의 인자로 콜백함수를 전달할 때전달받은 함수의 특정시점에 그 함수는 동작을 할것입니다마치 전달받은 함수가 이미 콜백으로 받은 함수를 함수내부에서 정의를 한 것처럼 말이지요결국 이 말은 콜백은 클로저다 이말입니다클로저에 대한 자세한 내용은 http://javascriptissexy.com/understand-javascript-closures-with-ease/ 에서 확인이 가능합니다.

우리가 알다시피 클로저는 포함하고 있는 함수의 스코프에 접근을 할수 있습니다그래서 콜백함수는 포함하고 있는 함수의 변수에 접근이 가능하고 심지어 전역변수에도 접근이 가능합니다.

 

 

Basic Principles When Implementing Callback Functions(콜백함수 적용의 기본 원칙)


콜백함수는 복잡하지 않지만 적용하기 위한 몇가지 원칙이 있습니다.

 Use Named OR Anonymous Functions as Callbacks(이름이나 익명의 함수를 사용하라)


위에서 본 jquery foreach함수의 예제에서 보았듯이 우리는 익명의 함수를 파라메터로 사용을 합니다이러한 방식이 가장 일반적인 패턴입니다또 다른 보편적인 방법으로는 함수를 정의해 해당 함수의 이름을 파라메터로 넘기는 방식입니다.

// 전역변수

var allUserData = [];

 

// 콘솔에 결과를 찍는 함수

function logStuff (userData) {

    if ( typeof userData === "string")

    {

        console.log(userData);

    }

    else if ( typeof userData === "object")

    {

        for (var item in userData) {

            console.log(item + ": " + userData[item]);

        }

 

    }

 

}

 

// 두 개의 인자를 받아서 마지막에 콜백함수를 호출한다.

function getInput (options, callback) {

    allUserData.push (options);

    callback (options);

 

}

 

// getInput 함수를 호출할 때 우리는 logStuf이라는 함수의 이름을 인자로 넘긴다.

// 그래서 logStuff 은 콜백함수가 되어 getInput이라는 함수의 내부에서 동작을 할것이다.

getInput ({name:"Rich", speciality:"JavaScript"}, logStuff);

//  name: Rich

// speciality: JavaScript

 


콜백함수로 파라매터 전달(Pass Parameters to Callback Functions)

콜백함수가 실행이 될 때는 그냥 일반 함수와 동일하게 동작을 합니다그래서 우리는 콜백함수에 파라메터를 전달할 수가 있습니다우리는 파라메터로 콜백함수를 감싸고있는 함수 내부의 어떠한 프로퍼티라도 파라메터로 전달할 수가 있습니다아래의 예제를 실행하면 options 파라메터를 콜백함수에 전달할수 있습니다전역변수와 지역변수를 파라메터로 전달할 수 있습니다.

//전역변수

var generalLastName = "Clinton";

 

function getInput (options, callback) {

    allUserData.push (options);

// 전역변수를 콜백함수의 인자로 전달한다.

    callback (generalLastName, options);

}

 

콜백함수가 실행 되기 전에 함수임을 명확하게 하기(Make Sure Callback is a Function Before Executing It)

콜백함수가 인자로 전달되어 함수의 내부에서 실행이 될 때 전달받은 인자가 함수인지를 명확하게 정의 하고 실행하는 것이 좋은 습관이다.

위의 함수를 고쳐보겠습니다.

function getInput(options, callback) {

    allUserData.push(options);

 

    // callback 이 함수 인지를 확인합니다.

    if (typeof callback === "function") {

    // callback 이 함수인지를 확인 했으니까 함수호출합니다.

        callback(options);

    }

}

만약에 이러한 확인 작업이 없다면 callback파라메터를 넘기지 않거나 혹은 함수가 아닌 값을 넘기게 되는 경우에는 실행중에 에러가 발생하는 문제가 일어납니다.


Problem When Using Methods With The this Object as Callbacks (this를 사용한 메서드를 콜백으로 사용시 문제 )

콜백함수가 this객체를 사용하는 메서드인 경우에는 우리는 반드시 this객체의 컨택스트를 보호할 수 있도록 콜백함수를 수정해야 합니다.

예를들면 전역함수에 인자로 콜백함수가 전달된 경우에는 this객체가 window객체를 가리키게 만들거나 또는 콜백함수를 감싸고 있는 메서드를 가리키게 해야합니다.

//객체를 생성합니다.

// 다른 함수의 콜백함수로 전달한 메서드를 정의합니다.

 

var clientData = {

    id: 094545,

    fullName: "Not Set",

    // setUserName clientData의 메서드입니다.

       setUserNamefunction (firstName, lastName)  {

        // this clientData라는 객체를 지칭하고 있습니다.

      this.fullName = firstName + " " + lastName;

    }

}

 

function getUserInput(firstName, lastName, callback  )  {

      

    // Do other stuff to validate firstName/lastName here

 

    // Now save the names

    callback (firstName, lastName);

}

 

getUserInput ("Barack""Obama", clientData.setUserName);

 

console.log (clientData.fullName);// 값에 설정되지 않음

 

// fullName 프로퍼티가 window object의 인자로 세팅됨

console.log (window.fullName); // Barack Obama

이 코드예제에서 clientData내의 setUserName을 실행하면 예상과 달리 clientData내의 this.fullName 의 값으로 세팅이 되지 않습니다.

대신에 window 오브젝트의 값으로 세팅이 되어버리는데 이는 getUserInput메서드가 글로벌 함수이기 때문이다.이러한 일이 발생하는 원인은 this라는 객체가 window객체라는 글로벌한 객체를 가리키고있기 때문이다.

이게 자바스크립트가 가진 문제점 중에 하나입니다작성자가 생각한 this가 때로는 의도치 않게 다른 객체로 나타나게 되는 경우가 있습니다.

이러한 문제를 피하기 위해 jQuery에서는 $(this) 를 사용하거나 커피스크립트에서는 내부에서 처리를 해주고 있습니다.

 

Use the Call or Apply Function To Preserve this (Call  Apply를 통한 this 보호) 


우리는 Call Apply 함수를 통해 이러한 문제를 해결할 수 있습니다일단 모든 자바스크립트의 함수에는 Call Apply라는 메서드를 가지고 있습니다그리고 이 함수들은 함수 내부에서 this객체를 유지하게 하고 인자들은 함수로 전달하는 역할을 합니다.

Call함수는 항상 첫번째 인자로 this 객체를 사용합니다그리고 나머지 인자들은 콤마로 구분하여 보이지 않게 전달을 합니다.

Apply 함수의 경우에도 첫번째 인자로 this객체를 사용합니다하지만 마지막 파라메터의 경우 값들이 배열형태로 존재합니다.

 이게 보면 말은 매우 복잡합니다하지만 코드를 통해 보시면 쉽게 이해가 될것입니다이전의 문제가 있었던 코드를 고쳐보겠습니다우리는 우선 Apply함수를 사용해보겠습니다.

//callbackObj라는 파라메터를 추가했습니다.

function getUserInput(firstName, lastName, callback, callbackObj)  {

    // Do other stuff to validate name here

 

    // 아래의 apply함수는 callbackObj this객체를 매핑합니다.

    callback.apply (callbackObj, [firstName, lastName]);

}

 

 Apply함수를 통해 this 객체를 제대로 정의 할 것입니다우리는 이제 실제 getUserInput을 실행을 하면 제대로 clientData의 값을 세팅하는 것을 확인할수 있습니다. 

// 우리는 clientData.setUserName 메서드와 clientData 객체를 파라메터로 전달합니다. clientData객체는 Apply함수에의해 this 객체로 정의가 될 것입니다. getUserInput ("Barack""Obama", clientData.setUserName, clientData);

 

// 제대로된 결과를 리턴합니다.

console.log (clientData.fullName); // Barack Obama

이러한 동작은 Call 함수를 통해서도 그대로 동작하게 될것입니다.

 

다중 콜백함수(Multiple Callback Functions Allowed)

우리는 여러 개의 콜백함수를 파라매터를 전달할 수 있습니다아래의 코드는 전형적인 jquery ajax 함수 들입니다.

function successCallback() {

    // Do stuff before send

}

 

function successCallback() {

    // Do stuff if success message received

}

 

function completeCallback() {

    // Do stuff upon completion

}

 

function errorCallback() {

    // Do stuff if error received

}

 

$.ajax({

    url:"http://fiddle.jshell.net/favicon.png",

    success:successCallback,

    complete:completeCallback,

    error:errorCallback

 

});

 

  

“Callback Hell” Problem And Solution(콜백 지옥의 문제와 해결책)

간단한 실행을 위한 비동기적인 코드는 가끔 수많은 콜백함수의 연속으로 이어지는 경우가 있습니다아래의 코드를 보시다시피 매우 지저분합니다이른바 콜백지옥입니다이러한 코드는 매우 가독성이 떨어집니다.

아래의 코드의 경우 node-mongodb-native 에서 가져온 예제입니다.

var p_client = new Db('integration_tests_20'new Server("127.0.0.1", 27017, {}), {'pk':CustomPKFactory});

p_client.open(function(err, p_client) {

    p_client.dropDatabase(function(err, done) {

        p_client.createCollection('test_custom_key'function(err, collection) {

            collection.insert({'a':1}, function(err, docs) {

                collection.find({'_id':new ObjectID("aaaaaaaaaaaa")}, function(err, cursor) {

                    cursor.toArray(function(err, items) {

                        test.assertEquals(1, items.length);

 

                        // Let's close the db

                        p_client.close();

                    });

                });

            });

        });

    });

});

이 함수를 간단하게 설명을 하면 우선 몽고디비 서버를 열어 해당 데이터 베이스의 내용들을  삭제를 시킵니다.그리고 그 삭제된 데이터 베이스를 가지고 ‘test_custom_key’ 라는 이름의 컬렉션을 생성합니다생성된 컬랙션에 데이터를 삽입하고 “aaaaaaaaaa”라는 아이디를 가지는 값을 찾습니다이러한 처리가 끝이 나면 그 데이터를 처리하고 DB close 시킵니다.

아마 이러한 코드를 여러분의 코드에서는 만나지 못할 수도 있습니다하지만 node.js 로 서버사이드를 처리하다 보면 의도치 않게 이러한 처리들을 하게 되는 경우가 빈번하게 있습니다.

이러한 콜백지옥에서 탈출하기 위해 2가지 해결책이 있습니다.

1. 메인함수에서 익명의 함수 형태로 인자가 되어 전달되게 하지말고 함수에 이름을 줘서 변수화 시켜 그 함수의 이름을 인자로 전달을 시킵니다.

2. 모듈화를 시킵니다특정작업을 위한 모듈로 분리시켜 필요할 때 불러서 사용하는 형태로 만듭니다.





마지막로 정리를 하며 콜백함수를 사용할 때 주의사항을 말씀드리면

-       코드를 중복하여 사용하는 형태를 피합니다.

-       추상화를 제대로 시켜 더 일반적인 형태로 다양하게 사용될 수 있도록 만듭니다.(특정 형태가 아닌 제너럴한 형태로 만듭니다.)

-       유지가 잘될 수 있도록 만듭니다.

-       읽기 쉽게 만듭니다.

-       함수는 더욱 특정화 시킵니다.

이러한 주의사항을 지킨다면 콜백함수를 제대로 사용할 수 있을것입니다.

실제 원문에는 자신만의 callback함수 만드는 내용이 있지만 개념을 설명하기에는 이걸로 충분할듯합니다.  역시 뭐든 제대로 알고 써야한다는 생각이 듭니다.

반응형