반응형
오늘은 글로벌, 로컬 함수 사용법에 대해 자세히 살펴 보겠습니다.
함수의 기본
local function main()
print("Hello from CoronaSDK")
end
main()
아주 평범하고 간단한 함수 작성 및 함수 불러오기 예제입니다.
main()함수는 로컬로 선언 됐고 터미널에 Hello from CoronaSDK 를 출력합니다.
이 함수는 맨 아랫 줄 에서 call 했습니다. (main() )
local main
local function init()
main()
end
function main()
print("Hello from CoronaSDK")
end
init()
이번엔 main 을 로컬로 미리 선언해 놓고 함수 선언 시 local 을 따로 표시하지 않았습니다.
프로그램을 실행하면 로컬 init() 함수를 부를 것이고 이 init() 함수는 main() 함수를 부를겁니다. 문제없이 작동됩니다.
그런데 여기서
local main
local function init()
main()
end
local function main()
print("Hello from CoronaSDK")
end
init()
이렇게 main() 함수 작성할 때도 local로 또 선언을 하면 에러가 나게 됩니다.
바로 init() 함수 안에서 main()함수를 불러올 때 에러가 납니다.
왜냐하면 main()을 불러올 때는 main() 함수가 없었기 때문에 main 이 nil 이기 때문에 불러오지 못하겠다고 에러 메세지를 뿌리는 겁니다.
local main
local function main()
print("Hello from CoronaSDK")
end
local function init()
main()
end
init()
위 소스는 어떨까요. init()안에서 main()을 불러올 때 이미 그 위에서 로컬 main() 함수가 구현 돼 있죠? 이 경우는 제대로 실행이 될 겁니다.
Encapsulated Function (함수 캡슐화)
local function main()
print ("Hello from CoronaSDK")
function insideMain()
print("This is a function inside of main, not available to be called from any other")
end
insideMain()
end
main()
자 이렇게 함수 안에 함수가 있는 경우 제대로 실행 됩니다.
local function spawnObject()
local resultingObject = display.newRect(10,10,100,100)
local function onTouch(event)
if "ended" == event.phase then
print("touched rectangle")
end
end
resultingObject:addEventListener("touch",onTouch)
return resultingObject
end
local xTemp = spawnObject()
위 코드를 실행하면 어떻게 될까요?
우선 맨 밑에 로클 xTemp 변수에 spawnObject() 가 담기변서 spawnObject() 가 실행 됩니다.
spawnObject()에서는 처음에 resultingObject라는 사각형을 그리게 됩니다.
그리고 event를 받는 onTouch라는 함수를 만들구요.
여기서는 touch 이벤트가 끝날 때 터미널에 문자열을 출력합니다.
그 다음엔 아까 그린 사각형에 리스너를 답니다. touch 가 일어났을 경우 onTouch 함수롤 불러오도록 설정합니다.
그 다음에 이 사각형을 리턴합니다.
이제 화면에 있는 사각형을 클릭하면 터미널에 문자열이 찍히게 됩니다.
Member functions (멤버 함수들)
멤버함수들은 객체가 되는 방법이 일반 함수들과 조금 다릅니다. 바로 전 코드에다가 색을 바꾸는 함수도 한번 추가해 봅시다.
일단 사각형 색을 바꾸는 함수 부분을 아래와 같이 추가합니다.
local function spawnObject()
local resultingObject = display.newRect(10,10,100,100)
function changeColor(theColor)
resultingObject:setFillColor(theColor[1],theColor[2],theColor[3])
end
local function onTouch(event)
if "ended" == event.phase then
print("touched rectangle")
end
end
resultingObject:addEventListener("touch",onTouch)
return resultingObject
end
local xTemp = spawnObject()
자.. 이제 저 함수에 theColor라는 파라미터를 넣어서 불러오는 것을 해야 하는데요.
이 함수는 local로 선언돼 있지 않지만 spawnObject() 함수 밖에서는 불러올 수 없습니다.
spawnObject() 함수 안에 이 함수가 있으니까요.
그럼 밖에서 불러올 수 있도록 살짝 바꿔 보겠습니다.
local function spawnObject()
local resultingObject = display.newRect(10,10,100,100)
function resultingObject.changeColor(theColor)
resultingObject:setFillColor(theColor[1],theColor[2],theColor[3])
end
local function onTouch(event)
if "ended" == event.phase then
print("touched rectangle")
end
end
resultingObject:addEventListener("touch",onTouch)
return resultingObject
end
local xTemp = spawnObject()
xTemp.changeColor({255,0,255})
changeColor(theColor) 함수를 spawnObject()의 멤버인 resultingObject 의 멤버 함수로 선언했습니다.
이렇게 하면 spawnObject() 함수 밖에서 불러올 수 있습니다.
spawnObject() 를 xTemp 변수에 담았으니까. xTemp.changeColor({255,0,255}) 하게 되면 spawnObject()함수 안에 있는 changeColor를 불러오게 됩니다. 이 함수는 멤버인 사각형의 함수이니까요.
단순히 이 기능만 실행되게 하려면 여러 방법이 있습니다.
아래와 같이 해도 되구요.
local function spawnObject()
local resultingObject = display.newRect(10,10,100,100)
function changeColor(theColor)
resultingObject:setFillColor(theColor[1],theColor[2],theColor[3])
end
local function onTouch(event)
if "ended" == event.phase then
print("touched rectangle")
end
end
resultingObject:addEventListener("touch",onTouch)
changeColor({255,0,255})
return resultingObject
end
local xTemp = spawnObject()
--xTemp.changeColor({255,0,255})
그런데 함수내 함수를 함수 바깥에서 부르기 위해서 멤버 변수를 사용한다는 예제를 배우는게 목적이니까 그걸 염두에 두고 보시면 될 거예요.
이 강좌의 원래 원본은 아래에 있습니다.
http://blog.anscamobile.com/2011/09/tutorial-scopes-for-functions/
코로나 SDK 만든 회사인 Ansca Mobile 에 있는 블로그에 있는 글입니다.
함수의 기본
local function main()
print("Hello from CoronaSDK")
end
main()
아주 평범하고 간단한 함수 작성 및 함수 불러오기 예제입니다.
main()함수는 로컬로 선언 됐고 터미널에 Hello from CoronaSDK 를 출력합니다.
이 함수는 맨 아랫 줄 에서 call 했습니다. (main() )
local main
local function init()
main()
end
function main()
print("Hello from CoronaSDK")
end
init()
이번엔 main 을 로컬로 미리 선언해 놓고 함수 선언 시 local 을 따로 표시하지 않았습니다.
프로그램을 실행하면 로컬 init() 함수를 부를 것이고 이 init() 함수는 main() 함수를 부를겁니다. 문제없이 작동됩니다.
그런데 여기서
local main
local function init()
main()
end
local function main()
print("Hello from CoronaSDK")
end
init()
이렇게 main() 함수 작성할 때도 local로 또 선언을 하면 에러가 나게 됩니다.
바로 init() 함수 안에서 main()함수를 불러올 때 에러가 납니다.
왜냐하면 main()을 불러올 때는 main() 함수가 없었기 때문에 main 이 nil 이기 때문에 불러오지 못하겠다고 에러 메세지를 뿌리는 겁니다.
local main
local function main()
print("Hello from CoronaSDK")
end
local function init()
main()
end
init()
위 소스는 어떨까요. init()안에서 main()을 불러올 때 이미 그 위에서 로컬 main() 함수가 구현 돼 있죠? 이 경우는 제대로 실행이 될 겁니다.
Encapsulated Function (함수 캡슐화)
local function main()print ("Hello from CoronaSDK")
function insideMain()
print("This is a function inside of main, not available to be called from any other")
end
insideMain()
end
main()
자 이렇게 함수 안에 함수가 있는 경우 제대로 실행 됩니다.
local function spawnObject()
local resultingObject = display.newRect(10,10,100,100)
local function onTouch(event)
if "ended" == event.phase then
print("touched rectangle")
end
end
resultingObject:addEventListener("touch",onTouch)
return resultingObject
end
local xTemp = spawnObject()
위 코드를 실행하면 어떻게 될까요?
우선 맨 밑에 로클 xTemp 변수에 spawnObject() 가 담기변서 spawnObject() 가 실행 됩니다.
spawnObject()에서는 처음에 resultingObject라는 사각형을 그리게 됩니다.
그리고 event를 받는 onTouch라는 함수를 만들구요.
여기서는 touch 이벤트가 끝날 때 터미널에 문자열을 출력합니다.
그 다음엔 아까 그린 사각형에 리스너를 답니다. touch 가 일어났을 경우 onTouch 함수롤 불러오도록 설정합니다.
그 다음에 이 사각형을 리턴합니다.
이제 화면에 있는 사각형을 클릭하면 터미널에 문자열이 찍히게 됩니다.
Member functions (멤버 함수들)
멤버함수들은 객체가 되는 방법이 일반 함수들과 조금 다릅니다. 바로 전 코드에다가 색을 바꾸는 함수도 한번 추가해 봅시다.일단 사각형 색을 바꾸는 함수 부분을 아래와 같이 추가합니다.
local function spawnObject()
local resultingObject = display.newRect(10,10,100,100)
function changeColor(theColor)
resultingObject:setFillColor(theColor[1],theColor[2],theColor[3])
end
local function onTouch(event)
if "ended" == event.phase then
print("touched rectangle")
end
end
resultingObject:addEventListener("touch",onTouch)
return resultingObject
end
local xTemp = spawnObject()
자.. 이제 저 함수에 theColor라는 파라미터를 넣어서 불러오는 것을 해야 하는데요.
이 함수는 local로 선언돼 있지 않지만 spawnObject() 함수 밖에서는 불러올 수 없습니다.
spawnObject() 함수 안에 이 함수가 있으니까요.
그럼 밖에서 불러올 수 있도록 살짝 바꿔 보겠습니다.
local function spawnObject()
local resultingObject = display.newRect(10,10,100,100)
function resultingObject.changeColor(theColor)
resultingObject:setFillColor(theColor[1],theColor[2],theColor[3])
end
local function onTouch(event)
if "ended" == event.phase then
print("touched rectangle")
end
end
resultingObject:addEventListener("touch",onTouch)
return resultingObject
end
local xTemp = spawnObject()
xTemp.changeColor({255,0,255})
changeColor(theColor) 함수를 spawnObject()의 멤버인 resultingObject 의 멤버 함수로 선언했습니다.
이렇게 하면 spawnObject() 함수 밖에서 불러올 수 있습니다.
spawnObject() 를 xTemp 변수에 담았으니까. xTemp.changeColor({255,0,255}) 하게 되면 spawnObject()함수 안에 있는 changeColor를 불러오게 됩니다. 이 함수는 멤버인 사각형의 함수이니까요.
단순히 이 기능만 실행되게 하려면 여러 방법이 있습니다.
아래와 같이 해도 되구요.
local function spawnObject()
local resultingObject = display.newRect(10,10,100,100)
function changeColor(theColor)
resultingObject:setFillColor(theColor[1],theColor[2],theColor[3])
end
local function onTouch(event)
if "ended" == event.phase then
print("touched rectangle")
end
end
resultingObject:addEventListener("touch",onTouch)
changeColor({255,0,255})
return resultingObject
end
local xTemp = spawnObject()
--xTemp.changeColor({255,0,255})
그런데 함수내 함수를 함수 바깥에서 부르기 위해서 멤버 변수를 사용한다는 예제를 배우는게 목적이니까 그걸 염두에 두고 보시면 될 거예요.
이 강좌의 원래 원본은 아래에 있습니다.
http://blog.anscamobile.com/2011/09/tutorial-scopes-for-functions/
코로나 SDK 만든 회사인 Ansca Mobile 에 있는 블로그에 있는 글입니다.
Cross calling
다른 함수 안에 있는 함수 불러오는 방법 두번째 인데요. 이건 약간 복잡합니다.local function spawnObject() local resultingObject = display.newRect(10,10,100,100) function resultingObject.changeColor(theColor) resultingObject:setFillColor(theColor[1],theColor[2],theColor[3]) end local function onTouch(event) if "ended" == event.phase then print("touched rectangle") end end function wrap(event) if self.x < 25 then self.x = 25 end if self.x > 743 then self.x = 743 end end resultingObject:addEventListener("touch",onTouch) return resultingObject end local xTemp = spawnObject() Runtime:addEventListener("enterFrame", xTemp.wrap)
이 코드는 spawnObject() 안에 wrap(event) 함수를 만들고 spawnObject()
바깥에서 이 함수안의 wrap함수에 리스너를 답니다.
그런데 조금 이상하네요. 에러도 나구요. 아래 코드를 보겠습니다.
local function spawnObject() local resultingObject = display.newRect(10,10,100,100) function resultingObject.changeColor(theColor) resultingObject:setFillColor(theColor[1],theColor[2],theColor[3]) end local function onTouch(event) if "ended" == event.phase then print("touched rectangle") end end local function wrap(event)
print("in function wrap")
if resultingObject.x < 25 then resultingObject.x = 25 end if resultingObject.x > 743 then resultingObject.x = 743 end end resultingObject:addEventListener("touch",onTouch) Runtime:addEventListener("enterFrame", wrap) return resultingObject end local xTemp = spawnObject()
이건 제대로 작동합니다.
spawnObject() 이 실행 됐을 때 이와 관련된 모든 함수들이 캡슐화 됐습니다.
이 코드의 목적은 이렇게 캡슐화 시키는 건가 봅니다.
Advanced Function
local hide = print
local print = math.random
local function main()
hide("What do you have to hide?")
hide( print(5) )
end
main()
루아는 위와 같이 함수를 변수에 담아서 편리하게 사용할 수 있습니다.
오늘은 함수와 관련된 좋은 아티클이 있길래 한번 공부해 봤습니다.
제가 100% 다 이해하지는 못한 것 같습니다.
저보다 더 프로그래밍 기초가 튼튼하신 분들은 좀 더 확실해 이해 하셨겠죠?
제가 잘못 이해했거나 부족한부분.... 덧 붙이고 싶으신 부분 있으면 언제든지 코멘트 해 주세요.
감사합니다.
반응형
'Corona SDK > Corona SDK TIPs' 카테고리의 다른 글
Time Bar 만들기 (0) | 2011.10.27 |
---|---|
백 그라운드 이미지 scroll down 시키기 (0) | 2011.10.26 |
코로나에서 Table View (List View) 표현하기 두번째 시간 (15) | 2011.10.14 |
코로나에서 Table View (List View) 표현하기... (0) | 2011.10.14 |
화면에 점수 표시하기 (Display Score) (1) | 2011.10.03 |
Corona SDK 앱에 광고 달기 (2) | 2011.09.23 |
앱스토어에 업로드 하기 (0) | 2011.09.20 |
빌드하기 (아이폰) - 2 (0) | 2011.09.20 |
빌드하기 (아이폰) -1 (0) | 2011.09.20 |
빌드 하기 (안드로이드) (21) | 2011.09.16 |