Programming > Java

[callback] 콜백메소드 구현하기

JAVA에서 Callback 구현

※ 클래스A에서 클래스B를 실행하고 클래스B에서 클래스A로 결과값을 반환시 클래스A를 직접 넘겨주는 방식은 클래스간 결합을 복잡하게 하는 경우이다.
※ 이런경우 Interface를 통해 Callback메소드를 구현하는 방법을 쓴다.

1) 요청하는 쪽의 클래스는 인터페이스를 구현해서 처리 클래스를 요청한다.

public class ClassA implements ClassB.IFCallback{

       public static void main(String[] args) {
             new ClassA();
       }
       public ClassA() {
             //=============
             //  방법1
             //=============
             // ClassB에 ClassA의 인스턴스를 전달한다.
             ClassB clsB = new ClassB(this);
            
             // ClassB에서의 처리가 끝난 후 Callback 메소드를 요청하면
             // Callback 인터페이스 구현한 ClassA의 callback() 메소드가 실행된다.
             clsB.resultValue();
            
             //=============
             //  방법2
             //=============
             ClassB clsB2 = new ClassB();
             clsB2.setCallback(new ClassB.IFCallback() {
                   
                    @Override
                    public void callback() {
                           // 방법2의 콜백 구현
                           System.out.println("무명 Class에 의한 콜백처리 입니다.");
                    }
             });
             clsB2.resultValue();
       }

       @Override
       public void callback() {
             // 방법1 에 의한 콜백함수 구현 (클래스에 인터페이스가 필요)
             System.out.println("Callback 에 의한 처리가 완료되었음");
       }
}

2) 처리 클래스B는 처리후 인터레이스를 구현한 클래스A를 인터페이스를 통해 값을 반환한다.

public class ClassB {

       /**
        * 콜백 인터페이스를 생성한다.
        * 클래스 안에 있을 필요는 없다.
        */
       interface IFCallback {
             public void callback();
       }
      
       // 콜백인터페이스를 구현한 클래스 인스턴스
       private IFCallback _cb;

       // 컨스트럭터 또는 별도 메소드에서 콜백인터페이스 구현한 클래스를 입력
       public ClassB(IFCallback cb) {
             this._cb = cb;
       }
      
       // 방법2를 구현하기 이한 메소드들
       public ClassB() {}
       public void setCallback(IFCallback cb) {
             this._cb = cb;
       }
       /**
        * 본 클래스 안에서 처리된 결과를 인터페이스를 통해 콜백한다.
        */
       public void resultValue() {
             _cb.callback();
       }
}