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