문법/Java

[Java] 콜백(callback)함수

jungmin.park 2023. 12. 8. 22:06

콜백

콜백 메소드란 다른 함수에 인수로 전달되는 함수이며, 이벤트 후에 실행되는 것을 말한다.

어떠한 행위를 하면 자동으로 실행되는 함수를 말하는 것

 

public class Main {
    public static void FirstMethod(){
        System.out.println("FirstMethod 호출");
        CallbackMethod();
    }
    public static void CallbackMethod(){ //callback 함수
        System.out.println("콜백함수 호출");
    }
    public static void main(String[] args) {
        FirstMethod();
    }
}
  • FirstMethod를 실행했을 때 Callback가 자동으로 실행되는 것을 볼 수 있다.
  • 즉 어떠한 행위를 했을떄(FirstMethod 호출했을때) 콜백함수(CallbackMethod)가 콜이 되는 것을 살펴볼 수 있다.

 

예시를 들어보자

public interface Strategy {
    public abstract void runStrategy();
}
public class StrategyGun implements Strategy{
    @Override
    public void runStrategy() {
        System.out.println("탕, 타당, 타다당");
    }
}

 

public class Soldier {
    void runContext(Strategy strategy){
        System.out.println("전투 시작");
        strategy.runStrategy();
        System.out.println("전투 종료");
    }
}
  • Soldier 클래스의 runContext에서 runStrategy를 호출하고 있다.

 

public class Client {
    public static void main(String[] args) {
        Strategy strategy = null;
        Soldier rambo = new Soldier();

        strategy = new StrategyGun();
        rambo.runContext(strategy);

    }
}
  • rambo.runContext을 호출 할때(어떠한 행위를 했을때) runStrategy(callback 자동으로 수행된다)도 호출이 된다.
  • 결국 runStrategy는 callback 함수이다.

Client을 함수를 조금 변형시켜보자.

public class Client {
    public static void main(String[] args) {
        Strategy strategy = null;
        Soldier rambo = new Soldier();
        Soldier rambo2 = new Soldier();

        strategy = new StrategyGun();
        rambo.runContext(new Strategy() {
            @Override
            public void runStrategy() {
                System.out.println("칼 칼칼");
            }
        });
        
        rambo2.runContext(new Strategy() {
            @Override
            public void runStrategy() {
                System.out.println("총총총");
            }
        });

    }
}
  • runContext을 호출할때 익명클래스로 구현했다.
  • 이 경우 중복 코드가 발생할 수 있다.
  • Soldier에서 리팩토링을 해볼수도 있다.

 

public static void main(String[] args) {
        Strategy strategy = null;
        Soldier rambo = new Soldier();

        strategy = new StrategyGun();
        rambo.runContext("총총총");

    }
}
public class Soldier {
    void runContext(String weaponSound){
        System.out.println("전투 시작");
        executeWeapon(weaponSound).runStrategy();
        System.out.println("전투 종료");
    }

    private Strategy executeWeapon(final String weaponSound){
        return new Strategy() {
            @Override
            public void runStrategy() {
                System.out.println(weaponSound);
            }
        };
    }
}
  • Strategy을 받아오는 것이 아닌 String을 받도록 한다.
  • Strategy의 runStrategy메소드는 executeWeapon호출되었을때 실행된다.
  • 다시 한 번 말하면 runStrategy 메소드는 callback 함수가 된다.

 

콜백 함수는 전략 패턴의 일종으로 개방 폐쇄 원칙(OCP)과 의존 역전 원칙(DIP)이 적용된 설계 패턴이다.

 

전략패턴에 궁금하다면 https://jung-mmmmin.tistory.com/58

 

[Java] Template Method/Factory Method/Strategy/Template Callback 패턴

Template Method 패턴 " 하위 클래스에서 구체적으로 처리해라 " 상위클래스 : 템플릿에 해당하는 메소드가 정의, 정의 안에는 추상 메소드가 사용되고 있다. 추상 메소드의 정의만 알 수 있다. -> 정

jung-mmmmin.tistory.com

참고바란다.