※ 클래스A에서 클래스B를 실행하고 클래스B에서 클래스A로 결과값을 반환시 클래스A를 직접 넘겨주는 방식은 클래스간 결합을 복잡하게 하는 경우이다.
※ 이런경우 Interface를 통해 Callback메소드를 구현하는 방법을 쓴다.
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 에 의한 처리가 완료되었음");
}
}
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();
}
}