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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

수요일의 FAQ - 070412 -

2012. 7. 8. 00:44 | Posted by 솔웅


반응형
Posted on . Written by


오늘은 수요일이자 독립기념일입니다. 독립기념일의 FAQ를 시작하겠습니다. 아래에 자주 나오는 질문 5가지와 그 답변이 있습니다.


1. ‘require(“file”)’ 과 ‘require “file”의 다른 점이 뭔가요?


여러분은 require API 에서 아래 두가지 방법을 보셨을 겁니다.

-- Example #1
local json = require( "json" )

-- Example #2
local json = require "json"


일반적으로 함수는 pass 하게 될 인자(argument)들을 요구합니다. 하지만 루아에서는 약간의

예외가 있습니다. 만약에 함수가 단 한개만의 인자만 가지고 있다면 (그것이 스트링이던

테이블이던) 괄호는 옵션 사항입니다. 이 규칙은 print 구문이나 한개의 인자(스트링이든

테이블이든) 를 받는 다른 함수에도 마찬가지로 적용됩니다.



2. 우리는 코로나의 변수와 관련해서 많은 complain을 받습니다.

분명히 변수에 값을 대입했는데 인덱스나 함수에서는 nil이라고 하니까

분명히 버그가 있을 거라는 겁니다.

 

코로나에서 사용하는 루아라는 언어로 프로그래밍을 하다보면 가장 흔하게 부딪히는 문제점이

nil 에러입니다.

다른 언어와는 다르게 루아는 변수를 사용하기 전에 선언해야 하지 않습니다.

변수에 값을 대입하지 않으면 루아는 그 값을 그냥 nil로 처리합니다.

nil 에러가 일어나는 일반적인 원인은 변수나 함수가 out of scope 일 경우가 많습니다.

여러분이 변수나 함수를 local로 정의해서 메모리를 점유하게 만들면 이런 경우가 종종

발생할 수 있습니다.

루아에서 로컬 변수의 scope은 그것이 선언된 곳 (예 main.lua)에 한정돼 있습니다.

다른 lua 파일에서 그 로컬 변수에 접근하려고 할 경우 이 nil 에러가 발생합니다.

또한 로컬 변수는 그것이 정의(선언)된 이후에 참조가 가능합니다. 변수가 선언되기 이전에

이 변수를 참조하려고 한다면 여기서도 nil 에러가 일어납니다.

 

저는 대개 로컬 변수를 루아 파일의 맨 첫 부분에 정의를 합니다. 그러면 나중에 그 변수에

접근이 가능하니까요.


-- This code block won't work because the addNumbers
-- function is called before it's been defined

local addNumbers -- forward reference

print( addNumbers( 5, 6 ) )

function addNumbers( num1, num2 )
return num1 + num2
end


-- This code block works because the addNumbers
-- function is called after it's been defined

local addNumbers -- forward reference

timer.performWithDelay( 1, function()print( addNumbers( 5, 6 ) ) end )

function addNumbers( num1, num2 )
return num1 + num2
end

 

timer.performWithDelayaddNumbers 함수가 정의 된 후에 execution code에서 addNumbers

함수를 call 합니다. 여기서 그 함수로 포인터가 access 하기 위해local addNumbers 구문이

필요합니다.


한번 변수 선언할 때 local을 없애고 어떻게 되는지 보세요. 그것이 정의 되기 전에 함수를

call 하게 되면 마찬가지로 에러가 날 겁니다. 그 변수나 함수가 nil (out of scope)인지

아닌지 체크해 보기 위해서 print 구문을 사용하셔도 됩니다. 에러가 났을 경우 정확히

어디에서 에러가 났는지 찾아보는데 도움이 될 겁니다. 변수나 함수들을 print out 할 때

콤마 , 를 사용하세요. 콤마와 함께 프린트 하게 되면 nil 밸류와 함께 함수와 테이블

addresses를 보여 줄 겁니다.



3. Facebook 인터페이스에 대한 문서는 어디에서 볼 수 있죠?


코로나의 페이스북 인터페이스는 Facebook Graph API를 사용합니다.

여기에서 코로나 페이스북 문서에 대한 인터페이스 정보를 찾아보실 수 있습니다.

Facebook API페이지의 페이스북 파라미터 정보도 찾아 보실 수 있습니다.
그리고 우리의 Jonathan Beebe의 아주 훌륭한 페이스북 튜토리얼도 참조하세요.
Implementing Facebook Single Sign-on and Uploading Photos to Facebook.

코로나 SDK에 포함된 페이스북 샘플 앱도 잊지 마시구요.



4. baseDirectory에 subdirectory 이름을 add 해서 이미지를 로드하려고

합니다.그런데 제대로 로드되지가 않네요. 뭐가 잘못된거죠?


baseDirectory
인자(argument)는 Corona API에서 아주 많이 사용되는데요.

이는 asset들에 대한 base directory를 가리키고 있습니다.

이 base directory는 사전 정의된 아래 3개 constants (상수) 중에 하나이어야 합니다.

system.ResourceDirectory,system.TemporaryDirectory, system.DocumentsDirectory

아무것도 특정하지 않으면system.ResourceDirectory 가 디폴트로 사용됩니다.


그 subdirectory에 있는 asset에 접근 하시려면 이 subdirectory는 파일 이름에 추가

하셔야 합니다. baseDirectory에 추가하시면 안 됩니다.


아래 예제가 있습니다.

local IMG_DIR = "images/"
-- Loads image from Resource directory
local image = display.newImage( "apple.png", 50, 50 )

-- Loads image from Resource directory
local image = display.newImage( "apple.png", system.ResourceDirectory, 50, 50 )

-- Loads image from images subfolder in Resource directory
local image = display.newImage( IMG_DIR .. "apple.png", 50, 50, true )

-- Loads image from images subfolder in Documents directory
local image = display.newImage( IMG_DIR .. "apple.png",
system
.DocumentsDirectory, 50, 50 )

subfolder 이름을 구분하는 구분자로는 . 가 아닌 / 를 사용한다는 것을 기억하세요.

. 는 require 에서 사용됩니다. 그리고 그 나머지에서는 / 를 사용합니다.



5. 이건 질문은 아닌데요. Lua 에만 있는 특별한 기능입니다.
함수에서 return 하는 return 값이 복수개가 될 수 있는 기능입니다.


루아는 함수에서 multiple value들을 return 할 수 있는 몇 안되는 언어중 하나입니다.

에러 메세지같은 multiple value들을 return 해야 할 때 편리하게 사용됩니다.

이 기능을 이용해 여러 진보된 기능의 루아 함수들을 많이 보실 수 있을 겁니다.

-- The string.find API returns the start and end of the found string
print( string.find( "Hello Corona user", "Corona" ) ) -- prints 7 and 12

여러분이 만드는 함수에도 이 기능을 사용하실 수 있습니다.

myRect = display.newRect( 0, 0, 25, 50 )

local function getWidthHeight( object )
return object.width, object.height
end

print( getWidthHeight( myRect ) ) -- print 25 and 50

여기까지가 오늘의 질문들입니다.

조금이라도 새로운 것을 배울 수 있는 유익한 시간이었길 바랍니다.



반응형