본 글은 프로그래밍 초심자부터 중급 개발자, 그리고 Excel VBA를 활용하는 실무자가 전역 변수(Global Variable)와 지역 변수(Local Variable)의 개념‧특성‧활용 전략을 명확히 이해하도록 돕는 것을 목적으로 한다. 실전 사례와 코드 예시를 풍부하게 제시하여, 독자가 자신의 프로젝트에 즉시 적용할 수 있는 지식을 제공한다.
변수 범위와 선언 위치의 의미
변수는 데이터를 일시적으로 보관하는 메모리 공간이다. 그러나 어디서 선언했는가, 언제까지 살아 있는가에 따라 프로그램 동작과 디버깅 난이도가 크게 달라진다. 범위(Scope)는 변수에 접근 가능한 코드 영역을, 수명(Lifetime)은 변수 유지 시간을 의미한다.
전역 변수(Global Variable)란?
- 선언 위치 : 모듈 최상단, 클래스 외부, 또는 프로그램 진입점 밖.
- 접근 범위 : 전체 애플리케이션(또는 모듈)에서 참조 가능하다.
- 수명 : 프로그램이 시작될 때 생성되고 종료 시 해제된다.
- 공유성 : 여러 함수‧프로시저가 동일 데이터를 공유한다.
- 위험 : 의도치 않은 변경, 동시 수정, 네임스페이스 오염을 유발한다.
Public gTotal As Long
과 같이 Public
키워드로 선언하면 전역 변수이다.지역 변수(Local Variable)란?
- 선언 위치 : 함수‧프로시저 내부.
- 접근 범위 : 해당 블록 내부에서만 유효하다.
- 수명 : 블록이 실행을 마치면 메모리에서 사라진다.
- 캡슐화 : 외부 모듈에 노출되지 않아 코드 안정성이 높다.
- 재사용성 : 여러 함수에서 같은 이름을 사용해도 상호 간섭이 없다.
전역 변수 vs. 지역 변수 비교
구분 | 전역 변수 | 지역 변수 | 실무 시 고려 |
---|---|---|---|
접근 범위 | 모든 모듈 | 선언된 블록 | 디버깅 범위 최소화하려면 지역권장 |
메모리 점유 | 프로그램 전체 기간 | 실행 시 잠깐 | 임베디드·매크로 메모리 절감엔 지역 변수 |
초기화 시점 | 애플리케이션 시작 | 블록 진입 | 동적 초기화 필요 시 지역 변수 유리 |
스레드 안전성 | 낮다 | 높다 | 멀티스레드 환경에선 지역 변수 이용 |
테스트 용이성 | Mock 작성 번거로움 | DI 주입 쉬움 | 단위테스트 중요 프로젝트에지역 변수 |
가독성 | 간단하지만 혼란 유발 | 자체 문맥 명확 | 협업 규모 클수록 지역 변수 |
출처 | Microsoft VBA Docs, Python PEP8, Clean Code (R. Martin) |
전역 변수 사용 예시
Excel VBA
'모듈 상단에 선언
Public gDiscountRate As Double
Sub ApplyDiscount()
Dim rng As Range
For Each rng In Range("B2:B101")
rng.Value = rng.Value * (1 - gDiscountRate)
Next rng
End Sub
Sub Init()
gDiscountRate = 0.15
End Sub
위 구조는 Init()에서 한 번 설정한 gDiscountRate
를 모든 매크로가 공유한다. 할인율이 변경되면 전체 로직 영향을 받기 때문에, 명확한 초기화 순서와 변경 관리가 필수이다.
Python
# config.py
MAX_RETRY = 5
# worker.py
import config
def fetch_data():
for i in range(config.MAX_RETRY):
...
파이썬 모듈 레벨 상수도 전역 변수에 해당한다. 상수처럼 불변 데이터를 공유할 때는 안정적이다.
지역 변수 사용 예시
Excel VBA
Sub CalculateTotal()
Dim total As Double
Dim cell As Range
For Each cell In Range("C2:C101")
total = total + cell.Value
Next cell
Range("D2").Value = total
End Sub
total
은 프로시저 내부에서만 사용되고 종료 후 해제된다. 다른 프로시저가 실수로 값을 덮어쓰지 못한다.
Python
def factorial(n: int) -> int:
result = 1 # 지역 변수
for i in range(2, n + 1):
result *= i
return result
메모리 관리와 변수 수명
VBA는 스택에 지역 변수를, 데이터 세그먼트에 전역 변수를 저장한다. 스택은 LIFO 구조로 진입·탈출이 빠르다. 반면 전역 변수가 많아지면 데이터 세그먼트가 커지고, 초기 로딩 속도가 느려질 수 있다.
Python·JavaScript 등 가비지 컬렉션 언어는 참조 카운트와 마크&스윕 알고리즘으로 지역 변수 해제를 자동 처리한다. 그러나 전역 변수는 루트 객체에 연결돼 가비지 대상에서 제외되므로, 메모리 릭 우려가 있다.
실무 사례로 보는 변수 선택 전략
1. Excel 매크로 보고서 자동화
보고서마다 다른 할인율·세율을 적용해야 한다면, 전역 변수 gTaxRate
는 위험하다. 사용자 입력을 InitConfig()
로 읽어 지역 변수로 전달하거나, 클래스로 캡슐화하여 this.TaxRate
처럼 인스턴스 변수를 쓰는 편이 안전하다.
2. 공정 시뮬레이션 VBA Add-in
연속 계산 루프에서 상태 변수를 전역으로 둘 경우, 사용자 정의 함수(UDF) 동시 호출 시 참조 충돌이 발생한다. Static 변수로 선언하여 프로시저 로컬 스코프를 유지하되 수명을 연장하면 중간 절충이 가능하다.
3. 제조 실행 시스템(MES) Python 서비스
FastAPI 기반 REST 서비스에서 settings.py
모듈에 DB URL·API 토큰을 전역 상수로 보관하는 것은 흔한 패턴이다. 그러나 토큰 갱신 로직이 있다면 전역 업데이트 타이밍을 스레드 락으로 보호해야 한다.
모듈화와 테스트 관점
- 단위 테스트 : 함수가 전역 상태에 의존하면 테스트 격리가 어렵다.
- Mock 주입 : 전역 변수 대신 파라미터·의존성 주입(DI) 활용이 좋다.
- CI/CD : 전역 변수 설정 누락은 배포 환경 버그의 주범이다.
스코프 오류 & 디버깅 팁
Option Explicit
로 오타 방지.- VBA Immediate 창에서
?gValue
출력해 상태 확인. - Python
pdb
에서locals()
,globals()
확인. - Linter( pylint, flake8 ) : 미사용 전역‧재정의 감지.
- VSCode : Variable Explorer 확장으로 런타임 스코프 시각화.
변수 범위 선택을 위한 7가지 모범 사례
# | 실천 항목 | 설명 |
---|---|---|
1 | 불변 데이터만 전역 | 상수‧설정값만 전역으로 노출한다. |
2 | 캡슐화 우선 | 클래스 속성 또는 지역 변수로 감춘다. |
3 | 명명 규칙 준수 | g_ , s_ 접두어로 전역임을 명확히 한다. |
4 | 전역 사용 최소화 | 필요성 검토 후 최후수단으로 사용한다. |
5 | Docstring 기록 | 전역 변수 목적‧변경 위험을 주석에 남긴다. |
6 | 단위테스트 구성 | 전역 값을 Stub/Mock으로 대체 가능하게 설계한다. |
7 | 정적 분석 도구 | 전역 접근 패턴을 도구로 점검한다. |
자주 묻는 질문(FAQ)
Q1. Static
변수는 전역인가 지역인가?
프로시저 내부에 선언하지만 수명이 애플리케이션과 동일하다. 즉, 지역 스코프·전역 수명이다.
Q2. 전역 변수를 완전히 없앨 수 있는가?
작은 스크립트라면 가능하다. 대형 시스템은 구성 상수·로그 객체 등 최소 범위로 남기고 나머지는 DI로 캡슐화하는 접근이 권장된다.
Q3. 성능 면에서 어떤 변수가 빠른가?
지역 변수는 스택에 할당되어 접근이 빠르다. 다만 I/O·네트워크 등 외부 연산이 있으면 차이가 크지 않다.
Q4. Excel VBA에서 전역 배열을 쓰면 재계산이 느려지나?
재계산 과정에서 Volatile 함수와 결합됐을 때 연쇄 호출이 늘어나면 퍼포먼스 저하가 있다. Application.Calculation
모드를 수동으로 전환해 속도를 개선할 수 있다.
Q5. 다중 사용자 환경에서 전역 변수를 쓰면 동시성 문제가?
VBA는 단일 스레드이지만 COM Add-in과 상호작용 시 동시 호출이 가능하다. 뮤텍스나 파일 잠금으로 값 동기화가 필요하다.
'#4 VBA > #4.2 코딩문법' 카테고리의 다른 글
Option Explicit와 변수 선언 강제 (1) | 2025.07.30 |
---|---|
변수의 범위(Public, Private) (0) | 2025.07.29 |
변수를 선언하는 Dim 키워드 (0) | 2025.07.28 |
변수(Variable) 개념과 역할 (3) | 2025.07.27 |