티스토리 뷰

엑셀 VBA(Visual Basic for Applications)에서 변수를 선언할 때, 그 변수의 생명 주기는 코드 실행 중 해당 변수가 얼마 동안 값을 유지하는지를 결정합니다. 일반적으로 함수나 서브루틴(Sub)이 끝나면 로컬 변수는 초기화되지만, Static(정적) 변수를 사용하면 함수가 여러 번 호출되더라도 그 값이 유지됩니다.

 

이번 글에서는 엑셀 VBA에서 변수의 생명 주기를 어떻게 지정하는지, 그리고 Static 키워드를 활용하여 정적 변수를 사용하는 방법에 대해 알아보겠습니다.

변수의 생명 주기와 스코프

VBA에서 변수를 선언할 때, 그 변수가 어디서 사용될 수 있는지(스코프)와 얼마 동안 값을 유지할 수 있는지(생명 주기)를 이해하는 것이 중요합니다. 기본적으로 VBA에서 변수는 다음과 같은 두 가지 요소로 구분됩니다:

  • 스코프(Scope): 변수가 어디서 접근 가능한지를 나타냅니다. 예를 들어, 함수 내에서 선언된 로컬 변수는 해당 함수 내에서만 접근 가능합니다.
  • 생명 주기(Lifetime): 변수가 얼마 동안 메모리에 남아 있는지를 나타냅니다. 일반적으로 함수가 끝나면 로컬 변수는 메모리에서 사라집니다.

일반적인 로컬 변수

일반적으로 함수나 서브루틴 내에서 선언된 로컬 변수는 해당 함수가 실행될 때만 존재합니다. 즉, 함수가 종료되면 이 변수는 메모리에서 제거되고, 다시 함수가 호출될 때마다 새롭게 초기화됩니다. 예를 들어:

Sub MyProcedure()
    Dim myVar As Integer
    myVar = myVar + 1
    Debug.Print myVar
End Sub

위 코드에서 myVarDim으로 선언된 로컬 변수입니다. 이 서브루틴이 호출될 때마다 myVar는 0으로 초기화되고, 값을 1씩 증가시킵니다. 하지만 함수가 끝나면 다시 초기화되므로 다음 호출 시에도 myVar는 0부터 시작하게 됩니다.

Static(정적) 변수란?

Static(정적) 변수는 함수나 서브루틴이 종료되더라도 그 값을 유지하는 특별한 유형의 로컬 변수입니다. Static 키워드를 사용하여 변수를 선언하면, 해당 프로시저가 여러 번 호출되더라도 이전에 저장된 값이 유지됩니다.

Static 변수 선언 방법

Static 변수를 선언하기 위해서는 Dim 대신 Static 키워드를 사용합니다. 예를 들어:

Sub MyProcedure()
    Static myVar As Integer
    myVar = myVar + 1
    Debug.Print myVar
End Sub

위 코드에서 myVar는 정적 변수로 선언되었습니다. 이제 이 서브루틴이 여러 번 호출되더라도 myVar는 이전에 저장된 값을 계속 유지하며, 매번 호출될 때마다 값이 1씩 증가하게 됩니다.

Static 변수의 특징

  • 값 유지: Static으로 선언된 변수는 함수가 종료되어도 값을 잃지 않고, 다음 호출 시에도 동일한 값을 유지합니다.
  • 로컬 스코프: Static 변수는 여전히 해당 함수 내에서만 접근 가능합니다. 즉, 다른 함수나 모듈에서는 이 변수를 사용할 수 없습니다.
  • 프로그램 종료 시 초기화: 프로그램이 종료되거나 VBA 편집기에서 'Reset' 버튼을 눌러 코드를 리셋하면 Static 변수도 초기화됩니다.

Static 변수를 사용하는 이유

정적 변수를 사용하는 대표적인 이유 중 하나는 상태 정보 유지입니다. 예를 들어, 특정 함수가 몇 번 호출되었는지 카운트하는 경우에 유용합니다. 아래 예시는 함수를 몇 번 호출했는지 카운트하는 코드입니다:

Function CountCalls() As Integer
    Static callCount As Integer
    callCount = callCount + 1
    CountCalls = callCount
End Function

위 코드에서 callCount라는 정적 변수가 선언되어 있으며, 이 값은 함수를 호출할 때마다 1씩 증가하고 그 값이 유지됩니다.

Static vs Module-Level Variables

정적 변수를 사용할지 모듈 수준의 변수를 사용할지는 상황에 따라 다릅니다. 두 가지 방식 모두 값을 유지할 수 있지만 차이가 있습니다:

Static 변수 Module-Level 변수
특정 프로시저 내에서만 유효 모듈 전체에서 접근 가능
다른 프로시저에서는 접근 불가 다른 프로시저에서도 접근 가능
메모리 사용량 적음 메모리 자원 더 많이 사용

Module-Level Variables 예시

모듈 수준의 변수를 사용하려면 Dim 또는 Private 키워드를 사용하여 모듈 상단에 변수를 선언합니다:

Dim moduleVar As Integer

Sub Procedure1()
    moduleVar = moduleVar + 1
    Debug.Print moduleVar
End Sub

Sub Procedure2()
    moduleVar = moduleVar + 10
    Debug.Print moduleVar
End Sub

위 코드에서는 moduleVar라는 모듈 수준의 변수가 선언되어 있으며, 두 개의 서브루틴(Procedure1, Procedure2) 모두 이 변수를 공유합니다.

Static 변수가 유용한 상황

정적 변수가 특히 유용한 경우는 다음과 같습니다:

  • 함수 호출 횟수 카운트: 특정 함수를 몇 번 호출했는지 추적할 때.
  • 상태 정보 저장: 함수가 종료되어도 특정 상태 정보를 저장하고 싶을 때.
  • 성능 최적화: 반복적으로 계산해야 하는 값을 캐싱하여 성능을 향상시키고자 할 때.

예를 들어, 복잡한 계산 결과를 캐싱하여 이후 동일한 계산을 피하고 성능을 최적화할 수 있습니다.

Function ExpensiveCalculation() As Double
    Static cachedResult As Double

    If cachedResult = 0 Then ' 처음 계산될 때만 실행됨
        cachedResult = '복잡한 계산 수행'
    End If

    ExpensiveCalculation = cachedResult
End Function

위 코드에서는 처음 함수를 실행할 때만 복잡한 계산을 수행하고, 이후에는 캐싱된 결과를 반환하여 성능을 최적화합니다.

 

결론

엑셀 VBA에서 변수의 생명 주기스코프를 이해하는 것은 매우 중요합니다. 특히 정적 변수를 활용하면 반복적으로 호출되는 함수에서도 상태 정보를 유지할 수 있어 다양한 상황에서 유용하게 사용할 수 있습니다. 그러나 정적 변수를 남발하면 코드 가독성이 떨어질 수 있으므로 적절히 사용하는 것이 좋습니다.