다음을 통해 공유


값 및 참조로 인수 전달(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계산하는 것입니다. debt 매개 변수이므로 ByRef 새 합계는 호출 코드에서 해당되는 인수 값에 반영됩니다debt. 매개 변수 rateByVal 해당 값을 변경해서는 안 되므로 Calculate 매개 변수입니다.

코드

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

참고하십시오