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 국제 라이선스에 따라 이용할 수 있습니다.