최근에 콜백 관련하여 좋은 글을 읽게 되었다.
그 글을 읽고 있으니 내가 얼마나 콜백을 껍데기로만 알고 있었는지 깨닫게 되었다.
게다가 해당 글은 안드로이드 개발에 맞춰서 콜백을 분석하였다. (와우~)
알다가도 모를 콜백.
그 좋은 글을 바탕으로 콜백을 다시 이해해보려고 한다.
"콜백(Callback). 알다가도 모르겠구나."
1. 피호출자가 호출자를 호출한다?
함수라도 하나 호출하려고 하면 호출자니 피호출자니 이런건 신경쓸 이유가 없었다.
당연히 호출자가 피호출자를 호출하니깐.
그런데 콜백은 그 반대로 액션을 취한다.
위키에서는 이렇게도 얘기한다.
다른 코드의 인수로서 넘겨받는 서브루틴
이로서 콜백은 다음과 같은 장점인 동시에 특징을 가진다.
- 재사용이 가능함
- 비동기적 처리
- 함수를 추상화
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class MyView extends View implements View.OnTouchListener{ public MyView(Context context) { super(context); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); if(event.getAction() == MotionEvent.ACTION_DOWN){ Toast.makeText(MainActivity.this, "Touch Event received -- 1", Toast.LENGTH_SHORT).show(); return true; } return false; } | cs |
위와 같이 콜백 메서드를 활용할 수 있다.
이때 View.OnTouchListener는 인터페이스 역할을 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | class TouchListenerClass implements View.OnTouchListener{ @Override public boolean onTouch(View view, MotionEvent motionEvent) { if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){ Toast.makeText(MainActivity.this, "Touch Event Received -- 2", Toast.LENGTH_SHORT).show(); return true; } return false; } } TouchListenerClass touchListenerClass = new TouchListenerClass(); | cs |
위와 같이 리스너를 상속받는 클래스를 선언하고 추상 메서드(onTouch)를 구현하는 방식도 있다.
TouchListenerClass는 피호출자.
OnTouchListener는 호출자.
호출자가 가지고 있는 핸들러(onTouch)를 등록하고 피호출자가 이를 실행할 수 있게 된다.
이를 위키에서는 아래와 같이 설명했다.
콜백수신 코드는 넘겨받은 콜백 함수를 '핸들러'로서 등록하고, 콜백수신 함수의 동작 중 어떠한 반응의 일부로서 나중에 호출할 때 사용할 수도 있다 (비동기 콜백)
콜백은 코딩하면서 일상 대화 수준만큼 자주 나오는 키워드이다.
그럼에도 불구하고 아직 제대로 이해하지 못했기에 더 늦기 전에 제대로 정리하고자 했다.
공부하다보니 지금이라도 이해해서 다행이라는 생각이 든다. (잘했어. 칭찬해.)
학습시 참고했던 자료
- https://hychome.blogspot.kr/2015/10/java-callback.html
- http://blog.saltfactory.net/java/implement-java-callback.html (추천)
'Java' 카테고리의 다른 글
Try-with-resources라고 완전 편한게 있습니다. (0) | 2020.06.01 |
---|---|
handler.post와 친구들 (0) | 2017.02.22 |
[Java] Abstract 이해하기 (0) | 2016.09.22 |
[Java] 아주 큰 수에서 가장 큰 소인수를 구하는 방법 (0) | 2016.09.08 |
[Java] 지정한 범위 내에서 특정 숫자가 몇번 들어가는지 세는 방법 (0) | 2016.09.06 |
Comment