[VB.NET] 함수 포인터 - 문자열로 함수 호출하기

2023. 2. 15. 09:00VB.NET/기타

프로그래밍을 하다보면 종종 '문자열과 동일한 이름의 함수를 호출하면 좋지 않을까?' 하는 생각을 하게 되는 경우가 생긴다. 아니, 이런 생각을 하기에 앞서 이런 상황이 발생할 수도 있다. 글로 설명하려니 약간 꼬이는것 같으니 간략하게 예제를 하나 만들어보자.

VB.NET용 Windows Form 앱을 하나 생성해서 폼에 아래 속성으로 텍스트박스와 버튼컨트롤을 하나씩 생성하자.

Kind Name Text
TextBox TextFunc ""
Button ButtonExe &Execute


그다음 ButtonExe 버튼의 Click 이벤트에 아래 소스를 입력하자.

아... 그전에 Import도 하나 추가하자. MethodInfo형을 사용하기 위해서 필요하다.

Imports System.Reflection
Private Sub ButtonExe_Click(sender As Object, e As EventArgs) Handles ButtonExe.Click

    Dim func_name As String = "Func" & TextFunc.Text
    Dim curr_func As MethodInfo = [GetType]().GetMethod(func_name, BindingFlags.NonPublic Or BindingFlags.Instance)
    Dim param As Object() = {"ppp"}
    Dim ret As String = ""

    If curr_func Is Nothing Then
        MsgBox(func_name & " 함수를 정의하세요.")
    Else
        ret = curr_func.Invoke(Me, param)
        MsgBox(func_name & " 호출결과 - " & ret)
    End If

End Sub


그리고 이어서 아래 소스도 입력한 후 실행하자.

Private Function Func1(param) As String
    Return "Func1 호출됨 - param = " & param
End Function

Private Function Func2(param) As String
    Return "Func2 호출됨 - param = " & param
End Function


실행후 텍스트상자에 숫자 1을 입력하고 버튼클릭시 아래 메시지박스가 뜨면 성공

문자열로 함수 호출 성공

이제 한줄씩 차근차근 알아보자.

Line 1 : Dim func_name As String = "Func" & TextFunc.Text

호출할 함수명을 문자열로 만들어준다. 텍스트상자에 입력한 값에 따라서 호출할 함수명이 달라지게 될 것이다.

Line 2 : Dim curr_func As MethodInfo = [GetType]().GetMethod(func_name, BindingFlags.NonPublic Or BindingFlags.Instance)

이 줄이 핵심. 문자열과 동일한 이름을 가진 함수/프로시저의 주소를 curr_func 변수에 넣는다. 속성에 BindingFlags라는 Enum 변수를 사용하는데 호출하는 함수정의에 따라 Public/NonPublic로 구분해준다. 여기서는 호출하는 함수를 모두 Private로 정의했으니 NonPublic을 사용했다.

Line 3 : Dim param As Object() = {"ppp"}

함수 호출시 파라미터 정의 부분. 파라미터 없는 함수를 호출할때는 Nothing으로 초기화해주면 된다.

Line 8 : ret = curr_func.Invoke(Me, param)

함수 호출시 Invoke를 사용하는 구문. Invoke는 원하는 형식으로 메모리에 할당해주는 기능을 수행한다. 이전 강좌에서 컨트롤의 크로스 스레드 문제를 해결하기 위해 사용한적이 있는데 결국 함수포인터 개념으로 이해하는게 가장 좋은것 같다.

이외의 부분은 아주 단순하게 작성했으니 소스만 훑어봐도 감이 잡힐걸로 생각된다.

이처럼 VB.NET에서는 포인터를 사용할 수가 없어서 나름의 제약사항이 있지만, 방법을 찾아보면 웬만한 해결방법은 다 제공해주고 있으니, 이 방법을 찾아내는게 가장 중요하다고 하겠다.

반응형

'VB.NET > 기타' 카테고리의 다른 글

VB.NET으로 스레드 구현하기  (0) 2023.04.10
[VB.NET] Base64 인코딩 / 디코딩  (0) 2023.02.20