다음을 통해 공유


Visual Basic의 수명

선언된 요소의 수명은 해당 요소를 사용할 수 있는 기간입니다. 변수는 수명이 있는 유일한 요소입니다. 이를 위해 컴파일러는 프로시저 매개 변수를 처리하고 함수는 변수의 특수한 사례로 반환합니다. 변수의 수명은 값을 보유할 수 있는 기간을 나타냅니다. 해당 값은 수명에 따라 변경 될 수 있지만 항상 일부 값을 보유합니다.

다른 수명

멤버 변수(프로시저 외부, 모듈 수준에서 선언됨)는 일반적으로 선언된 요소와 동일한 수명을 가집니다. 클래스 또는 구조체에 선언된 공유되지 않은 변수는 선언된 클래스 또는 구조체의 각 인스턴스에 대해 별도의 복사본으로 존재합니다. 이러한 각 변수의 수명은 인스턴스와 동일합니다. 그러나 Shared 변수에는 애플리케이션이 실행되는 전체 시간 동안 지속되는 단일 수명만 있습니다.

지역 변수(프로시저 내에서 선언됨)는 선언된 프로시저가 실행되는 동안에만 존재합니다. 이는 해당 프로시저의 매개 변수 및 모든 함수 반환에도 적용됩니다. 그러나 해당 프로시저가 다른 프로시저를 호출하는 경우 호출된 프로시저가 실행되는 동안 지역 변수는 해당 값을 유지합니다.

수명 시작

지역 변수의 수명은 컨트롤이 선언된 프로시저에 들어갈 때 시작됩니다. 프로시저 실행이 시작되는 즉시 모든 지역 변수가 해당 데이터 형식의 기본값으로 초기화됩니다. 프로시저에서 초기 값을 지정하는 Dim 문이 발견되면 코드에서 이미 다른 값을 할당한 경우에도 해당 변수를 해당 값으로 설정합니다.

구조체 변수의 각 멤버는 별도의 변수인 것처럼 초기화됩니다. 마찬가지로 배열 변수의 각 요소는 개별적으로 초기화됩니다.

프로시저 내의 블록 내에서 선언된 변수(예: For 루프)는 프로시저 항목에서 초기화됩니다. 이러한 초기화는 코드가 블록을 실행하는지 여부에 관계없이 적용됩니다.

수명 종료

프로시저가 종료되면 해당 지역 변수의 값이 유지되지 않고 Visual Basic에서 해당 변수의 메모리를 회수합니다. 다음에 프로시저를 호출할 때 모든 지역 변수가 새로 만들어지고 다시 초기화됩니다.

클래스 또는 구조체의 인스턴스가 종료되면 공유되지 않는 변수의 메모리와 해당 값이 손실됩니다. 클래스 또는 구조체의 각 새 인스턴스는 공유되지 않는 변수를 만들고 다시 초기화합니다. 그러나 Shared 변수는 애플리케이션 실행이 중지될 때까지 유지됩니다.

수명 연장

Static 키워드를 사용하여 지역 변수를 선언하는 경우 해당 수명은 프로시저의 실행 시간보다 깁니다. 다음 표에서는 프로시저 선언에서 Static 변수의 존재 기간을 결정하는 방법을 보여 줍니다.

프로시저 위치 및 공유 정적 변수 수명 시작 정적 변수 수명 종료
모듈에서(기본적으로 공유) 프로시저가 처음 호출되는 경우 애플리케이션 실행이 중지되는 경우
클래스에서 Shared인 경우(프로시저는 인스턴스 멤버가 아님) 프로시저가 특정 인스턴스 또는 클래스 또는 구조체 이름 자체에서 처음으로 호출되는 경우 애플리케이션 실행이 중지되는 경우
클래스의 인스턴스에서 Shared이 아닌 경우(프로시저가 인스턴스 멤버임) 특정 인스턴스에서 프로시저가 처음 호출되는 경우 GC(가비지 수집)에 대해 인스턴스가 해제된 경우

같은 이름의 정적 변수

둘 이상의 프로시저에서 이름이 같은 정적 변수를 선언할 수 있습니다. 이렇게 하면 Visual Basic 컴파일러는 이러한 각 변수를 별도의 요소로 간주합니다. 이러한 변수 중 하나를 초기화해도 다른 변수의 값에는 영향을 주지 않습니다. 오버로드 집합을 사용하여 프로시저를 정의하고 각 오버로드에서 이름이 같은 정적 변수를 선언하는 경우에도 마찬가지입니다.

정적 변수에 대한 요소 포함

클래스 내에서 정적 지역 변수를 선언할 수 있습니다. 즉, 해당 클래스의 프로시저 내에서 선언할 수 있습니다. 그러나 구조체 내에서 정적 지역 변수를 구조체 멤버로 선언하거나 해당 구조체 내 프로시저의 지역 변수로 선언할 수는 없습니다.

예제

설명

다음 예제에서는 정적 키워드를 사용하여 변수를 선언합니다. (Dim 문에서 Static와 같은 한정자를 사용하는 경우에는 Dim 키워드가 필요하지 않습니다.)

코드

Function runningTotal(ByVal num As Integer) As Integer
    Static applesSold As Integer
    applesSold = applesSold + num
    Return applesSold
End Function

주석

앞의 예제에서는 프로시저 runningTotal가 호출 코드로 반환된 후에도 변수 applesSold가 계속 존재합니다. 다음에 runningTotal이 호출되면 applesSold는 이전에 계산된 값을 유지합니다.

Static를 사용하지 않고 applesSold가 선언된 경우 이전에 누적된 값은 runningTotal 호출에서 유지되지 않습니다. 다음에 runningTotal이 호출되면 applesSold가 다시 만들어지고 0으로 초기화되었으며, runningTotal은 호출된 값과 동일한 값을 반환했을 것입니다.

코드 컴파일

정적 지역 변수의 값을 선언의 일부로 초기화할 수 있습니다. 배열을 Static로 선언하는 경우 해당 순위(차원 수), 각 차원의 길이, 개별 요소의 값을 초기화할 수 있습니다.

보안

앞의 예제에서는 모듈 수준에서 applesSold를 선언하여 동일한 수명을 생성할 수 있습니다. 그러나 이러한 방식으로 변수의 범위를 변경한 경우 프로시저는 더 이상 변수에 대한 단독 액세스 권한을 갖지 않습니다. 다른 프로시저가 applesSold에 액세스하고 해당 값을 변경할 수 있으므로 실행 중인 합계는 신뢰할 수 없으며 코드를 유지 관리하기가 더 어려울 수 있습니다.

참고 항목