관리 메뉴

드럼치는 프로그래머

[JAVA] callback function이 필요하다면 interface를 이용하자 본문

★─Programing/☆─JAVA

[JAVA] callback function이 필요하다면 interface를 이용하자

드럼치는한동이 2013. 6. 3. 17:17

Java에서 callback function을 이용하려면 어떻게 해야할까?

 

해답은 매우 간단한데, Swing이나 Android에서 사용자 event를 각각의 component 등에서 처리하기 위해 linstener를 등록하는 데에서 찾아볼 수 있다. 잘 알고 있다시피 모든 listener는 interface로 구현되어 있다.

 

다음과 같은 간단한 Java 예제를 통해 interface를 이용해 listener(또는 callback)가 어떻게 동작하는지 살펴보자.

 

아래 예시한 Sum이란 class는 addNumber()란 method를 통해 전달된 값들을 합산하고, getTotal()이란 method를 이용해 그 결과값을 얻을 수 있도록 설계되어 있다. 또한, setMaxNumber()라는 method를 이용해 max 값을 설정하고, Sum 객체가 지닌 합계가 max를 넘게되면 OnMaxNumberCB라는 interface의 onMaxNumber() method를 호출해 현재까지의 합계와 max로 설정된 값에서 초과된 합계의 수을 전달하도록 되어 있다.

 

 

 

 

위의 코드를 살펴보면 Sum class 내부에는 OnMaxNumberCb라는 interface가 정의되어 있고, interface 내부에는 onMaxNumber()라는 method가 선언되어 있다. 또한, Sum class에는 OnMaxNumberCb type의 참조인 myCallback이 선언되어 있고, setOnMaxNumberCb()라는 method를 이용해 myCallback에 listener(또는 callback) 객체의 참조를 저장할 수 있도록 되어 있다.

 

addNumber() method를 살펴보면 adder를 인수로 받아 number에 더해 합산을 구한 후, myCallback이 null이 아닌 경우 등록된 listener(또는 callback)가 존재하므로 현재 합계(number)가 maxNumber를 초과하는지 살펴보고 초과하는 경우 현재 합계와 maxNumber에서 초과된 만큼의 수를 인자로 하여 myCallback의 onMaxNumber() method를 호출하고 있다.

 

 

이번에는 Sum class를 어떻게 사용하는지 살펴보자.

 

 

 

 

main() 함수를 살펴보면 Sum type의 객체 total을 선언하고 Sum의 inner interface인 OnMaxNumberCb type의 interface를 override해 inner class를 정의하였다. override된 onMaxNumber() method의 내용을 살펴보면 console에 현재 합계와 초과된 수를 출력하도록 되어 있다.

 

앞서 Sum class의 내용을 살펴보았듯이 OnMaxNumberCb의 내용만 채워주어서는 listener(또는 callback)은 호출되지 않는다. total 객체의 member method인 setOnMaxNumberCb()를 호출해 조금 전 선언한 listener 객체의 참조를 total 객체에 등록한다.

 

이후 코드를 살펴보면 1부터 11까지 loop를 돌며 Sum class를 이용해 합산을 구하고 있는데, 1부터 10까지의 합이 55로 설정한 maxNumber인 50을 초과하게 되므로 10과 11을 합산할 때 각각 onMaxNumber()가 호출될 것이다.

 

다음은 console에 출력된 결과이다.

 

 

 

interface를 이용해 callback 구조를 만드는 것은 중요하다.

 

DMB를 서비스하는 DMB View를 만든다고 생각해 보자. 약전계에 들어갔을 때나 나왔을 때 앞서와 같이 interface을 이용해 onEnterWeakSigArea(), onExitWeakSigArea()와 같은 callback을 선언하고 해당 상황에서 호출하도록 설계한다면 DMB View를 사용하는 Activity는 약전계에 들어갈 때와 나올 때 그에 맞는 처리를 수행하도록 작업할 수 있을 것이다.

 

이와 같이 기존에 제공되는 View나 class가 아닌 나만의 무엇인가를 만들고자 할 때 callback은 상당히 요긴하게 사용될 수 있다.

 

[출처] http://blog.naver.com/PostView.nhn?blogId=dethgray&logNo=80087298541

Comments