2016년 1월 15일 금요일

루아(Lua)에서 colon(:) 과 dot(.) 연산자 이해


사용하면서도 항상 헷갈리는게 colon(:) 과 dot(.) 였습니다. 책을 봐도 이해가 안되는 말뿐이고 이걸 언젠가는 완벽 이해 해야겠다고 결심했습니다.

아래 링크를 보면 외국인들도 헷갈리긴 마찬가지 인가 보네요.

https://coronalabs.com/blog/2015/12/01/tutorial-understanding-the-colon-vs-dot-operator/

CORONA with Lua -원강민 지음- 책 78 page에 보면 차이점이 나오긴 합니다.
둘의 차이는 하나입니다. :으로 된 함수는 내부에 self라는 변수가 자동으로 생성되는 것인데요. 해당 객체 자신을 참조합니다.
예제로 배우는 프로그래밍 루아 -한빛미디어- 책 76 page에는 아래와 같이 나옵니다.
즉, ':'정의를 하면 'self'를 생략할 수 있습니다.

이것을 정리해보도록 하겠습니다.
아래와 같은 예제를 사용했을때 결과를 한번 보시죠
local object = {}

function object.dotMethod( parameter1, parameter2 )
    print( self.someNumber )
end

function object:colonMethod( parameter1, parameter2 )
    print( self.someNumber )
end

object.someNumber = 10
object.dotMethod( "Hello", "World" )    -- Dot method called with dot operator
object:colonMethod( "Hello", "World" )  -- Colon method called with colon operator
Running this code, you can see that the result in the console is:
nil
10
C++ 언어와 비교해 보겠습니다.


#include <iostream>
#include <stdio.h>
using namespace std;

class Object
{
public:
 int someNumber;
 Object()
 {
  this->someNumber = 0;
 }
 void Method();
};

void Object::Method()
{
 printf("%d\n",this->someNumber);
}

int main() {
 Object object1;
 object1.Method();
 object1.someNumber = 10;
 object1.Method();
 
 Object *object2 = new Object();
 object2->Method();
 object2->someNumber = 10;
 object2->Method();
 delete object2;
 return 0;
}

결과
Success time: 0 memory: 3460 signal:0
0
10
0
10


정리하자면 
Lua에서의 self는 타언어 (Java,C++)에서 this와 동일하다.
Lua의 method 내에서 self를 사용할 수 있는 조건은 메소드를 ':'을 사용해서 호출할 때이다.

C++ 언어에서 보면 객체내에서는 this사용이 자유롭다고 보면 됩니다. 하지만 lua는 : 로 호출할때만 내부에서 self 를 이용 가능합니다.
Lua에서 ":" , "." 메소드를 어떻게 만들었냐에 따라 다릅니다.
일반적으로 corona sdk의 기본 library함수는 "."을 사용합니다.

타언어와 비교를 했는데도 어렵다면 객체 지향에 대해서 이해가 필요하고요, 잘모르겠다고 판단되면 . 로 호출되는 대부분의 함수들은 corona sdk의 기본 함수들입니다. 그리고 그외에 소스가 있는것들을 자세히 살펴보면 개발자가 : 사용해서 정의가 되어있는지 . 로 사용하여 정의가 되어있는지에 따라서 호출 방법이 달라지게 됩니다.

string 길이를 구하는데 class 정보가 필요하지 않기 때문에 "."로 되어있나 봅니다.

local length = string.len( "Hello World" )





댓글 없음:

댓글 쓰기