Site icon 한빈(韓斌)의 사고궤적(思考軌迹)

Java에서 JavaScript의 콜백 함수 구현하기

JavaScript에서는 콜백 함수(callback function: 잘 설명된 글 참조)가 빈번하게 쓰인다. JavaScript의 콜백 함수는 보통 다른 함수를 파라미터로 넘겨 받고, 특정 이벤트 이후에 파라미터로 넘겨 받은 다른 함수를 실행하는 식으로 작성한다.

Java에서는 한 함수의 파라미터로 다른 함수를 넘길 수가 없다. 하지만 조금 복잡하긴 해도 콜백 함수를 구현하는 방법이 몇 가지 있다. 이 글에서는 GeeksforGeeks에 올라온 글을 참고하여 Java에서 콜백 함수를 구현하는 방법을 소개하도록 한다. GeeksforGeeks에 올라온 방식은 디자인 패턴 중 하나인 옵저버 패턴을 따른 것이다.

동기식 콜백 함수

동기식은 하나의 요청이 오면 완료가 된 후 다음 요청을 실행하는 방식이다.

다음은 동기식으로 콜백 함수를 구현한 예이다.

// 동기식 콜백 Java 프로그램 예시

interface OnHanbinEventListener {

    void onHanbinEvent();
}
  
class B {
  
    private OnHanbinEventListener mListener; // 리스너 필드
  
    // 리스너 설정
    public void registerOnHanbinEventListener(OnHanbinEventListener mListener)
    {
        this.mListener = mListener;
    }
  
    // 동기식 실행
    public void doHanbinStuff()
    {
  
        // 이곳에 콜백 실행 전에 실행될 코드를 이곳에 작성할 것
        System.out.println("Performing callback before synchronous Task");
  
        // 리스너가 등록돼 있을 경우
        if (this.mListener != null) {
  
            // 클래스 A의 메서드 실행
            mListener.onHanbinEvent();
        }
    }
  
    // 실제 프로그램을 실행하는 메인 함수
    public static void main(String[] args)
    {
        B obj = new B();
        OnHanbinEventListener mListener = new A();
        obj.registerOnHanbinEventListener(mListener);
        obj.doHanbinStuff();
    }
}
  
class A implements OnHanbinEventListener {
  
    @Override
    public void onHanbinEvent()
    {
        System.out.println("Performing callback after synchronous Task");
        // 동기식 콜백 시 실행할 내용을 이곳에 작성할 것
    }
    // 그 외에 onHanbinEvent()에서 호출할 메서드가 있으면 이곳에 작성할 것
}

비동기식 콜백 함수

비동기식은 어떤 요청이 오면 완료가 되기 전에 다음 요청을 실행하는 방식이다.

Java에서는 새 스레드를 만들고 그 스레드에 콜백 메서드를 호출해야 한다. 콜백 기능은 스레드에서 호출할 수 있지만 반드시 그렇게 해야 하는 것은 아니다. 그리고 콜백 자체도 제3의 스레드를 만들어 그 안에서 호출해도 된다.

다음은 비동기식으로 콜백을 구현한 예이다. 아래 코드에서는 새로 만든 스레드 안에 콜백을 집어 넣었다.

// 비동기식 콜백 Java 프로그램 예시
 
interface OnHanbinEventListener {
	
    void onHanbinEvent();
}
  
class B {
  
    private OnHanbinEventListener mListener; // 리스너 필드
  
    // 리스너 설정
    public void registerOnHanbinEventListener(OnHanbinEventListener mListener)
    {
        this.mListener = mListener;
    }
  
    // 비동기식 실행
    public void doHanbinStuff()
    {
  
        // 새로운 스레드에서 비동기식으로 코드 실행
        new Thread(new Runnable() {
            public void run() {
                // 비동기식으로 실행될 코드를 이곳에 작성할 것
                System.out.println("Performing operation in Asynchronous Task");
  
                // 리스너가 등록돼 있을 경우
                if (mListener != null) {
  
                    // 클래스 A의 메서드 실행
                    mListener.onHanbinEvent();
                }
            }
        }).start();
    }
  
    // 실제 프로그램을 실행하는 메인 함수
    public static void main(String[] args)
    {
  
        B obj = new B();
        OnHanbinEventListener mListener = new A();
        obj.registerOnHanbinEventListener(mListener);
        obj.doHanbinStuff();
    }
}
  
class A implements OnHanbinEventListener {
  
    @Override
    public void onHanbinEvent()
    {
        System.out.println("Performing callback after Asynchronous Task");
        // 비동기식 콜백 시 실행할 내용을 이곳에 작성할 것
    }
    // 그 외에 onHanbinEvent()에서 호출할 메서드가 있으면 이곳에 작성할 것
}

그 밖의 방법

옵저버 패턴 외에 커맨드 패턴을 사용하는 등의 다양한 방법으로 콜백을 구현할 수 있다. StackOverflow에 올라온 답변들을 참고하도록 하자.

이 저작물은 크리에이티브 커먼즈 저작자표시-변경금지 4.0 국제 라이선스에 따라 이용할 수 있습니다.