문자열 이름을 사용하여 속성 또는 메서드 호출(Visual Basic)

대부분의 경우, 디자인 타임에 개체의 속성과 메서드를 검색하고 이를 처리할 코드를 작성할 수 있습니다. 하지만, 경우에 따라서는 개체의 속성과 메서드를 미리 알 수 없게 되는 경우가 있을 수 있고, 최종 사용자가 런타임에 속성을 지정하거나 메서드를 실행하도록 하는 유연성만을 원할 경우도 있을 수 있습니다.

CallByName 함수

예를 들어 연산자를 COM 구성 요소에 전달하여 사용자가 입력한 식을 평가하는 클라이언트 애플리케이션을 생각해 봅시다. 새 연산자가 필요한 구성 요소에 새로운 기능을 지속적으로 추가한다고 가정해 봅시다. 표준 개체 액세스 기술을 사용하는 경우, 클라이언트 애플리케이션이 새 연산자를 사용할 수 있게 하려면 먼저 해당 클라이언트 애플리케이션을 다시 컴파일하여 다시 배포해야 합니다. 이러한 경우를 피하기 위해, CallByName 함수를 사용해 애플리케이션을 바꾸지 않고도 새 연산자를 문자열로 전달할 수 있습니다.

CallByName 함수를 사용하면 스트링을 사용해 런타임에 속성이나 메서드를 지정할 수 있습니다. CallByName 함수의 서명은 다음과 같습니다.

Result = CallByName(Object, ProcedureName, CallType, Arguments())

첫 번째 인수인 Object는 작업할 개체의 이름을 사용합니다. ProcedureName 인수는 호출할 메서드나 속성 프로시저의 이름이 들어 있는 문자열을 사용합니다. CallType 인수는 메서드(Microsoft.VisualBasic.CallType.Method)나 속성 읽기(Microsoft.VisualBasic.CallType.Get) 또는 속성 집합(Microsoft.VisualBasic.CallType.Set)을 호출하는 프로시저 형식을 나타내는 상수를 사용합니다. 선택 사항인 Arguments 인수는 프로시저에 대한 인수가 포함된 Object 형식의 배열을 사용합니다.

CallByName은 현재 솔루션의 클래스들과 함께 사용할 수도 있지만 COM 개체나 .NET Framework 어셈블리 개체에 액세스할 때 가장 자주 사용됩니다.

다음 코드와 같이 SquareRoot라는 새 함수가 포함된 MathClass라는 클래스를 포함하는 어셈블리에 참조를 추가한다고 가정합니다.

Class MathClass
    Function SquareRoot(ByVal X As Double) As Double
        Return Math.Sqrt(X)
    End Function
    Function InverseSine(ByVal X As Double) As Double
        Return Math.Atan(X / Math.Sqrt(-X * X + 1))
    End Function
    Function Acos(ByVal X As Double) As Double
        Return Math.Atan(-X / Math.Sqrt(-X * X + 1)) + 2 * Math.Atan(1)
    End Function
End Class

사용자의 애플리케이션에서 텍스트 상자 컨트롤을 사용하여 호출할 메서드와 그 인수를 제어할 수 있습니다. 예를 들어, TextBox1에 계산할 식이 들어 있고 TextBox2가 그 함수의 이름을 입력하는 데 사용된다면, 사용자는 다음의 코드를 사용하여 TextBox1의 식에 SquareRoot 함수를 호출할 수 있습니다.

Private Sub CallMath()
    Dim Math As New MathClass
    Me.TextBox1.Text = CStr(CallByName(Math, Me.TextBox2.Text,
       Microsoft.VisualBasic.CallType.Method, TextBox1.Text))
End Sub

TextBox1에 "64"를 입력하고, TextBox2에는 "SquareRoot"를 입력한 다음 CallMath 프로시저를 호출하면 TextBox1의 숫자에 대한 제곱근이 계산됩니다. 예제의 코드는 필수 인수로 계산할 식이 들어 있는 문자열을 사용하는 SquareRoot 함수를 호출하여 64의 제곱근인 "8"을 TextBox1에 반환합니다. 물론, 사용자가 TextBox2에 잘못된 문자열을 입력하는 경우나 문자열에 메서드 대신 속성 이름이 들어가 있는 경우 또는 메서드에 추가적으로 필요한 인수가 있는 경우에는 런타임 오류가 발생합니다. 이런 오류들과 그 밖의 오류들을 예상하기 위해 CallByName을 사용하는 경우, 확실한 오류 처리 코드를 추가해야 합니다.

참고 항목

CallByName 함수가 유용한 경우도 있기는 하지만 CallByName을 사용하여 프로시저를 호출하는 것은 런타임에 바인딩된 코드보다 약간 느려서 성능에 영향을 주는 만큼, 득실을 따져가며 사용해야 합니다. 루프에서와 같이 반복적으로 호출되는 함수를 호출하는 경우, CallByName은 성능에 심각한 영향을 줄 수 있습니다.

참고 항목