saltfactory's blog


Java 에서 Interface를 사용하여 Callback 구현하기

서론

프로그래밍에서 꽤 유용한 기능들이 있는데 그중에서 하나가 바로 Callback 이라는 것이다. Callback은 Windows 개발자라면 익히들 알고 있지만 Java 개발자라면 어쩌면 낯선 단어일수도 있다. 하지만 Java 개발자들에게 Listner와 비슷한거라고 하면 대략적인 Callback의 의미를 상상할 수 있을거라 예상된다. 보통 Callback과 Listener는 어떠한 일을 처리하기 위해서 프로세스가 진행하는 도중에 다른 이벤트 처리에 사용하기 때문이다. 하지만 은밀히 말하면 이 두가지는 디자인 패턴(Pattern)이 다르다. Callback은 Command Pattern을 따르고 있고 Listener는 Observer Pattern을 따르고 있기 때문이다. 이 두가지의 차이점은 나중에 다른 포스팅에서 Listener를 설명하면서 다시 한번 자세히 언급하겠다.

일반적으로 프로그래밍에서 Callback 이라는 용어를 다음과 같이 이야기 한다.

호출자(Caller)가 피호출자(Callee)를 호출하는 것이 아니라 피호출자(Callee)가 호출자(Caller)를 호출하는 것을 말한다.

(참조 http://cafe.naver.com/devctrl.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1727)

위키에서는 다음과 같이 정의하고 있다.

프로그래밍에서 콜백(callback)은 다른 코드의 인수로서 넘겨받는 서브루틴이다. 이를 통해 높은 수준의 층에 정의된 서브루틴(또는 함수)을 낮은 수준의 추상화층이 호출할 수 있게 된다. 일반적으로 먼저 높은 수준의 코드가 낮은 수준의 코드에 있는 함수를 호출할 때, 다른 함수의 포인터나 핸들을 넘겨준다. 낮은 수준의 함수를 실행하는 동안에 그 넘겨받은 함수를 적당히 회수, 호출하고, 부분 작업을 실행하는 경우도 있다. 다른 방식으로는 낮은 수준의 함수는 넘겨받은 함수를 ‘핸들러’로서 등록하고, 낮은 수준의 층에서 비동기적으로(어떠한 반응의 일부로서) 다음에 호출하는데 사용한다. 콜백은 폴리모피즘과 제네릭프로그래밍의 단순화된 대체 수법이며, 어떤 함수의 정확한 동작은 그 낮은 수준의 함수에 넘겨주는 함수 포인터(핸들러)에 의해 바뀐다. 이것은 코드 재사용을 하는 매우 강력한 기법이라고 말할 수 있다.

위의 정의에서 보듯 callback은 포인터나 핸들러를 넘겨줘서 피호출자(Callee)가 호출자(Caller)를 호출하는 기법으로 코드 재상용이 가능하고, 비동기적으로 처리할 수 있으며 함수를 추상화 할 수 있기 때문에 UI나 비동기 처리 시스템에서 callback 기법을 많이 사용한다.

Continue Reading

RVM으로 Ruby 1.9.3 설치시 Error running GEM_PATH 문제 해결하기

서론

RVM(Ruby Version Manager)는 하나의 머신(Mac, PC, Linux 등)에 여러버전의 Ruby 를 설치해서 alternative 하게 Ruby 버전을 동시에 사용할 수 있게 해준다. 이미 Ruby 나 Ruby on Rails를 개발하거나 연구 도구로 사용할 때 RVM은 가장 많이 사용하고 있는 Ruby 환경이 아닐까 생각이된다. 현재 나의 맥에는 RVM을 이용해서 여러버전의 Ruby를 설치하고 테스트하고 있다. Lagacy 서버에서는 ruby 1.8로 만들어진 프로그램들이 있고 최근에는 ruby 1.9 기반으로 만들어진 서버 프로그램들이 있기 때문에 개발용 맥북에서는 동시에 여러버전을 테스트하기 위해서 RVM을 사용하고 있다.

Continue Reading

HAXM와 Atom x86 이미지로 안드로이드 에뮬레이터 속도 빠르게 하기

서론

안드로이드 앱을 개발하면 느린 안드로이드 에뮬레이터 때문에 답답함을 느끼는 개발자가 많을 것이다. 그렇다고 안드로이드 공기계를 구입해서 개발하는 여유가 없다면 안드로이드 개발에 대해서 크게 실망하고 있을지도 모르겠다. 그래서 학생이나 안드로이드 앱 개인 개발자들에게 도움이 되길 바라는 마음에 “안드로이드 앱 개발시 느린 에뮬레이터 대신 Android x86을 이용해서 개발환경 구축하기” 라는 글을 포스팅 했었다. 이 글의 내용은 안드로이드 에뮬레이터를 사용하는 것이 아니라 Virtual Machine 인 VirtualBox에 Android x86 이미지를 사용해서 가상머신으로 안드로이드 운영체제를 설치해서 느린 안드로이드 에뮬레이터 대신에 개발할 때 사용하는 방법이다. 이 포스팅이 작성되고 페이스북에서 몇가지 피드백을 받게 되었다. 박태웅 부사장님께서 Intel에서 배포하는 Atom x86 용 Android Image를 사용하는 방법을 링크로 가르쳐주셨다. 이 실험을 다하고 지나고 난 다음에 이제서야 부사장님의 링크가 무슨 의미인지 알게 되었지만, 이때까지만 해도 Atom x86 이미지를 사용한다고 하더라도 느린 에뮬레이터 문제 때문에 속도 문제는 여전할거라는 주장을 가지고 있었다. 그리고 박성서 대표님께서 안드로이드 에뮬레이터가 JVM의 문제가 아니라 QEMU 가상머신 때문이라는 것을 가르쳐주셨고, 안드로이드의 QEMU 가상머신을 HAXM을 이용해서 가속도를 낼 수 있다고 의견을 주셨다. 그래서 다음날 아침 연구소에 출근하자말자 HAXM에 대해서 조사하고 실험에 들어갔다.

Continue Reading

느린 안드로이드 에뮬레이터 대신 Android x86을 이용하여 개발환경 구축하기

서론

iOS를 개발하면서 Android를 개발할 때 가장 불편한 것이 바로 느린 emulator 문제이다. iOS의 simulator는 실제 디바이스 만큼은 아니지만 빌드하고 개발하는데 큰 불편함 없이 사용할 수 있기 때문에 개발 속도에 큰 영향을 미치지 않지만, android emulator는 참… 난감할 정도로 반응속도가 늦기 때문에 개발할 때 디바이스에 연결해서 개발하고 emulator는 거의 사용하지 않는다. 한동안 iOS만 개발하다가 안드로이드 개발을 시작하려고하니 당장 emulator 때문에 답답한데 android x86를 VM에 설치할 수 있다는 자료들을 읽게 되었다. android x86는 Mac OS X x86과 비슷하게 x86 시스템에 Android 운영체제를 포팅하는 일종의 개발자 운동이다. OSX x86는 해킨이라는 말을 사용하지만 android x86는 오픈소스 기반으로 개발자들이 다양한 디바이스에 포팅하는 운동이 벌어지고 있다. 이렇게 VM에 설치된 android를 개발용으로 사용할 수 있다는 자료들을 접하게 되었다. 그래서 이번 포스팅은 Android를 VM에 설치해서 안드로이드 앱을 개발하는 방법에 대해서 소개하려고 한다.

Continue Reading