Visual Basic의 범위

선언된 요소의 범위는 이름을 한정하거나 Imports 문(.NET 네임스페이스 및 형식)을 통해 사용할 수 있도록 설정하지 않고 참조할 수 있는 모든 코드 집합입니다. 요소는 다음 수준 중 하나에서 범위를 가질 수 있습니다.

수준 설명
블록 범위 선언된 코드 블록 내에서만 사용 가능
프로시저 범위 선언된 프로시저 내의 모든 코드에서 사용 가능
모듈 범위 선언된 모듈, 클래스, 구조체 내의 모든 코드에서 사용 가능
네임스페이스 범위 선언된 네임스페이스의 모든 코드에서 사용 가능

범위 수준이 가장 좁은 범위(블록)에서 가장 넓은 범위(네임스페이스)로 진행됩니다. 여기서 가장 좁은 범위는 한정 없이 요소를 참조할 수 있는 가장 작은 코드 집합을 의미합니다. 자세한 내용은 이 페이지의 “범위 수준”을 참조하세요.

범위 지정 및 변수 정의

선언할 때 요소의 범위를 지정합니다. 범위는 다음 요인에 따라 달라질 수 있습니다.

  • 요소를 선언하는 지역(블록, 프로시저, 모듈, 클래스, 구조체)

  • 요소의 선언을 포함하는 네임스페이스

  • 요소에 대해 선언하는 액세스 수준

이름이 같지만 범위가 다른 변수를 정의할 때는 주의해야 합니다. 이렇게 하면 예기치 않은 결과가 발생할 수 있기 때문입니다. 자세한 내용은 References to Declared Elements을 참조하세요.

범위 수준

프로그래밍 요소는 선언하는 지역 전체에서 사용할 수 있습니다. 동일한 지역의 모든 코드는 해당 이름을 한정하지 않고 요소를 참조할 수 있습니다.

블록 범위

블록은 다음과 같이 선언 문 시작 및 종료 내에 묶인 문 집합입니다.

  • DoLoop

  • For [Each] and Next

  • IfEnd If

  • SelectEnd Select

  • SyncLockEnd SyncLock

  • TryEnd Try

  • WhileEnd While

  • WithEnd With

블록 내에서 변수를 선언하는 경우 해당 블록 내에서만 사용할 수 있습니다. 다음 예제에서 정수 변수 cube의 범위는 IfEnd If 사이의 블록이며 실행이 블록 밖으로 전달되는 경우 더 이상 cube를 참조할 수 없습니다.

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3
End If

참고 항목

변수의 범위가 블록으로 제한되더라도 해당 수명은 여전히 전체 프로시저의 수명입니다. 프로시저 중에 블록을 두 번 이상 입력하면 각 블록 변수는 이전 값을 유지합니다. 이러한 경우 예기치 않은 결과를 방지하려면 블록의 시작 부분에서 블록 변수를 초기화하는 것이 좋습니다.

프로시저 범위

프로시저 내에서 선언된 요소는 해당 프로시저 외부에서 사용할 수 없습니다. 선언이 포함된 프로시저만 사용할 수 있습니다. 이 수준의 변수를 지역 변수라고도 합니다. 정적 키워드를 사용하거나 사용하지 않고 Dim 문으로 선언합니다.

프로시저 및 블록 범위는 밀접하게 관련되어 있습니다. 프로시저 내에서 변수를 선언하지만 해당 프로시저 내의 블록 외부에서 변수를 선언하는 경우 블록이 전체 프로시저인 블록 범위가 있는 것으로 간주할 수 있습니다.

참고 항목

Static 변수인 경우에도 모든 로컬 요소는 표시되는 프로시저에 비공개입니다. 프로시저 내에서 Public 키워드를 사용하여 요소를 선언할 수 없습니다.

모듈 범위

편의를 위해 단일 용어 모듈 수준은 모듈, 클래스, 구조체에 동일하게 적용됩니다. 선언 문을 프로시저 또는 블록 외부에 배치하고 모듈, 클래스, 구조체 내에 배치하여 이 수준에서 요소를 선언할 수 있습니다.

