콜백 메서드 만들어 보기

Kim taegwan·2026년 4월 21일

콜백 메서드 개념

콜백 메서드는 특정한 작업이 완료되었을 때 또는 특정 이벤트가 발생했을 때 호출되는 메서드입니다. 콜백 메서드는 주로 비동기 작업이나 이벤트 기반 시스템에서 사용됩니다. 콜백 메서드를 활용하면 동작을 정의하고 나중에 실행할 수 있기 때문에, 프로그램이 더 유연해지고 모듈화될 수 있습니다.

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();
    }
});

이렇게 넘겨준다고 이해하면 된다.

0개의 댓글