방법: 이름이 같은 변수 숨기기(Visual Basic)
변수를 섀도하여 숨길 수 있습니다. 즉, 동일한 이름의 변수로 다시 정의하면 됩니다. 다음 두 가지 방법으로 숨기려는 변수를 숨길 수 있습니다.
범위를 통한 섀도잉. 숨기려는 변수가 포함된 영역의 하위 영역 내에서 다시 선언하여 범위를 섀도할 수 있습니다.
상속을 통한 섀도잉. 숨기려는 변수가 클래스 수준에서 정의된 경우 파생 클래스의 Shadows 키워드로 다시 선언하여 상속을 통해 섀도할 수 있습니다.
변수를 숨기는 두 가지 방법
범위를 통해 변수를 섀도하여 변수를 숨기려면
숨기려는 변수를 정의하는 지역을 결정하고 변수를 사용하여 다시 정의할 하위 영역을 결정합니다.
변수의 지역 다시 정의할 수 있는 하위 영역 모듈 모듈 내의 클래스 클래스 클래스 내의 하위 클래스
클래스 내의 프로시저예를 들어
If
...End If
생성 또는For
루프와 같이 해당 프로시저 내의 블록에서 프로시저 변수를 다시 정의할 수 없습니다.하위 영역이 아직 없는 경우 만듭니다.
하위 영역 내에서 섀도잉 변수를 선언하는 Dim 문을 작성합니다.
하위 영역 내의 코드가 변수 이름을 참조하는 경우 컴파일러는 섀도잉 변수에 대한 참조를 확인합니다.
다음 예제에서는 범위를 통한 섀도잉과 섀도잉을 우회하는 참조를 보여줍니다.
Module shadowByScope ' The following statement declares num as a module-level variable. Public num As Integer Sub show() ' The following statement declares num as a local variable. Dim num As Integer ' The following statement sets the value of the local variable. num = 2 ' The following statement displays the module-level variable. MsgBox(CStr(shadowByScope.num)) End Sub Sub useModuleLevelNum() ' The following statement sets the value of the module-level variable. num = 1 show() End Sub End Module
앞의 예제에서는 모듈 수준과 프로시저 수준(프로시저
show
)에서 변수num
을(를) 선언합니다. 지역 변수num
은show
내에서 모듈 수준 변수num
을 숨기므로 지역 변수는 2로 설정됩니다. 그러나useModuleLevelNum
프로시저에num
을 섀도할 지역 변수는 없습니다. 따라서useModuleLevelNum
은 모듈 수준 변수의 값을 1로 설정합니다.show
내부의MsgBox
호출은 모듈 이름으로num
을 한정하여 섀도 메커니즘을 우회합니다. 따라서 지역 변수 대신 모듈 수준 변수를 표시합니다.
상속을 통해 변수를 섀도하여 변수를 숨기려면
숨기려는 변수가 클래스 및 클래스 수준(프로시저 외부)에서 선언되어 있는지 확인합니다. 그렇지 않으면 상속을 통해 섀도할 수 없습니다.
아직 없는 경우 변수의 클래스에서 파생된 클래스를 정의합니다.
파생 클래스 내에서 변수를 선언하는
Dim
문을 작성합니다. 선언에 Shadows 키워드를 포함합니다.파생 클래스의 코드가 변수 이름을 참조하는 경우 컴파일러는 변수에 대한 참조를 확인합니다.
다음 예제에서는 상속을 통한 섀도잉을 보여줍니다. 섀도잉 변수에 액세스하는 참조와 그림자를 우회하는 참조를 두 개 만듭니다.
Public Class shadowBaseClass Public shadowString As String = "This is the base class string." End Class Public Class shadowDerivedClass Inherits shadowBaseClass Public Shadows shadowString As String = "This is the derived class string." Public Sub showStrings() Dim s As String = "Unqualified shadowString: " & shadowString & vbCrLf & "MyBase.shadowString: " & MyBase.shadowString MsgBox(s) End Sub End Class
앞의 예제에서는 기본 클래스에서
shadowString
변수를 선언하고 파생 클래스에서 이를 섀도합니다. 파생 클래스의 프로시저showStrings
는 이름shadowString
이 정규화되지 않은 경우 문자열의 섀도잉 버전을 표시합니다. 그런 다음shadowString
이MyBase
키워드로 정규화된 경우 그림자가 있는 버전을 표시합니다.
강력한 프로그래밍
섀도는 이름이 같은 변수 버전을 두 개 이상 도입합니다. 코드 문이 변수 이름을 참조하는 경우 컴파일러가 참조를 확인하는 버전은 코드 문의 위치 및 정규화된 문자열의 존재와 같은 요인에 따라 달라집니다. 이렇게 하면 의도하지 않은 버전의 그림자 변수를 참조할 위험이 높아질 수 있습니다. 그림자가 있는 변수에 대한 모든 참조를 완전히 정규화하여 해당 위험을 낮출 수 있습니다.
참고 항목
.NET