모듈 수준에서 선언을 수행할 때 선택한 액세스 수준에 따라 범위가 결정됩니다. 모듈, 클래스, 구조체를 포함하는 네임스페이스도 범위에 영향을 줍니다.

프라이빗 액세스 수준을 선언하는 요소는 해당 모듈의 모든 프로시저에서 사용할 수 있지만 다른 모듈의 코드에는 사용할 수 없습니다. 모듈 수준의 Dim 문은 기본적으로 액세스 수준 키워드를 사용하지 않는 경우 기본값이 Private로 설정됩니다. 그러나 Dim 문에서 Private 키워드를 사용하여 범위 및 액세스 수준을 더 명확히 할 수 있습니다.

다음 예제에서는 모듈에 정의된 모든 프로시저가 문자열 변수 strMsg를 참조할 수 있습니다. 두 번째 프로시저가 호출되면 대화 상자에 문자열 변수 strMsg의 내용이 표시됩니다.

' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
    strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
    MsgBox(strMsg)
End Sub

네임스페이스 범위

Friend 또는 Public 키워드를 사용하여 모듈 수준에서 요소를 선언하면 요소가 선언된 네임스페이스 전체의 모든 프로시저에서 사용할 수 있게 됩니다. 위의 예제를 다음과 같이 변경하면 해당 선언의 네임스페이스에 있는 코드에서 문자열 변수 strMsg를 참조할 수 있습니다.

' Include this declaration at module level (not inside any procedure).
Public strMsg As String

네임스페이스 범위에는 중첩된 네임스페이스가 포함됩니다. 네임스페이스 내에서 사용할 수 있는 요소는 해당 네임스페이스 내에 중첩된 네임스페이스 내에서도 사용할 수 있습니다.

프로젝트에 Namespace 문이 없으면 프로젝트의 모든 항목이 동일한 네임스페이스에 있습니다. 이 경우 네임스페이스 범위를 프로젝트 범위로 간주할 수 있습니다. 모듈, 클래스, 구조체의 Public 요소는 해당 프로젝트를 참조하는 모든 프로젝트에서도 사용할 수 있습니다.

범위 선택

변수를 선언할 때는 범위를 선택할 때 다음 사항에 유의해야 합니다.

지역 변수의 장점

지역 변수는 다음과 같은 이유로 모든 종류의 임시 계산에 적합합니다.

  • 이름 충돌 방지. 지역 변수 이름은 충돌에 취약하지 않습니다. 예를 들어 intTemp이라는 변수를 포함하는 여러 가지 프로시저를 만들 수 있습니다. 각 intTemp는 프로시저가 지역 변수로 선언되는 한 각 프로시저는 자체 버전의 intTemp만 인식합니다. 한 프로시저는 다른 프로시저의 intTemp 변수에 영향을 주지 않고 로컬 intTemp의 값을 변경할 수 있습니다.

  • 메모리 소비. 지역 변수는 프로시저가 실행되는 동안에만 메모리를 사용합니다. 프로시저가 호출 코드로 돌아오면 메모리가 해제됩니다. 반면, 공유정적 변수는 애플리케이션의 실행이 중지될 때까지 메모리 리소스를 사용하므로 필요한 경우에만 사용합니다. 인스턴스 변수는 인스턴스가 계속 존재하는 동안 메모리를 소비하므로 지역 변수보다 효율성이 떨어지지만 Shared이나 Static 변수보다는 더 효율적일 수 있습니다.

범위 최소화

일반적으로 변수 또는 상수 선언 시 범위를 가능한 한 좁게 만드는 것이 좋은 프로그래밍 관행입니다(블록 범위가 가장 좁은 경우). 이렇게 하면 메모리를 절약하고 코드가 잘못된 변수를 잘못 참조할 가능성을 최소화할 수 있습니다. 마찬가지로 프로시저 호출 간에 값을 유지해야 하는 경우에만 변수를 정적으로 선언해야 합니다.

참고 항목