문자열 이름을 사용하여 속성 또는 메서드 호출(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
은 성능에 심각한 영향을 줄 수 있습니다.
참고 항목
.NET