일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 찾아라 프로그래밍 마에스터
- 124 나라의 숫자
- 백준
- 짝지어 제거하기
- Brainf**k 인터프리터
- java
- 주사위 윷놀이
- 17825
- 3954
- 카카오2020 공채
- 게리맨더링 2
- 큰 수 만들기
- 정수 내림차순으로 배치하기
- 2018 카카오 공채
- 단체사진 찍기
- 시저암호
- 자바
- 자연수 뒤집어 배열로 만들기
- 프로그래머스
- 12906
- 괄호 변환
- 문자열을 정수로 바꾸기
- 라면공장
- 가장 큰 정사각형 찾기
- 17779
- 후보키
- 2019 카카오 공채
- 카카오 2020 공채
- 투포인터
- programmers
- Today
- Total
기기
(동기) 콜백 함수 본문
콜백함수
called at back함수. 즉 나중에 다시 호출되는 함수다.
내가(클래스/메서드) 어떤 함수를 넘겨줬는데(or 호출 or 다른 클래스에 정의) 어떤 이벤트/조건에 의해 나중에 거꾸로 호출받는 것(or 결과만 받거나 or 결과가 없어도된다)
중요한 것은 특정 조건에 의해 나중에 호출되는 함수임
예를들면 아래와 같음
caller 클래스(나) -> callee클래스로 콜백함수를 넘겨줌( 또는 callee 내부에 정의)
이후에 특정 조건에서 callee에서 콜백함수를 실행
그럼 자바에서 콜백함수는 어떻게 구현될까?
나는 콜백함수가 무조건 비동기적으로 수행되는건줄 알았지만 아니었다.
동기적 콜백함수 호출은 다음과 같다.
- (콜백)함수를 정의한 Interface 생성
- Interface를 구현하는 callee 클래스 정의
- 콜백함수를 등록하기 위해 다른 caller 클래스에 callee 객체 주입/생성/추가 등등
- caller에서 callee객체를 통해 콜백 함수 호출
caller는 callee의 (콜백)함수를 호출한다. 그럼 함수가 끝날때까지 기다림(sync)
이후 callee 객체의 (콜백)함수는 결과 또는 결과 없이 종료된다.
+ 비동기 콜백
콜백함수를 처음 접했을때, 비동기 콜백이 어떻게 가능할지 생각했지만,
새로운 스레드를 생성하고, 그 스레드에서 특정 조건에 콜백을 수행하면 된다
새로운 예제 다음과 같다.
인터페이스 : OnGeekEventListener로 onGeekEvent(콜백함수)이벤트 정의
Callee 클래스 : OnGeekEventListener를 구현한다. ( 또는 Caller에서 Callee를 등록할때, 콜백함수를 정의할 수 있다. )
Caller 클래스 : Callee 객체( OnGeekEventListener ) 를 만들고, 등록한다.
예를 들기 앞서 예시 이벤트 리스너란
- 이벤트에 대해 대기중인 함수
- 이벤트 발생 시 이벤트 리스너가 실행
- on + '이벤트 명'으로 명명된다. ex) onClick
- 또 다른 방법으로 addEventListener 로 여러 이벤트 등록 및 제거
- 여기서의 콜백은 이벤트가 실행됐을때, 사용자에게 다시 알려주는 것을 의미한다.
흐름
- Caller에 등록되어 대기 중이던 Callee 객체(리스너) 의 이벤트가 발생
- Callee의 콜백함수인 onGeekEvent 실행 ( 콜백실행 )
- Caller는 콜백함수가 끝날때까지 기다림
// Java program to illustrate synchronous callback
interface OnGeekEventListener {
// this can be any type of method
void onGeekEvent();
}
// Caller
class B {
private OnGeekEventListener mListener; // listener field
// setting the listener
public void registerOnGeekEventListener(OnGeekEventListener mListener)
{
this.mListener = mListener;
}
// my synchronous task
public void doGeekStuff()
{
// perform any operation
System.out.println("Performing callback before synchronous Task");
// check if listener is registered.
if (this.mListener != null) {
// invoke the callback method of class A
mListener.onGeekEvent();
}
}
// Driver Function
public static void main(String[] args)
{
B obj = new B();
OnGeekEventListener mListener = new A();
obj.registerOnGeekEventListener(mListener);
obj.doGeekStuff();
}
}
// Callee
class A implements OnGeekEventListener {
@Override
public void onGeekEvent()
{
System.out.println("Performing callback after synchronous Task");
// perform some routine operation
}
// some class A methods
}
출처: https://www.geeksforgeeks.org/asynchronous-synchronous-callbacks-java/
'Java' 카테고리의 다른 글
PATH, CLASSPATH, BUILDPATH에 대해 (0) | 2021.12.29 |
---|---|
[Java] 예외 처리 - custom exception (0) | 2021.09.22 |
[Java] 예외처리 시 주의 팁 (0) | 2021.09.19 |
[Java] 시간(Time)/날짜(Date) 제공 클래스 및 시간 비교 (0) | 2021.08.16 |
eclipse - workspace, project, package, class (0) | 2021.01.07 |