콜백 메서드는 특정한 작업이 완료되었을 때 또는 특정 이벤트가 발생했을 때 호출되는 메서드입니다. 콜백 메서드는 주로 비동기 작업이나 이벤트 기반 시스템에서 사용됩니다. 콜백 메서드를 활용하면 동작을 정의하고 나중에 실행할 수 있기 때문에, 프로그램이 더 유연해지고 모듈화될 수 있습니다.
package com.tenco.callback;
// 버튼이 눌러졌을 때 클릭한 동작을 명시하는 인터페이스를 정의(콜백 메서드 정의)
interface IButtonListener {
void clickEvent(String event);
// void clickDbEvent(String event);
}
public class Button {
String name;
// 무전기 / 휴대폰
private IButtonListener iButtonListener;
public Button(String name) {
this.name = name;
}
// 외부에서 인터페이스 타입을 (구현) 클래스를 인수로 넣어 줄 수 있다.
// 콜백 메서드를 설정하는 메서드
public void addListener(IButtonListener iButtonListener) {
this.iButtonListener = iButtonListener;
}
// 버튼이 클릭되었을 때 메서드 호출 (콜백 메서드 호출)
public void click(String message) {
// 어머기 메세지를 돌아 오게 할 수 있록 (휴대폰)
iButtonListener.clickEvent(message);
//System.out.println("ㅠㅠ 배터리가 없어 엄마에게 호출을 못함");
}
}
package com.tenco.callback;
public class Main {
public static void main(String[] args) {
// 버튼 생성
Button button = new Button("버튼");
// 버튼 클래스 안에는 콜백 메서드가 설계 되어 있다.
// 콜백 메서드에 동작 정의를 외부에서 설계 할 수 있다.
// 익명 클래스 - 인터페이스를 클래스로 따로 확장하지 않고 바로 클래스로 정의해서
// 사용할 수 있다.
button.addListener(new IButtonListener() {
@Override
public void clickEvent(String event) {
// 다시 돌아 와서 호출 되었음 (콜백 메서드 설계)
System.out.println(">>> 나의 마음대로 콜백 메서드 정의 <<<");
System.out.println(event);
}
});
// 버튼 객체의 click() 메서드가 호출
button.click("메시지 전달 : click1");
button.click("또 콜백 메서드 호출 !!!! ");
} // end of class
}
// 1. 어떠한 클래스에 콜백 메서드를 구현 하고 싶다면
// 2. 먼저 휴대폰을 설계 한다 () <-- 인터페이스 설계 (전화, 메시지 보내는 기능)
// 3. 부모 클래스가 있어야 자식 클래스를 생성한다. (main 클래스에 main() 사용)
// 4. 부모가 자식을 생성할 때 휴대폰도 가질 수 있도록 설계
// 5. 자식의 기능인 click() 메서드가 호출 된다면 자동으로 부모에 메세지를 갈 수 있도록
// 콜백 메서드를 정의 했다. (버튼에서 정의 함)
button.addListener(new IButtonListener(){} 익명 클래스다 객체를 생성하는 동시에 전달하고 있다.
package com.tenco.callback.ch02;
public interface IButtonCallback {
void clickPlusButton();
}
package com.tenco.callback.ch02;
import javax.swing.*;
import java.awt.*;
public class MainFrame extends JFrame implements IButtonCallback {
private int count = 0;
private JLabel label;
public MainFrame() {
setSize(300, 200);
setLocation(200, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
label = new JLabel("현재 숫자 : " + count);
label.setFont(new Font("맑은 고딕", Font.BOLD, 25));
add(label);
setVisible(true);
// 자식 객체 생성
SubFrame subFrame = new SubFrame(this::clickPlusButton);
}
// 콜백 메서드 오버라이딩 : 누군가(자식) 이 메서드를 대신 호출 한다.
@Override
public void clickPlusButton() {
count++;
label.setText("현재 숫자 : " + count);
}
// 테스트 코드
public static void main(String[] args) {
new MainFrame();
}
}
SubFrame subFrame = new SubFrame(this::clickPlusButton);
MainFrame 객체의 clickPlusButton()을 전달해준다 필요할때 호출할 수있게 해준다.
package com.tenco.callback.ch02;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SubFrame extends JFrame {
private JButton button;
private IButtonCallback buttonCallback;
public SubFrame(IButtonCallback buttonCallback) {
// 생성자 주입 통애 (익명 클래스를 전달 받는다)
this.buttonCallback = buttonCallback;
setSize(250, 150);
setLocation(550, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
button = new JButton("더하기 버튼");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 내가 직접 숫자를 올리지 않고 연결된 객체의 콜백 메세드를 호출 한다.
// 즉 부모에게 알린다.
buttonCallback.clickPlusButton();
}
});
add(button);
setVisible(true);
}
}
this::clickPlusButton는 현재 객체의 메서드를 함수형 인터페이스인 IButtonCallback에 맞게 전달하는 메서드 참조이다. 결과적으로 IButtonCallback 타입처럼 사용할 수 있으며, 필요할 때 해당 메서드가 호출된다.
메서드 참조를 IButtonCallback 타입의 객체처럼 사용할 수 있게 변환해서 넘긴다
이 표현이 제일 정확해.
new SubFrame(new IButtonCallback() {
@Override
public void clickPlusButton() {
MainFrame.this.clickPlusButton();
}
});
이렇게 넘겨준다고 이해하면 된다.