본문으로 바로가기

자바 콜백 패턴 구현해보기

category Java 개발 이야기 2020. 4. 21. 15:48
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



 잠깐 reactive document를 보다가 콜백, 비동기 등등 얘기가 나와서 자바에서는 콜백을 어떻게 구현하는지 한번 정리해보고자 글을 써본다.(reactive document는 내가 영어가 딸려서 번역이 안된다.... 때려침...)


일반적으로 함수 호출을 할 때에는 함수를 호출하는 함수(Caller)와 호출당하는 함수(Callee)가 있다.


쉽게 말해서 A클래스와 B클래스가 존재하고, A클래스에는 a함수가, B클래스에는 b함수가 있다.

A클래스의 a함수가 B클래스의 b함수를 호출한다면 a함수는 Caller이 되고, b함수는 Callee가 된다.


콜백(Callback)은 일반적인 함수 호출의 흐름과 다르게 동작을 한다. 호출을 당한 함수(Callee)에서 호출을 한 함수(Caller)을 호출할 수 있다.



1. 먼저 콜백 interface를 정의하였다.

인터페이스에는 숫자를 더하는 addCount, 숫자를 빼는 subtractCount메서드가 있고, 이게 0보다 작은지 확인하는 isLessZero 메서드가 있다.


1
2
3
4
5
public interface callback {
    void addCount();
    void subtractCount();
    boolean isLessZero();
}




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
32
33
34
35
36
37
38
39
class Callee {
    private int count;
    private callback callBack;
 
    public Callee() { count = 0; }
 
    public void setCallBack(callback callBack) {
        this.callBack = callBack;
    }
 
    public int getCount() {
        return count;
    }
 
    public void addCount() {
        this.count++;
    }
 
    public void subtractCount() {
        this.count--;
    }
 
    public boolean execute() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Input Data : ");
        int condition = scanner.nextInt();
 
        switch (condition) {
            case 1:
                this.callBack.addCount();
                break;
            case 2:
                this.callBack.subtractCount();
                break;
        }
 
        return callBack.isLessZero();
    }
}




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
public class Caller {
    public static void main(String[] args) {
        Callee callee = new Callee();
        callee.setCallBack(new callback() {
            @Override
            public void addCount() {
                callee.addCount();
                System.out.println(callee.getCount());
            }
 
            @Override
            public void subtractCount() {
                callee.subtractCount();
                System.out.println(callee.getCount());
            }
 
            @Override
            public boolean isLessZero() {
                if (callee.getCount() < 0return true;
 
                return false;
            }
        });
 
        while(true) {
            if (callee.execute()) break;
        }
    }
}






'Java 개발 이야기' 카테고리의 다른 글

Garbage Collection Part2  (0) 2020.12.06
Garbage Collection Part1  (0) 2020.12.06
자바 synchronized에 대하여  (0) 2018.11.24
자바 쓰레드(Thread)에 대하여  (0) 2018.11.24
자바 람다와 함수형 인터페이스 - part2  (0) 2018.10.21