달나라 노트

Google Apps Script : Scope, 스코프, 영역, 글로벌 변수, 지역 변수 본문

Google Apps Script

Google Apps Script : Scope, 스코프, 영역, 글로벌 변수, 지역 변수

CosmosProject 2022. 11. 22. 21:15
728x90
반응형

 

 

 

아래와 같이 코드를 작성해 보았습니다.

 

 

보니까 myFunction에는 아무 내용도 없고 함수 밖에 변수가 선언되어있고 log method가 실행되고있네요.

 

함수에 아무 내용이 없는데 위 파일을 실행시키면 어떻게될까요?

 

위처럼 잘 실행됩니다.

 

이렇게 어떤 함수에도 속하지 않은 영역을 글로벌 영역(Global area)이라고 합니다.

 

 

Google Apps Script에서 어떤 프로젝트 내의 .gs 파일에 있는 특정 함수를 지정하여 실행시키면 사실 다음과 같은 순서로 실행됩니다.

 

1. 프로젝트에 속한 모든 .gs 파일에서 글로벌 영역에 있는 모든 코드를 실행

2. 지정한 함수의 내용을 실행.

 

일반적으론 2번 과정만을 봐왔을 것입니다.

근데 사실 1번이라는 과정이 더 있습니다.

 

이제 1번 과정에 대해 좀 더 자세히 살펴보도록 합시다.

 

 

 

따라서 같은 프로젝트 내에 다른 .gs 파일을 만들어두고 이 파일의 글로벌 영역에 width 변수를 선언해둡니다.

 

 

 

그러면 Code.gs의 myFunctions 함수 안에서 collections.gs 파일에 선언된 width 변수를 참조할 수 있는 것입니다.

 

 

위 코드를 실행하면 130이 출력됩니다.

 

 

근데 코드를 약간 바꿔보겠습니다.

 

 

collections.gs는 수정하지 않은 채 Code.gs 파일을 위처럼 수정하였습니다.

Code.gs의 global 영역에 width 변수를 참조하여 출력해주는 부분을 만들었습니다.

(1과 2를 log method로 출력하는 부분을 둔 것은 출력 시점이 어디인지 파악하기 위한 것입니다.)

 

실행 로그는 이렇습니다.

1이 가장 먼저 출력됩니다.

이것은 Code.gs 파일의 글로벌 영역에 있는 Logger.log(1); 가 실행된 것입니다.

 

그러면 그 다음에 있는 Logger.log(width);가 실행되겠죠.

근데 이 결과가 null입니다.

width는 분명히 collections.gs 파일의 글로벌 영역에 선언되어있습니다.

근데 null로 출력됩니다.

 

일단 자세한 이유는 살펴보고 다음 출력 결과를 봅시다.

다음은 2가 출력되었습니다.

 

이것은 Code.gs 파일의 글로벌 영역에 있는 Logger.log(2); 가 실행된 것입니다.

그러면 그 다음에 있는 Logger.log(width);가 실행되겠죠.

근데 이 결과가 null입니다.

width는 분명히 collections.gs 파일의 글로벌 영역에 선언되어있습니다.

근데 null로 출력됩니다.

 

그리고 마지막으로 130이 출력되는데 이것은 Code.gs 파일의 myFunction 함수 안에 있는 Logger.log(width); 가 실행된 것입니다.

 

자 정리해보면

Code.gs에서는 width를 총 3번 참조했습니다.

 

 

그리고 각 참조 위치 별 결과는 위와 같습니다.

 

1. 프로젝트에 속한 모든 .gs 파일에서 글로벌 영역에 있는 모든 코드를 실행

2. 지정한 함수의 내용을 실행.

 

아까 위에서 Google Apps Script에서 코드의 실행 순서라고 했던 내용입니다.

 

여기서 1번을 더 자세하게 서술해보면 다음과 같습니다.

 

1-1. 실행한 함수가 직접적으로 속해있는 .gs 파일의 글로벌 영역에 있는 모든 코드를 실행

1-2. 동일한 프로젝트에 있는 그 외의 .gs 파일의 글로벌 영역에 있는 모든 코드를 실행

2. 지정한 함수의 내용을 실행.

 

1-1과 1-2를 보면 글로벌 영역이 함수보다 먼저 실행되는 것은 맞지만 글로벌 영역끼리도 우선순위가 있습니다.

 

실행된 함수가 속해있는 .gs 파일의 글로벌 영역 코드가 먼저 실행되고

그 후에 동일 프로젝트 내에 있는 .gs 파일의 글로벌 영역 코드가 실행됩니다.

 

 

 

앞서 봤던 예시는 Code.gs의 myFunction 함수를 실행한 결과입니다.

 

따라서 실행 순서는 아래와 같습니다.

 

1-1. Code.gs의 글로벌 영역 코드 실행

1-2. collections.gs 파일의 글로벌 영역 코드 실행

2. Code.gs의 myFunction 함수 실행

 

width는 collections.gs에 정의되어 있으므로 1-2번 과정이 진행된 후 width를 참조할 수 있습니다.

근데 Code.gs의 글로벌 영역은 1-1번에서 실행되므로, Code.gs의 글로벌 영역에서 width참조하면 null이 나오게 됩니다.

 

 

 

 

 

 

 

 

 

위 코드를 봅시다.

위 코드에는 var_1, var_2, var_3의 3개의 변수가 있습니다.

 

근데 각 변수는 선언된 위치가 다릅니다.

 

var_1은 글로벌 영역에서 선언되었고,

var_2는 my_Function 함수 안에서 선언되었고,

var_3는 test_function 함수 안에서 선언되었습니다.

 

변수이건 함수이건 상관없이 어떤 변수/함수를 다른 곳에서 참조하려면 이 변수/함수는 선언된 곳 보다 더 상위 위치에서 참조될 수 없습니다.

 

예를들어 var_2는 myFunction() 함수 안에서 선언되었습니다.

따라서 var_2는 myFunction 내부에서는 참조할 수 있지만 myFunction함수의 밖인 글로벌 영역에서 참조한다면 에러가 발생합니다.

test_function 함수는 myFunction 내부에 있으므로 test_function 함수 또한 myFunction 내부로 판단되어 test_function 함수 안에서 var_2 변수를 참조할 수 있습니다.

 

var_3는 test_function() 함수 안에서 선언되었습니다.

따라서 var_3는 test_function 함수 안에서만 참조할 수 있습니다.

var_3 변수는 test_function 밖인 글로벌 영역이나 myFunction 함수의 영역에서 참조할 수 없습니다.

 

 

이렇게 var_1처럼 글로별 영역에 선언된 변수나 함수를 글로벌 변수 또는 글로벌 함수라고 합니다.

var_2, var_3처럼 특정 함수 내부에서 선언된 변수나 함수는 로컬 변수(지역 변수) 또는 로컬 함수(지역 함수)라고 합니다.

 

 

 

 

 

 

728x90
반응형
Comments