프로시저 오버로딩(Visual Basic)

프로시저를 오버로드한다는 것은 동일한 이름이지만 다른 매개 변수 목록을 사용하여 여러 버전으로 프로시저를 정의하는 것을 의미합니다. 오버로드의 목적은 이름으로 구별하지 않고 밀접하게 관련된 여러 프로시저 버전을 정의하는 것입니다. 매개 변수 목록을 변경하여 이를 수행합니다.

오버로딩 규칙

프로시저를 오버로드하면 다음 규칙이 적용됩니다.

  • 동일한 이름. 오버로드된 각 버전은 동일한 프로시저 이름을 사용해야 합니다.

  • 다른 서명. 오버로드된 각 버전은 다음 측면 중 하나 이상에서 다른 모든 오버로드된 버전과 달라야 합니다.

    • 매개 변수 수

    • 매개 변수의 순서

    • 매개 변수의 데이터 형식

    • 형식 매개 변수의 수(제네릭 프로시저의 경우)

    • 반환 형식(변환 연산자에만 해당)

    프로시저 이름과 함께 이전 항목을 통칭하여 프로시저의 서명이라고 합니다. 오버로드된 프로시저를 호출하면 컴파일러는 서명을 사용하여 호출이 정의와 올바르게 일치하는지 확인합니다.

  • 서명이 아닌 항목. 서명을 변경하지 않고 프로시저를 오버로드할 수 없습니다. 특히 다음 항목 중 하나 이상만 변경하여 프로시저를 오버로드할 수 없습니다.

    • Public, Shared, Static 등의 프로시저 한정자 키워드

    • 매개 변수 또는 형식 매개 변수 이름

    • 형식 매개 변수 제약 조건(제네릭 프로시저의 경우)

    • ByRefOptional과 같은 매개 변수 한정자 키워드

    • 값을 반환하는지 여부

    • 반환 값의 데이터 형식(변환 연산자 제외)

    이전 목록의 항목은 서명의 일부가 아닙니다. 이를 사용하여 오버로드된 버전을 구별할 수는 없지만 해당 서명으로 적절하게 구별되는 오버로드된 버전 간에는 이를 변경할 수 있습니다.

  • 후기 바인딩 인수. 런타임에 바인딩된 개체 변수를 오버로드된 버전에 전달하려는 경우 적절한 매개 변수를 Object로 선언해야 합니다.

여러 버전의 프로시저

고객 잔액에 대한 트랜잭션을 게시하기 위해 Sub 프로시저를 작성 중이고 이름이나 계좌 번호로 고객을 참조할 수 있기를 원한다고 가정합니다. 이를 수용하기 위해 다음 예와 같이 두 가지 다른 Sub 프로시저를 정의할 수 있습니다.

Sub postName(ByVal custName As String, ByVal amount As Single)
    ' Insert code to access customer record by customer name.
End Sub
Sub postAcct(ByVal custAcct As Integer, ByVal amount As Single)
    ' Insert code to access customer record by account number.
End Sub

오버로드된 버전

대안은 단일 프로시저 이름을 오버로드하는 것입니다. 다음과 같이 오버로드 키워드를 사용하여 각 매개 변수 목록에 대한 프로시저 버전을 정의할 수 있습니다.

Overloads Sub post(ByVal custName As String, ByVal amount As Single)
    ' Insert code to access customer record by customer name.
End Sub
Overloads Sub post(ByVal custAcct As Integer, ByVal amount As Single)
    ' Insert code to access customer record by account number.
End Sub

추가 오버로드

Decimal 또는 Single의 트랜잭션 금액도 승인하려는 경우 이 변형을 허용하도록 post를 추가로 오버로드할 수 있습니다. 앞의 예에서 각 오버로드에 대해 이 작업을 수행한 경우 이름은 동일하지만 서명이 4개인 4개의 Sub 프로시저가 있게 됩니다.

오버로딩의 장점

프로시저 오버로드의 장점은 호출의 유연성에 있습니다. 앞의 예에서 선언된 post 프로시저를 사용하기 위해 호출 코드는 String 또는 Integer로 고객 ID를 가져오는 다음 두 경우 모두 동일한 프로시저를 호출할 수 있습니다. 다음 예제는 이러한 과정을 보여 줍니다.

Imports MSVB = Microsoft.VisualBasic
Dim customer As String
Dim accountNum As Integer
Dim amount As Single
customer = MSVB.Interaction.InputBox("Enter customer name or number")
amount = MSVB.Interaction.InputBox("Enter transaction amount")
Try
    accountNum = CInt(customer)
    Call post(accountNum, amount)
Catch
    Call post(customer, amount)
End Try

참고 항목