<엑셀VBA 입문 17강> 변수를 같은 이름으로 사용하면 섞일까? (지역변수와 전역변수)
서로 다른 함수에서 동일한 이름의 변수를 사용할 때 어떻게 될까요?
어떤 분이 질문해주셔서 써봅니다.
프로그래밍에서는 각각의 함수 안에서만 사용하는 변수를 [지역변수] 라고 합니다.
여러 함수가 공통으로 사용하는 변수를 [전역변수] 라고 합니다.
이는 <변수를 어디에 선언하느냐>에 따라 결정되는데요.
Function 블록 (Function ~ End Function) 안쪽에 [Dim 변수명]이 존재한다면 지역변수(함수마다 달리 사용)가 됩니다.
함수 바깥쪽(소스코드 최상단)에 Dim 변수명이 존재한다면 전역변수(여러 함수 공통으로 사용)가 됩니다.
1. 지역변수 예제
지역변수 예제는 다음과 같습니다.
Func1 함수와 Func2 함수를 차례로 호출하는 매크로입니다.
|
Sub Macro1() Call Func1 End Sub ‘——————– Function Func1() ‘함수 안쪽에 변수 선언 aa = aa + 1 aa = aa + 1 End Function ‘——————– Function Func2() ‘함수 안쪽에 변수 선언 aa = aa + 1 aa = aa + 1 End Function |
위 매크로의 실행결과는 1, 2, 1, 2 순으로 메시지가 표시되게 됩니다.
함수마다 Dim aa 로 변수를 새로 설정해줬으므로, 함수 안에서 사용하고, 함수가 종료되면서 해당 변수는 버려지게 됩니다.
일회용이라고 생각하시면 될듯 합니다.
결과적으로 다시 실행해도 1, 2, 1, 2 가 표시됩니다.
2. 전역변수 예제
다음으로 전역변수의 예입니다.
지역변수 예제를 기본으로 하지만, 이번에는 함수 바깥쪽(최상단)에 변수를 선언해보겠습니다.
|
‘함수 바깥쪽(최상단)에 변수 선언. 즉, 전역변수로 선언. Sub Macro1() Call Func1 End Sub ‘——————– Function Func1() aa = aa + 1 aa = aa + 1 End Function ‘——————– Function Func2() aa = aa + 1 aa = aa + 1 End Function |
이번 매크로의 실행결과는 1, 2, 3, 4 순으로 메시지가 표시되게 됩니다.

최상단에 선언된 Dim aa 를 여러 함수가 공유하고 있습니다. 또한 함수가 종료되어도 해당 변수는 버려지지 않고 보존됩니다.
결과적으로 처음 실행하면 1, 2, 3, 4 가 표시되고,
다시 실행하면 5, 6, 7, 8 이 표시되고,
또 다시 실행하면 9, 10, 11, 12 가 표시됩니다.
3. 지역변수와 전역변수의 혼용(같이 사용)
별로 추천하지 않는 방법이지만, 지역변수와 전역변수를 같이 사용할 수 있습니다.
예를 들면, Func1 함수는 전역변수를 사용하고, Func2 함수는 지역변수를 사용할 수 있습니다.
예제코드는 아래와 같습니다.
|
‘함수 바깥쪽(최상단)에 변수 선언. 즉, 전역변수로 선언. Sub Macro1() Call Func1 End Sub ‘——————– Function Func1() aa = aa + 1 aa = aa + 1 End Function ‘——————– Function Func2() ‘Func2 함수만 함수 안쪽에 변수 선언. 즉, 지역변수로 선언. aa = aa + 1 aa = aa + 1 End Function |
이번 매크로의 실행결과는 1, 2, 1, 2 순으로 메시지가 표시되게 됩니다.
다시 실행하면 3, 4, 1, 2 가 표시되고,
또 다시 실행하면 5, 6, 1, 2 가 표시됩니다.
4. VBA 변수 선언시 주의사항
VB/VBA 는 사실 변수를 선언하지 않아도([Dim 변수명] 코드를 쓰지 않아도) 변수를 사용할 수 있습니다.
다른 프로그래밍 언어와의 차이점입니다.
(예를 들어, C, C++, JAVA 에서는 변수 선언 없이 변수를 사용하면 오류가 발생합니다.)
VBA 에서는 변수 선언 없이 변수를 쓰면 그냥 지역변수로 인식됩니다.
하지만 이 방법은 권장하지 않습니다.
처음에 변수를 선언하지 않고 사용했을 때는 자동으로 지역변수로 처리되니 편하고 좋은데,
오랜 시간이 지나 이 사실을 깜빡하고 이미 사용했던 변수명을 전역변수로 선언한다면,
지금까지 지역변수로 동작했던 변수들이 전역변수화 되면서 생각하지 못한 버그가 발생하게 됩니다.
그러므로 지역변수를 꼭 [Dim 변수명]으로 선언 후 사용해주시기 바랍니다.
이어지는 글 <엑셀VBA 입문 18강> indexOf 함수의 확장 https://blog.naver.com/bb_/221650929713