Class member variable을 table로 지정하면 static variable 됩니다.

12 views
Skip to first unread message

idkay0

unread,
Mar 8, 2008, 10:33:30 AM3/8/08
to squirrelusers-kr
이 문제가 버그인지 아니면 원래 의도된 기능인지 관련 내용을 찾기 어렵네요... (영어라서 ^^;;;;)
버그가 있어서 원인을 찾기 위해 잘못 없는 엔진이만 다그치고 있었는데..., 원인이 다람쥐 때문이었습니다. 문제(?)가 되는
부분은 아래와 같습니다.

class test {
function SetVal(num,name) {
mBase.id = num;
mBase.name = name;
mBaseNumber = num;
}

mBase = { id = 0 , name = ""};
mBaseNumber = 0;
}

temp <- [];

temp.resize(2);

temp[0] = test();
temp[0].SetVal(10,"First");

temp[1] = test();
temp[1].SetVal(20,"Second");

print(temp[0].mBase.id + "," + temp[0].mBase.name + "," +
temp[0].mBaseNumber + "\n");
print(temp[1].mBase.id + "," + temp[1].mBase.name + "," +
temp[1].mBaseNumber + "\n");


출력 결과
20,Second,10
20,Second,20

위에서 맴버변수 설정에 사용한 table의 경우는 static 키워드를 사용한 것 같은 효과가 생깁니다. (혹시 이 부분에 대
한 설명이나 내용을 잘 알고 계신 분은 자료 공유 부탁합니다.)

이 문제는 클래스 생성자에 코드 한 줄 추가하는 것으로 해결했습니다.

class test {
constructor()
{
mBase = { id = 0 , name = ""};
}
function SetVal(num,name) {
mBase.id = num;
mBase.name = name;
mBaseNumber = num;
}
mBase = null;
mBaseNumber = 0;
}





yagur

unread,
Mar 13, 2008, 4:25:26 PM3/13/08
to squirrelusers-kr
mBase = { mID = 0, mName = "" };

위와 같이 하시면 클래스 선언될때 하나의 테이블을 class에 집어 넣으므로 static과 비슷한 효과를 냅니다. 하지만 정적
변수가 아니라 선언시 한번 대입한 mBase를 계속 참조하게 되는것이지요.

constructor에서 mBase에서 매번 초기화를 할때마다 mBase에 constructor에서 생성한 테이블을 참조하는
것이 됩니다. 그래서 비정적(non-static) 멤버인것과 같은 효과를 내게 되는것입니다.
만약 mBase를 정적 타입언어처럼 선언하시고 쓰시려면 클래스로 선언하신후 사용하시는게 의미가 더 명확할것 같습니다.

class base {
function SetVal(num, name) {
mID = num;
mName = name;
}

mID = 0;
mName = "";
}

class test {
function SetVal(num,name) {
mBase.SetVal(num, name);
mBaseNumber = num;
}

mBase = base();
mBaseNumber = 0;
}

하지만 이렇게 된다 해도 mBase는 선언시 지정한 base객체를 참조하게 됩니다. 만약 각 인스턴스마다 다른 객체를 멤버로
서 활용하시려면 생성자에서 명시적으로, mBase의 개체를 생성 혹은 지정해주셔야합니다. 그럴경우엔 생성자에서 명시한 개체를 참
조하게 됨으로 비정적 멤버로서의 역활을 수행하게 됩니다.
그렇지 않는다면 선언시 대입한 인스턴스를 참조하게 됩니다. mBase = base(); 라는것의 의미가 정적 타입언어의
base mBase;와 동일하지 않습니다. 처음 선언시 만들어진 테이블을 clone(shallow copy)한다고 보면 될것 같
습니다.
그리고 class 생성자를 정의해주는게 좋습니다. 암묵적인것보단 명시적인것이 낳을것 같습니다.

위의 것은 squirrel이 동적 타입 언어라는 특징이 작용하는 부분인것같습니다. mBase가 정적 타입으로 초기화될 이유가
없는것으로, 언제든 다른 타입으로 교체될수 있기 때문입니다. base로 초기화 했다가, anotherBase로 교체되 사용
(duck-type)되는 점이 있기때문이죠. 명시적인 생성자의 초기화가 있고, 선언시 null을 참조하게 하는것이 바람직 할것
같습니다.

idkay0

unread,
Mar 13, 2008, 9:26:36 PM3/13/08
to squirrelusers-kr
음... 언어적 특징이라... 당연한 결과였군요... 후끈 =_=;;

다람쥐를 쓰면서 다람쥐에 대한 특성을 고민하지 않았다니...

"정신 똑바로 차려!" 라는 소리가 들리면서 뒤통수 맞는 느낌입니다. ^^;;

다람쥐라는 언어의 이해보다 가져다 쓰는 것만 생각했던 것이 이런 문제를 낳은 것 같습니다.

좋은 설명 감사 드립니다. 앞으로도 잘 부탁 드립니다.




Reply all
Reply to author
Forward
0 new messages