도대체 CallBack이 무엇인가?....
정말 많이 들어본 단어인데 도무지 그냥 찾아봐서는 콜백이 뭔지 딱! 머리에 박히질 않는다.
안드 강의에서 snackbar를 사용하면서 action에 대한 콜백을 사용해봤는데 클릭리스너랑 너무 비슷해서 이 둘의 차이도 알아보려고 한다. 🌸🌸 봄 맞이 책상 정리도 깔끔하게 했으니까 레츠고~!! 🌸🌸
CallBack
*답신, 회신, 재통보
1. 다른 함수의 인자로써 이용되는 함수 -> 다른 함수가 먼저 실행되고 이 함수가 자신의 인자로 사용하기 위해 콜백 함수를 수행
2. 어떤 이벤트에 의해 호출되어지는 함수 -> 이벤트가 발생하면 그 '이벤트 발생을 감지' 하고 또 무언가를 수행 (난 이걸 그냥 이벤트의 이벤트 정도로 생각)
어떤 함수가 실행되고 순차적으로 다음 작업을 실행해야 할 때 사용된다.
위 1, 2번을 예시로 들어보면
- 1번 -> 함수1이 실행되고 그 함수의 내용을 수행하기 위해 인자로 함수2를 실행해 return 값을 사용한다면 함수2가 콜백함수(함수1실행 후 함수 2 실행)
- 2번 -> 이벤트가 발생하고 그 발생을 감지해 콜백함수 수행 (이벤트 발생 후 추가 수행을 위해 콜백함수 실행)
SnackBar 포스팅 처럼 버튼뷰 클릭를 통해 스낵바가 나타나는 클릭 이벤트가 발생하면
=> "스낵바가 나타났다", "스낵바가 사라졌다" 라는 메세지를 띄우는 함수가 호출되는 경우를 생각해볼 수 있다.
* 순차적으로 수행되는 콜백함수는 비동기 처리에 중요하다고.... (비동기는 나중에 따로 포스팅해서 이해해보도록 하자)
그런데 위와 같은 설명을 듣다 보면 클릭 리스너를 사용할 때가 생각난다.
💡 버튼을 클릭해서 이벤트가 발생하면 메세지리를 띄우는게 바로 클릭이벤트리스너 아닌가? 그렇다면 리스너가 콜백함수일까?
결론적으로 말하면 우리가 맨날 버튼에 다는 그 클릭 이벤트 리스너의
리스너는 인터페이스이고, 리스너를 구현할 때, 꼭 함께 구현하는 onClick() 메소드 같은 메소드가 콜백함수 이다.
(*콜백함수는 주로 on 으로 시작)
onClickListner 를 구현할 때, 반드시 onClick() 메서드를 오버라이딩 해야 한다고 안내 되는데
이는 이 콜백함수가 리스너 인터페이스의 추상함수이기 때문이다.
이제 리스너와 콜백함수, 그리고 콜백함수의 역할을 어느정도 이해가 된다.
리스너는 말 그대로 listen, 사용자가 어떤 행위를 하는지 잘 듣고, 지켜보고, 감지하는 역할을 한다.
*이는 디자인 패턴의 observer pattern 을 구현한 것이다.
그리고 이 리스너가 감지한 이벤트에 맞게 콜백함수를 호출해서 필요한(사용자가 정의한) 수행을 하도록 요청한다.
그래서 리스너와 콜백함수는 짝꿍이고 종종 함께 다니면서 나를 헷갈리게 했던 것이다.
💡 그렇다면 왜 onClick() 메소드가 콜백함수일까?
내가 버튼을 클릭해서 코드가 실행되는 것인데 콜백함수는 이벤트 발생 그 이후에 뒤이어 발생하는 함수 아닌가?
클릭이벤트리스너를 예시로 들어보자면.
사용자가 버튼을 클릭(사용자가 리스너에게 이벤트 감지하도록 요청) -> 리스너가 클릭 이라는 이벤트를 감지 -> 클릭했으니까 onClick 콜백 함수에 클릭 이벤트 전달(리스너가 콜백함수 실행 요청, 사용자가 한게 아니라 리스너가 시스템 상에서 요청한 것) -> 콜백함수는 이벤트가 관찰 됐으니 코드를 수행
binding.button.setOnClickListener {
/* setOnClickListener는 오버라이딩해야 하는 추상함수(콜백함수)가 1개 이기 때문에
이렇게 람다 함수로 작성이 가능 */
binding.textView.text = "난 당신이 요청한게 아닙니다. 난 사실 리스너가 요청한 콜백함수 입돵"
}
사실 우리는 "내가 버튼을 클릭했기 때문에 텍스트뷰의 텍스트를 저렇게 바꾼거야." 라고 생각할 수 있다.
물론 간접적으로 요청한 것은 맞지만 직접 저 수행을 다이렉트로 요청한 것은 아니다.
사용자는 버튼을 그냥 누른거고, 리스너는 대기를 타다가 클릭이 들어왔음을 감지하고 "야 우리 사용자가 버튼을 눌렀다. 이거 클릭 이라는 이벤트니까 클릭에 대한 처리 해줘. " 라고 시스템에서 콜백함수를 호출한 것이다.
우리가 주로 쓰는 클릭이벤트리스너는 구현할 콜백 함수가 onClick 하나이기 때문에 인터페이스인 리스너와 콜백 함수를 잘 구분하지 못한다. 하지만 예를 들어 (내가 지어낸거임. 실제로 있는지는 모름) 스크롤 리스너가 있다고 치면, 스크롤을 up 하는 행위와 down 하는 행위 두가지 이벤트가 있을 수 있고, 각각의 이벤트에 따라 다른 콜백 함수가 존재할 수 있다. (예를 들면 onScrollUp, onScrollDown)
콜백 : 이벤트가 발생하면 특정 메서드를 호출해 알려준다(1개)
리스너 : 이벤트가 발생하면 연결된 리스너(핸들러)들에게 이벤트를 전달한다(n개)
그래서 이렇게 인용글처럼 리스너는 여러개의(n개) 이벤트를 관찰하고, 감지된 이벤트 1개를 콜백에게 넘겨준다.
[참고]
https://onlyfor-me-blog.tistory.com/47
'Android' 카테고리의 다른 글
[안드로이드/Activity] 객체 전달하기 (0) | 2023.03.18 |
---|---|
[안드로이드/Activity] 데이터 전달 (0) | 2023.03.18 |
[안드로이드/Activity] OnActivityResult 와 registerForActivityResult (0) | 2023.03.10 |
[안드로이드/Activity] Intent 와 Activity 실행 (0) | 2023.03.10 |
[안드로이드/Activity] Activity란 무엇인가? (0) | 2023.03.08 |