loading

프로그래밍/JAVA

[JAVA] 콜백?? 리스너??

침착곰 2021. 6. 19. 21:01
반응형

콜백리스너란 한 용어로 알고 있었는데 정리를 하다 보니 콜백과 리스너는 다른 개념이었습니다

비슷하지만 약간 틀린것이었어...

이번 포스팅에서는 콜백과 리스너에 대해서 알아보겠습니다

 

목차

콜백이란??
리스너란??
콜백과 리스너의 차이점
콜백함수 예제
리스너 예제

 


콜백이란??

콜백 메서드란 다른 함수에 인수로 전달되는 함수이며, 이벤트 후에 실행되는 것입니다. 콜백 메서드의 용도는 다른 클래스에서 일부 작업이 완료된 경우 클래스에 완료되었다는 것을 알려줍니다.

 


리스너란??

특정 이벤트를 처리하는 인터페이스로 이벤트의 발생 여부를 기다리다가 이벤트 발생 시 해당 이벤트에 맞는 처리를 수행하는 객체입니다

 


콜백과 리스너의 차이점

제일 간단한 차이점은

콜백 : 이벤트가 발생하면 특정 메서드를 호출해 알려줍니다(1개)

리스너 : 이벤트가 발생하면 연결된 리스너(핸들러)에게 이벤트를 전달합니다(n개)

콜백은 1개, 리스너는 n개로 알아두시면 됩니다

 


 

콜백함수 예제

콜백함수를 사용하기 위한 콜백클래스를 정의해줬습니다

Interface에서는 메인Class에서 호출하기 위한 함수를 정의합니다

계산에 사용할 Class의 변수 Number와 DivNumber를 정의합니다

MainClass에서 불러온 CallBack정의

Main에서 Div를 세팅하면 CallBack에서 DivNumber를 초기화

addNumber()에서 onRestNumber()메서드를 호출해줍니다

설명으로 하려니 조금 어렵네요...

// 콜백클래스
class CallClass2 {
	// onRestNumberCb 인터페이스 정의
	interface onRestNumberCb {
		void onRestNumber(int Number, int Rest);
	}
	
	// Number, DivNumber, CallBack 정의
	private int Number = 0;
	private int DivNumber = 0;
	private onRestNumberCb myCallBack;
	
	// myCallBack 세팅
	public void setOnRestNumberCb(onRestNumberCb callBack) {
		myCallBack = callBack;
	}
	
	// DivNumber 세팅
	public void setDivNumber(int div) {
		DivNumber = div;
	}
	
	// Number에서 DivNumber를 나눈 나머지를 출력 -> CallBack의 onRestNumber호출한다
	public void addNumber(int adder) {
		Number = adder;
		
		if(myCallBack != null) {
				myCallBack.onRestNumber(Number, Number % DivNumber);
		}
	}
}

 

이어서 메인클래스 부분입니다

CallBack클래스 total을 선언합니다

그러면 CallBack함수를 Override하여 Main에서 출력해줄 값을 세팅합니다

이제 CallBack의 나눌값을 5로 세팅하고 CallBack함수를 호출합니다

마지막으로 1부터 100까지 addNumber메서드를 반복합니다

public class CallBackTest2 {
	public static void main(String[] args) {	
		CallClass2 total = new CallClass2();
		
		CallClass2.onRestNumberCb callBack = new CallClass2.onRestNumberCb() {
			
			// CallBack 함수
			@Override
			public void onRestNumber(int Number, int Rest) {
				// TODO Auto-generated method stub
				System.out.println(Number + "를 5로 나눈 나머지는 " + Rest + "입니다");
			}
		};
		
		// 나눌값 및 callBack세팅
		total.setDivNumber(5);
		total.setOnRestNumberCb(callBack);
		
		// 1-100까지의 5로 나누었을 때 나머지값을 불러온다
		for(int i = 1; i <= 100; i++) {
			total.addNumber(i);
		}
	}
}

 

위의 결과값입니다

1부터 100까지의 5로 나눈 나머지 값이 출력된 것을 볼 수 있습니다

 

위의 전체 코드입니다

public class CallBackTest2 {
	public static void main(String[] args) {	
		CallClass2 total = new CallClass2();
		
		CallClass2.onRestNumberCb callBack = new CallClass2.onRestNumberCb() {
			
			// CallBack 함수
			@Override
			public void onRestNumber(int Number, int Rest) {
				// TODO Auto-generated method stub
				System.out.println(Number + "를 5로 나눈 나머지는 " + Rest + "입니다");
			}
		};
		
		// 나눌값 및 callBack세팅
		total.setDivNumber(5);
		total.setOnRestNumberCb(callBack);
		
		// 1-100까지의 5로 나누었을 때 나머지값을 불러온다
		for(int i = 1; i <= 100; i++) {
			total.addNumber(i);
		}
	}
}

// 콜백클래스
class CallClass2 {
	// onRestNumberCb 인터페이스 정의
	interface onRestNumberCb {
		void onRestNumber(int Number, int Rest);
	}
	
	// Number, DivNumber, CallBack 정의
	private int Number = 0;
	private int DivNumber = 0;
	private onRestNumberCb myCallBack;
	
	// myCallBack 세팅
	public void setOnRestNumberCb(onRestNumberCb callBack) {
		myCallBack = callBack;
	}
	
	// DivNumber 세팅
	public void setDivNumber(int div) {
		DivNumber = div;
	}
	
	// Number에서 DivNumber를 나눈 나머지를 출력 -> CallBack의 onRestNumber호출한다
	public void addNumber(int adder) {
		Number = adder;
		
		if(myCallBack != null) {
				myCallBack.onRestNumber(Number, Number % DivNumber);
		}
	}
}

 


리스너 예제

리스너 예제입니다

JFrame을 활용하여 구현하였습니다

버튼에 리스너이벤트를 추가하여 버튼의 이름에 따라 클릭할 때마다 버튼의 이름이 변경됩니다

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

// JFrame 확장
public class ListenerEvent extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	// 리스너이벤트 시작
	public ListenerEvent() {
		// 타이틀 정의
		setTitle("Action");
		
		// 프로그램 클로즈 정의
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// 컨테이너 정의
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		// 버튼 정의
		JButton btn = new JButton("Action");
		
		// 버튼 리스너 정의
		btn.addActionListener(new ActionListener() {
			
			// 버튼(Action) -> 버튼(액션), 버튼(액션) -> 버튼(Action) // 타이틀도 변경
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				JButton btn = (JButton)e.getSource();
				
				if(btn.getText().equals("Action"))
					btn.setText("액션");
				else
					btn.setText("Action");
				
				ListenerEvent.this.setTitle(btn.getText());
			}
		});
		
		// 컨테이너에 버튼 추가
		c.add(btn);
		
		// 컨테이너 속성
		setSize(350,150);
		setVisible(true);
	}

	// Main Start
	public static void main(String[] args) {	
		new ListenerEvent();
	}
}

 

결과 화면

 

여기까지 리스너 예제를 알아봤습니다

저도 콜백리스너를 배우는 단계라 제대로 정리를 못 한 감이 있습니다 ㅠㅜ

그래도 자바를 공부하는 분들께 많은 도움이 되었으면 좋겠습니다!!

반응형
그리드형