문법/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
참고바란다.