다른 언어에서 함수 내에 정의된 변수는 local 변수고 함수 밖에서 정의된 변수는 global 변수입니다. mel에서 함수의 역할을 하는 것이 procedure입니다. 다른 점은
마야에서 script editor나 ui에서 명령어나 procedure를 호출하면, 먼저 마야 메모리를 검색한 후, 없다면, 사용자 정의 script 폴더 안에 입력된 이름의 script파일을 검색한 후, 그 script file안의 해당 procedure를 실행합니다. 그렇다면, mel에서 local 변수와 global 변수를 정의할 때, 구분하는 방법은 다른 언어와 달리, procedure안에서 if, while, for...등등의 구문 밖에서 정의된 변수는 global 변수이고, if, while, for....등등의 구문 안에서 정의된 변수는 local 변수입니까?/? 그리고 local 변수나 global 변수 둘 다는 procedure 안에서 정의되는 것입니까???
마야 메모리 측면에서 local procedure와 global procedure의 차이점이 궁금하네요. local procedure가 실행될 때, 그 procedure에서 정의된 일련의 명령어나 리턴값이 출력된 후, 그 procedure의 실행이 끝나면, 마야 메모리에서 사라지지만, global procedure의 경우, global procedure가 실행될 때, 그 procedure에서 정의된 일련의 명령어나 리턴값이 출력된 후, 그 procedure가 마야 메모리에 load되어 마야가 종료될 때까지 마야 메모리에 존재하는 것이 맞나요????
global 변수 설명을 빼뜨렸네요. global 변수는 global이라는 키워드로 정의가 되구요, 그러면 그 값이 메모리에 남아서 교차 참조가 됩니다.
예를 들어 보면요,
global int $test = 1; // global 변수 $test를 선언하고 값 1을 대입
proc myProc() {
global int $test; // global 변수 $test를 myProc안에서 사용한다고 선언
$test += 1;
};
myProc(); // myProc 프로시져 실행
print $test; // 하게 되면 값이 2가 찍혀요.
답변 감사합니다. 이제 기본적인 mel에 대한 지식을 모두 습득한 것 같네요. 반복해서 연습하고, 복습하는 과정이 이제 남아 있네요.
명확하게 하기 위해 제차 질문드립니다. script editor를 통해서 일련의 변수를 정의하고 다음에 procedure를 정의한 후, 그 procedure를 호출하면, script editor에서 입력한 순서대로 실행이 됩니다. 그러나, script 파일로 이와 같은 내용을 입력한 후, 사용자 정의 폴더에 mel 파일로 저장한 후, script editor를 통해서 해당 procedure를 호출하면, procedure만이 실행되지만, 그 script 파일에서 procedure 정의 전에 입력된 변수 선언문과 같은 구문은 실행이 되지 않는 것이 아닌가요?
그렇기 때문에, procedure 문안에 global이라는 keyword를 변수명 앞에 붙여서, procedure안에 있는 그 해당 변수가 procedure 선언 전의 global 변수라는 선언문을 실행하도록 하는 것이 아닌가요?????
프로시져 전에 입력된 변수 선언문은 실행이 되지 않지만, local procedure는 참조가 가능합니다. 그 파일안에서는요.
마야는 어떤 script 파일을 로드하면 그 스크립트 파일 전체를 하나의 scope로 저장하는 것 같습니다. (프로시져에 대해서요)
하지만, global이 아닌 변수에 대해서는 하나의 프로시져 만이 scope이 되는 것 같네요.
예를 들어 아래와 같은 내용을 가진 scopeTest.mel을 사용자 script path에 저장하면요,
global int $this_is_a_global_var = 1;
int $this_is_a_local_to_file_var = 2;
proc local_proc() {
print "Hi I'm local\n";
}
global proc scopeTest() {
print "I'm global\n";
local_proc();
}
script editor에서 scopeTest라고 입력하면,
I'm global
Hi I'm local
라고 출력이 됩니다.
하지만, 저 파일의 내용을
global int $this_is_a_global_var = 1;
int $this_is_a_local_to_file_var = 2;
proc local_proc() {
print "Hi I'm local\n";
}
global proc scopeTest() {
print "I'm global\n";
print $this_is_a_local_to_file_var;
local_proc();
}
답변에 감사합니다. 이 예문으로는 잘 이해가 가지 않네요. 즉,
마야는 어떤 script 파일을 로드하면 그 스크립트 파일 전체를 하나의 scope로 저장하는 것 같습니다. (프로시져에 대해서요)
하지만, global이 아닌 변수에 대해서는 하나의 프로시져 만이 scope이 되는 것 같네요.라는 구문이 이해가 가지 않네요. 그러나, global 변수는 script작성에 거의 사용되지 않는 것같아서 그냥 넘어가렵니다.
global 변수가 script작성에서 종종 사용됩니다.
예를 들어, 제가 일련의 스크립트들을 작성하는데, 이 스크립트들이 공통의 값(예를 들어 설정파일이 저장되는 디렉토리라든가)을 참조해야 하는 경우가 있을 때,
이 값을 global 변수로 정의하면 서로 다른 스크립트에서 이 값을 참조할 수 있지요.
위에 질문하신 부분은, script 파일 내의 local procedure는 같은 파일 내에서는 언제든지 참조가 된다 즉 같은 scope에 있다는 얘기구요,
하지만, 같은 script 파일 안에서 선언된 global이 아닌 변수들은 참조가 되지 않는다는 이야기였습니다.

첫번때 단락에서 말씀하신, 메모리 검색/ 사용자 정의 script 폴더 검색해서 실행되는 것은 global procedure 뿐이구요. 이 경우, 파일 이름과 global procedure이름이 동일할 경우에만 검색이 됩니다.
local 변수는 특정 procedure내에서 선언된 변수라고 보시면 되구요,
local procedure는 특정 script 파일 안에서만 참조되는 procedure입니다.
때문에, 같은 file안에 있는 local procedure들은 같은 file 내에서 호출이 가능하지만, 다른 file에서는 호출할 수 없구요,
global procedure는 호출이 가능합니다.