다음을 통해 공유


Visual Basic의 변수 문제 해결

이 페이지에는 Visual Basic에서 변수를 사용할 때 발생할 수 있는 몇 가지 일반적인 문제가 나열되어 있습니다.

개체의 멤버에 액세스할 수 없습니다.

코드에서 개체의 속성이나 메서드에 액세스하려고 하면 다음과 같은 두 가지 오류가 발생할 수 있습니다.

  • 개체 변수를 특정 형식으로 선언한 다음 해당 형식으로 정의되지 않은 멤버를 참조하면 컴파일러에서 오류 메시지가 생성됩니다.

  • 개체 변수에 할당된 개체가 코드에서 액세스하려는 멤버를 노출하지 않는 경우 런타임 MemberAccessException 이 발생합니다. 개체 데이터 형식 변수의 경우 멤버가 이 아닌 Public경우에도 이 예외를 가져올 수 있습니다. 그 이유는 런타임 바인딩에서는 Public 멤버에만 액세스할 수 있기 때문입니다.

Option Strict Statement 의 형식 검사가 On으로 설정된 경우 개체 변수는 선언된 클래스의 메서드와 속성에만 액세스할 수 있습니다. 다음은 이에 대한 예입니다.

Dim p As Object = New System.Windows.Forms.Label
Dim q As System.Windows.Forms.Label = New System.Windows.Forms.Label
Dim j, k As Integer
' The following statement generates a compiler error.
j = p.Left
' The following statement retrieves the left edge of the label 
' in pixels.
k = q.Left

이 예제에서 pObject 클래스 자체의 멤버만 사용할 수 있으므로 Left 속성을 포함하지 않습니다. 반면, q 형식으로 선언된 LabelLabel 네임스페이스에 있는 System.Windows.Forms 클래스의 모든 메서드와 속성을 사용할 수 있습니다.

해결 방법

특정 클래스 개체의 모든 멤버에 액세스하려면 개체 변수를 해당 클래스의 형식으로 선언합니다. 그렇게 할 수 없는 경우(예: 컴파일 타임에 개체 형식을 모르는 경우)에는 Option StrictOff 로 설정하고 변수를 Object Data Type에서 변수 작업 시 발생할 수 있는 일반적인 문제를 보여 줍니다. 그러면 모든 형식의 개체가 변수에 할당될 수 있으므로 현재 할당된 개체의 형식이 적합한지 확인해야 합니다. TypeOf 연산자를 사용하여 이 결정을 내릴 수 있습니다.

다른 구성 요소에서 사용자 변수에 액세스할 수 없습니다.

Visual Basic 이름은 대/소문자를 구분하지 않습니다. 따라서 컴파일러에서는 대/소문자만 다른 두 이름을 동일한 이름으로 간주합니다. 예를 들어, ABCabc 는 동일한 선언 요소를 참조하는 것으로 간주합니다.

그러나, CLR(공용 언어 런타임)에서는 대/소문자를 구분하는 바인딩을 사용합니다. 그러므로, 어셈블리나 DLL을 작성하여 다른 어셈블리에서 이를 사용하게 되면 이름의 대/소문자가 구분됩니다. 예를 들어, ABC라는 이름의 요소를 포함하는 클래스를 정의하고 다른 어셈블리에서 공용 언어 런타임을 통해 이 클래스를 사용할 경우 해당 어셈블리에서 이 요소를 ABC로 참조해야 합니다. 클래스를 다시 컴파일하고 요소 이름을 abc로 변경하면 이 클래스를 사용하는 다른 어셈블리가 더 이상 이 요소에 액세스할 수 없습니다. 따라서, 어셈블리를 업데이트하여 릴리스하는 경우 공용 요소의 알파벳 대/소문자를 변경하지 않아야 합니다.

자세한 내용은 Common Language Runtime을 참조하세요.

해결 방법

다른 구성 요소에서 사용자 변수에 액세스할 수 있도록 하려면 이름의 대/소문자를 구분합니다. 클래스나 모듈을 테스트하는 경우에는 다른 어셈블리가 원하는 변수에 바인딩되는지 확인합니다. 구성 요소를 게시한 경우에는 대/소문자 변경을 포함하여 기존 변수 이름을 수정하는 어떤 작업도 수행하지 마세요.

잘못된 변수 사용

이름이 같은 변수가 두 개 이상 있는 경우 Visual Basic 컴파일러는 해당 이름에 대한 각 참조를 resolve 시도합니다. 변수 범위가 다른 경우 컴파일러에서는 범위가 가장 작은 선언에 대한 참조를 확인합니다. 변수 범위가 같은 경우에는 확인에 실패하고 컴파일러에서 오류를 발생시킵니다. 자세한 내용은 References to Declared Elements을 참조하세요.

해결 방법

이름은 같지만 범위가 다른 변수를 사용하지 않습니다. 다른 어셈블리나 프로젝트를 사용하는 경우에는 가능하면 이러한 외부 구성 요소에 정의된 이름을 사용하지 않습니다. 이름이 같은 변수가 두 개 이상 있는 경우 모든 참조를 해당 이름으로 한정해야 합니다. 자세한 내용은 References to Declared Elements을 참조하세요.

참고 항목