반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함


Posted on . Written by




오늘의 guest tutorial 은 Matt Webster 가 제공해 드립니다. Corona SDK 로 모바일 앱을 개발하는 개발자가 되고 싶어하는 친구 입니다. 그는 여러해 동안 닷넷 기반의 웹사이트 프로젝트에 참여했었고 현재는 런던에서 모바일 앱 관련된 웹 서비스를 manage 하고 있습니다. 그는 physics 에 대해 관심이 많고 관련 글들 과 code sample 들을 Corona Code Share 에 올려 공유했었습니다. 그리고 그의 블로그 blog 에도 공유를  하고 있구요. 여기로 가시면 Matt 의 트위터here에 follow 하실 수 있습니다.

Corona SDK 는 간단하고 강력하면서 아주 많은 유용한 API 들이 있습니다. 여러분들이 바라는 특별한 그 무엇이 있기도 하지요. 이 튜토리얼에서는 아래와 같은 것들이 다뤄 질 겁니다.

    1. 기존의 라이브러리에 새로운 기능 추가하기
    2. 기존의 기능을 확장하기

   


Corona API Libraries

Corona SDK 의 주요 기능들은 API 라이브러리를 통해서 제공됩니다. 아래 링크로 가시면 관련 문서를 보실 수 있습니다.

http://docs.coronalabs.com/api/index.html

string 라이브러리를 보면 다음과 같은 기능들을 보실 수 있습니다.

    string.byte()
    string.char()
    string.find()
    string.format()
    etc…


이 기능들은 Lua 에 있지는 않습니다. Objective-C (iOS) 나 Java (Android)에 있는 기본적인 기능들을 hooks 한 거지요.  math, graphics 나 다른 라이브러리들도 마찬가지 입니다.

어떤 라이브러리들은 완전히 Lua 만을 사용하기도 하죠. 예를 들어 코로나의 widget 라이브러리를 들 수 있습니다. Corona Labs는 original source code 도 가능하도록 기능을 제공합니다. Lua 의 룰에 따르기만 하면 개발자들이 그들만의 코드를 implement 할 수 있습니다. 사실  string  라이브러리를 포함한 모든 라이브러리는 Lua 테이블 입니다. (String 은 테이블입니다. 그리고 각 기능들은 그 테이블의 멤버들이죠.)

그렇기 때문에 쉽게 어떤 필요한 것들을 할 수가 있는 겁니다.


A Useful Custom Function


첫번째로 우리가 배울 것은 어떻게 우리가 만든 기능들을 코로나의 APO 라이브러리에 추가하느냐 입니다. 왜 이게 필요할까요? 예를 들어 string으로부터 space를 없애는 아주 유용한 기능을 가지고 있다고 합시다. 대부분의 프로그래밍 언어에서는 이를 위해 trim() 를 사용합니다.



local function trim( str )
   return ( str:gsub("^%s*(.-)%s*$", "%1") )
end



이 함수 내의 내용에 대해 아실려고 할 필요는 없습니다. 그냥 여러분이 이걸 만들었다고 생각합시다. 아주 훌륭한 코드 입니다. 그리고 시작과 끝에 필요없는 space들을 가지고 있는 string에서 그 space들을 없애는 일을 아주 훌륭히 해 냅니다.



print( trim( " Hello World! " ) )
--Outputs: Hello World!



코로나 개발자들이 흔히 자주 하는 일들 중 하나인데요.  이 trim() 함수를 custom Lua module 에 넣는 일이죠. utils.lua 같이요. 그 방법도 괜찮습니다. 그런데 더 기억하기 쉽고 category 에 맞게 이 일을 진행할 수 있습니다. 이 함수는 string 함수입니다. 이 함수를 built in string 함수처럼 접근하도록 하면 어떨까요?


Adding to Corona’s APIs

이 custom trim() 함수가 utils.lua 파일에 들어 있다고 합시다. 모든 동작이 이 파일 안에서 이뤄지기를 원합니다.  이를 위해 utils.lua는 standard require() call 이 사용되는 메모리 안에 있어야 합니다.

require("utils")

utils.lua 에 있는 함수는 아래와 같을 겁니다.



local function trim( str )
   return ( str:gsub("^%s*(.-)%s*$", "%1") )
end



이제 이 함수를 코로나의 string library 에 추가해 봅시다. 그냥 standard table value assignment 를 따르기만 하면 됩니다.


string.trim = trim



이게 다 입니다. 이제 여러분 코드 어디에서든지 이 함수를 call 하시면 됩니다.



string.trim(" Hello World! ")
--Outputs: Hello World!




The Beauty of Libraries



아래와 같이 스트링을 정의했습니다.



local str = " Hello World! "



string 라이브러리에 trim() 함수를 갖고 있을 때의 이점은 이제 우리는 이 함수를 어떤 스트링의 멤버로서 call 할 수 있다는 겁니다.



print( str:trim() )
--Outputs: Hello World!




스트링 라이브러리가 일반적으로 스트링 변수를 다루는 방법이죠.


Lua 101 (Sort of)



Note: Skip to the end of this tutorial for links to some more advanced topics in the Lua language.

Programming in Lua  웹사이트의 Section 6에서는 함수를 “first-class values with proper lexical scoping.” 로 묘사하고 있습니다. 도대체 이게 무슨 소리인지 더 궁금해 질 것 같군요.


간단히 말하면 Lua 에서 함수를 정의할 때 변수처럼 그 이름을 pass 하실 수 있습니다. 여러분들은 함수에 argument로서 이것을 pass 할 수도 있죠. 혹은 나중에 사용하기 위해 변수에 저장할 수도 있구요. 이런 작업은 아마 수도 없이 해 보셨을 겁니다.

어떤 value 로서 함수를 pass 하는 일반적인 instance는 timer.performWithDelay() 함수와 같이 쓰는 방법입니다.



local function HelloWorld()
   print( "Hello!" )
end

timer.performWithDelay( 1000, HelloWorld, 10 )




이 코드는 10번 Hello를 print 하는데 1초에 한번씩 print 할 겁니다. 그 과정을 풀어서 쓴다면.

    1. low-level timer 함수는 1000 밀리세컨드(1초)를 기다립니다.
    2. 이 timer 함수는 HellowWorld() 함수를 call 합니다.
    3. 이 timer 함수는 count 10 에서 1을 뺍니다. 그리고 다시 처음부터 시작합니다.

   


   
Storing Functions in Variables



다른 함수에 파라미터로서 함수를 pass 할 수 있는 것처럼 우리는 함수를 변수 안에 저장할 수도 있습니다. 이렇게 되면 변수를 그 함수처럼 사용하게 되는 거죠.



local helloFunc = HelloWorld
helloFunc()



위의 코드는

    1. helloFunc 라는 변수를 선언한다.
    2. HelloWorld() 함수를 helloFunc 변수의 값으로 할당한다.
    3.  함수처럼 해당 변수를 call 한다.

이런 과정을 거쳐 아래와 같은 글자를 프린트 할 겁니다.

Hello!



Using Functions as First Class Values



이제 우리는 아래 방법들을 알았습니다.

   -  코로나 API 에 함수 추가하기
   -  변수에 함수 저장하기
   -  parameter처럼 함수 pass 하기

코로나의 기능을 더욱 확장하기 위해 이 세가지의 Lua 기능들을 사용할 겁니다.

반응형

Comment