Callbackfunction란?

Callbackfunction는 function내에서 매개변수를 받을 때 받는 변수중 function인 것들을 Callbackfunction라고 한다. 자바8에서 추가된 기능인 람다식이 가장 큰 예이다. 자바스크립트와 같이 callback function를 지원하는 언어에서는 별다른 추가 없이 매개변수를 function로 주면 끝나나 Java에서는 Interface를 통해 Abstract method를 추가를 해줘야 한다.

JavaScript 에서의 Callback Function

function example(how,are,you){
    .....
    you();
}
example("I","am",function(){
    console.log("seungmun");
});

위와 같이 JavaScript에서는 변수와 function를 저장하는 공간에 차이가 없기 때문에, 표시는 다른 변수와 같이 하고 function내에서 실행을 시켜주면 된다. 그리고 사용은 function를 따로 선언하고 해도 되고 그게 귀찮으면 위에서 처럼 function를 통채로 넘겨 줄 수도 있다.

Java 에서의 Callback Function

public interface CallBackEvent {
    public void callBackEvent(Object obj);
}

위와 같이 interface를 만들어 주고,

public class Test {
    public void testMethod1(){
        System.out.println("who are you");
    }
    public void testMethod2(CallBackEvent event){
        event.callBackEvent(this);
    }
}

CallBackEvent interfac를 매개변수로 가지는 메소드를 지닌 class를 만든다. 그리고 event interface에 있는 Abstract methodcallBackEvent를 호출한다. 이때 this를 넘겨주는데 이런식으로 넘겨주면 객체를 넘겨는형식이 된다. 그래서 그 class에 있는 모든 method를 사용이 가능하다.

public class MainThread {
    public static void main(String[] args) {
        String name="seung mun";
        Test test=new Test();

        test.testMethod2(new CallBackEvent() {
            @Override
            public void callBackEvent(Object obj) {
                ((Test)obj).testMethod1();
                System.out.println("who are you");
            }
        });
    }
}

이 코드에서 알아야 하는 부분이 있는데 우리가 class를 선언하고 사용을 할때 2개의 명령어를 통합해서 대부분 사용하는데 분리를 하면,

Test test=null;

부분으로 자바의 class를 선언하는 부분과

 new Test();

부분으로 자바의 생성자를 호출 함으로서 객체를 생성하는 부분이다. 내가 왜 이부분을 알아야 한다고 했냐면, 우리가 자바에서 abstract method가 있는 classinterface의 객체를 생성하면 abstract method를 채워야 한다. 이 말은 선언까지만 하면 추상메소드를 채울 필요가 없다는 사실이다. 참고로 자바에서는 선언만해도 그 class 내부에있는 메소드를 사용이 가능하다. 물론 선언만 한 class 내부에 있는 메소드를 사용하면 NullPointerException이 발생하지만 일단 컴파일러 검사에서는 문제가 없다.

Ramda

자바에서는 이를 지원하기 위해 자바 8부터 람다식이라는 것을 지원하는데, 위 java에서 사용한 예제를 람다식으로 변경을 해보겠다.

@FunctionalInterface
public interface CallBackEvent {
    public void callBackEvent(Object obj); 
}

그전과 같이 interface를 만들어주고 @FunctionalInterface어노미테이션을 넣어줌으로서 현재 interface에 람다식으로 사용할 메소드를 하나로 고정한다.

public class MainThread {
    public static void main(String[] args) {
        String name="seung mun";
        Test test=new Test();

        test.testMethod2((obj)->{
            ((Test)obj).testMethod1();
            System.out.println("who are you");
        });
    }
}

위에처럼 작성을 하면 되며 상당히 줄어든다. 여기에서 더 줄어 들 수 도 있는데, 만약 넘겨줄 메소드의 codeline이 1줄인경우 다음과 같이 할 수도 있다.

public class MainThread {
    public static void main(String[] args){
        Test test=new Test();
        String name="seung mun";

        test.testMethod2((obj)->System.out.println("who are you"));
    }
}

이처럼 자바에서 람다식을 사용함으로 codeline을 상당히 줄여 줄수 있다.

필요성

java로 조금이라고 디자인패턴을 이용하여 프로그래밍을 하면 codeline이 상당히 길어 지는데, 이런식으로 만들어지는 codeline이 늘어나면 하나의 class만 보고 이 class가 무슨일을 하는지 한번에 이해가 어려워 진다. 이때 callback을 이용하면, 하나의 class를 보고 이 class의 역활을 이해하는데 좀더 쉬워진다.

results matching ""

    No results matching ""