다음을 통해 공유


방법: 이름이 같은 변수 숨기기(Visual Basic)

변수를 섀도하여 숨길 수 있습니다. 즉, 동일한 이름의 변수로 다시 정의하면 됩니다. 다음 두 가지 방법으로 숨기려는 변수를 숨길 수 있습니다.

  • 범위를 통한 섀도잉. 숨기려는 변수가 포함된 영역의 하위 영역 내에서 다시 선언하여 범위를 섀도할 수 있습니다.

  • 상속을 통한 섀도잉. 숨기려는 변수가 클래스 수준에서 정의된 경우 파생 클래스의 Shadows 키워드로 다시 선언하여 상속을 통해 섀도할 수 있습니다.

변수를 숨기는 두 가지 방법

범위를 통해 변수를 섀도하여 변수를 숨기려면

  1. 숨기려는 변수를 정의하는 지역을 결정하고 변수를 사용하여 다시 정의할 하위 영역을 결정합니다.

    변수의 지역 다시 정의할 수 있는 하위 영역
    모듈 모듈 내의 클래스
    클래스 클래스 내의 하위 클래스

    클래스 내의 프로시저

    예를 들어 If...End If 생성 또는 For 루프와 같이 해당 프로시저 내의 블록에서 프로시저 변수를 다시 정의할 수 없습니다.

  2. 하위 영역이 아직 없는 경우 만듭니다.

  3. 하위 영역 내에서 섀도잉 변수를 선언하는 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을(를) 선언합니다. 지역 변수 numshow 내에서 모듈 수준 변수 num을 숨기므로 지역 변수는 2로 설정됩니다. 그러나 useModuleLevelNum 프로시저에 num을 섀도할 지역 변수는 없습니다. 따라서 useModuleLevelNum은 모듈 수준 변수의 값을 1로 설정합니다.

    show 내부의 MsgBox 호출은 모듈 이름으로 num을 한정하여 섀도 메커니즘을 우회합니다. 따라서 지역 변수 대신 모듈 수준 변수를 표시합니다.

상속을 통해 변수를 섀도하여 변수를 숨기려면

  1. 숨기려는 변수가 클래스 및 클래스 수준(프로시저 외부)에서 선언되어 있는지 확인합니다. 그렇지 않으면 상속을 통해 섀도할 수 없습니다.

  2. 아직 없는 경우 변수의 클래스에서 파생된 클래스를 정의합니다.

  3. 파생 클래스 내에서 변수를 선언하는 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이 정규화되지 않은 경우 문자열의 섀도잉 버전을 표시합니다. 그런 다음 shadowStringMyBase 키워드로 정규화된 경우 그림자가 있는 버전을 표시합니다.

강력한 프로그래밍

섀도는 이름이 같은 변수 버전을 두 개 이상 도입합니다. 코드 문이 변수 이름을 참조하는 경우 컴파일러가 참조를 확인하는 버전은 코드 문의 위치 및 정규화된 문자열의 존재와 같은 요인에 따라 달라집니다. 이렇게 하면 의도하지 않은 버전의 그림자 변수를 참조할 위험이 높아질 수 있습니다. 그림자가 있는 변수에 대한 모든 참조를 완전히 정규화하여 해당 위험을 낮출 수 있습니다.

참고 항목