값 및 참조로 인수 전달(Visual Basic)

Visual Basic에서는 또는 참조로 프로시저에 인수를 전달할 수 있습니다. 이를 전달 메커니즘이라고 하며 프로시저가 호출 코드의 인수 기반 프로그래밍 요소를 수정할 수 있는지 여부를 결정합니다. 프로시저 선언은 ByVal 또는 ByRef 키워드를 지정하여 각 매개 변수의 전달 메커니즘을 결정합니다.

구분

프로시저에 인수를 전달할 때는 서로 상호 작용하는 몇 가지 차이점에 대해 알고 있어야 합니다.

  • 기본 프로그래밍 요소를 수정할 수 있는지 여부

  • 인수 자체를 수정할 수 있는지 여부

  • 인수가 값으로 전달되는지 참조로 전달되는지 여부

  • 인수 데이터 형식이 값 형식인지 참조 형식인지 여부

자세한 내용은 수정할 수 있는 인수와 수정할 수 없는 인수 간의 차이점값으로 인수를 전달하는 것과 참조로 인수를 전달하는 것의 차이점을 참조하세요.

전달 메커니즘 선택

각 인수에 대한 전달 메커니즘은 신중하게 선택해야 합니다.

  • 보호. 두 가지 전달 메커니즘 중 하나를 선택할 때 가장 중요한 기준은 변경할 호출 변수의 노출입니다. 인수 ByRef를 전달하면 프로시저가 해당 인수를 통해 호출 코드에 값을 반환할 수 있다는 이점이 있습니다. 인수 ByVal을 전달하면 프로시저에 의해 변수가 변경되지 않도록 보호할 수 있다는 이점이 있습니다.

  • 성능. 전달 메커니즘이 코드의 성능에 영향을 미칠 수 있지만 일반적으로 그 차이는 미미합니다. 이에 대한 한 가지 예외는 ByVal로 전달된 값 형식입니다. 이 경우 Visual Basic은 인수의 전체 데이터 내용을 복사합니다. 따라서 구조체와 같이 큰 값 형식의 경우 ByRef로 전달하는 것이 더 효율적일 수 있습니다.

    참조 형식의 경우 데이터에 대한 포인터만 복사됩니다(32비트 플랫폼의 경우 4바이트, 64비트 플랫폼의 경우 8바이트). 따라서 String 또는 Object 형식의 인수를 성능에 영향을 미치지 않고 값으로 전달할 수 있습니다.

전달 메커니즘 결정

프로시저 선언은 각 매개 변수에 대한 전달 메커니즘을 지정합니다. 호출 코드는 ByVal 메커니즘을 재정의할 수 없습니다.

매개 변수가 ByRef로 선언된 경우 호출 코드는 호출 시 인수 이름을 괄호로 묶어 메커니즘을 ByVal로 강제할 수 있습니다. 자세한 내용은 방법: 인수가 값으로 전달되도록 설정을 참조하세요.

Visual Basic의 기본값은 인수를 값으로 전달하는 것입니다.

값으로 인수를 전달하는 경우

  • 인수의 기본 호출 코드 요소가 수정할 수 없는 요소인 경우 해당 매개 변수인 ByVal을 선언합니다. 어떤 코드도 수정할 수 없는 요소의 값을 변경할 수는 없습니다.

  • 기본 요소를 수정할 수 있지만 프로시저에서 해당 값을 변경할 수 없도록 하려면 매개 변수 ByVal을 선언하세요. 호출 코드만 값으로 전달된 수정할 수 있는 요소의 값을 변경할 수 있습니다.

참조로 인수를 전달하는 경우

  • 프로시저에서 호출 코드의 기본 요소를 변경해야 하는 경우 해당 매개 변수인 ByRef를 선언합니다.

  • 코드의 올바른 실행이 호출 코드에서 기본 요소를 변경하는 프로시저에 따라 달라지는 경우 매개 변수 ByRef를 선언합니다. 값으로 전달하거나 호출 코드가 괄호로 인수를 묶어 ByRef 전달 메커니즘을 재정의하는 경우 프로시저 호출에서 예기치 않은 결과가 발생할 수 있습니다.

예제

설명

다음 예제에서는 인수를 값으로 전달하는 때와 참조로 전달하는 때를 보여 줍니다. 프로시저 Calculate에는 ByValByRef 매개 변수가 모두 있습니다. 이자율(rate)과 금액(debt)의 합계가 주어지면 프로시저의 작업은 debt의 원래 값에 이자율을 적용한 결과인 debt의 새 값을 계산하는 것입니다. debtByRef 매개 변수이므로 새 합계는 debt에 해당하는 호출 코드의 인수 값에 반영됩니다. 매개 변수 rateCalculate의 값을 변경해서는 안 되므로 ByVal 매개 변수입니다.

코드

Module Module1

    Sub Main()
        ' Two interest rates are declared, one a constant and one a 
        ' variable.
        Const highRate As Double = 12.5
        Dim lowRate = highRate * 0.6

        Dim initialDebt = 4999.99
        ' Make a copy of the original value of the debt.
        Dim debtWithInterest = initialDebt

        ' Calculate the total debt with the high interest rate applied.
        ' Argument highRate is a constant, which is appropriate for a 
        ' ByVal parameter. Argument debtWithInterest must be a variable
        ' because the procedure will change its value to the calculated
        ' total with interest applied.
        Calculate(highRate, debtWithInterest)
        ' Format the result to represent currency, and display it.
        Dim debtString = Format(debtWithInterest, "C")
        Console.WriteLine("What I owe with high interest: " & debtString)

        ' Repeat the process with lowRate. Argument lowRate is not a 
        ' constant, but the ByVal parameter protects it from accidental
        ' or intentional change by the procedure. 

        ' Set debtWithInterest back to the original value.
        debtWithInterest = initialDebt
        Calculate(lowRate, debtWithInterest)
        debtString = Format(debtWithInterest, "C")
        Console.WriteLine("What I owe with low interest:  " & debtString)
    End Sub

    ' Parameter rate is a ByVal parameter because the procedure should
    ' not change the value of the corresponding argument in the 
    ' calling code. 

    ' The calculated value of the debt parameter, however, should be
    ' reflected in the value of the corresponding argument in the 
    ' calling code. Therefore, it must be declared ByRef. 
    Sub Calculate(ByVal rate As Double, ByRef debt As Double)
        debt = debt + (debt * rate / 100)
    End Sub

End Module

참고 항목