본문 바로가기
IT/JAVA & Eclipse

[Design Pattern] 콜백(Callback) 패턴

by 네야나라 2017. 9. 27.
반응형

콜백(Callback) 패턴


우선 콜백이라는 단어를 모르는 경우를 생각해서 설명하도록 하겠습니다. 일반적으로 호출자(Caller)에 의해서 피호출자(Callee)가 호출되는 형식입니다. 하지만 콜백 패턴은 피호출자가 호출자를 호출하는 것을 말합니다.


이해가 잘 안가시나요?


자바에서 콜백 패턴을 사용하는 코드를 보면서 설명하도록 하겠습니다.


C언어의 경우는 함수 포인터를 사용해서 콜백을 구현하지만 자바는 인터페이스(interface)를 이용해 구현합니다.


우선 Callback이라는 인터페이스를 만들어 줍니다. 

public interface Callback { void call(); }


호출자가 될 Task 클래스를 만듭니다. 이 클래스에서는 콜백 인터페이스를 인자로 받아서 호출해주는 코드를 가지고 있습니다. 추상 클래스로 만드는 이유는 execute 메소드에서 실행되는 내용들이 추가 될 때 Task를 상속받아 쉽게 재사용할 수 있도록 하기 위함입니다.

public abstract class Task {

  public final void executeWith(Callback callback) {
    execute();
    if (callback != null) {
      callback.call();
    }
  }

  public abstract void execute();
}

Task를 상속 받아 SimpleTask 클래스를 만듭니다. 추상 메소드인 execute를 여기서 구현합니다.

public class SimpleTask extends Task { @Override public void execute() { System.out.println("필요한 코드 처리 하고 후에 콜백 메소드 호출 됨"); } }


필요한 클래스는 준비가 되었으니 한번 돌려볼까요?

public class CallbackTest{ public static void main(String[] args) { Task task = new SimpleTask(); Callback callback = new Callback() { @Override public void call() { System.out.println("호출 종료"); } }; task.executeWith(callback); } }

우선 SimpleTask의 객체를 생성하고 인터페이스 Callback의 call 메소드를 구현해 줘야 합니다. 


그 뒤 executeWith메소드를 호출한다면 SimpleTask의 execute메소드가 호출 된뒤 나중에 구현한 call 메소드가 실행될 겁니다.


왜 이렇게 복잡하게 하는 걸까요??


그건 코드의 재사용 가능성을 높이기 위함입니다.


만약 이렇게 하지 않으면 추가 사항이나 변경사항이 있을 때마다 Task 클래스나 SimpleTask 클래스를 수정해야 할 겁니다. 


이 클래스들이 라이브러리라면 다른데서 이미 사용되고 있을 경우 문제가 발생할 수도 있습니다. 또한 특정 상황에 대해서만 대처가 가능해지니 재사용성이 떨어지게 되는겁니다. 이렇게 콜백을 이용한다면 SimpleTask와 같은 라이브러리가 되는 메소드를 수정하지 않고도 변경해서 사용이 가능한 겁니다.


반응형