다음을 통해 공유


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

Visual Basic에서는 인수를 프로시저에 값으로 또는 참조로 전달할 수 있습니다. 이러한 전달 메커니즘에 따라 프로시저에서 호출 코드의 내부 인수로 사용하는 프로그래밍 요소를 수정할 수 있는지 여부가 결정됩니다. 프로시저 선언에서는 ByVal(Visual Basic) 또는 ByRef(Visual Basic) 키워드를 지정하여 각 매개 변수의 전달 메커니즘을 결정합니다.

차이점

인수를 프로시저에 전달할 때는 서로 영향을 줄 수 있는 다음 몇 가지 차이점에 주의해야 합니다.

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

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

  • 인수를 값으로 전달하는지 아니면 참조로 전달하는지

  • 인수 데이터 형식이 값 형식인지 아니면 참조 형식인지

자세한 내용은 수정할 수 있는 인수와 수정할 수 없는 인수 사이의 차이점(Visual Basic)인수를 값으로 전달할 때와 참조로 전달할 때의 차이점(Visual Basic)을 참조하십시오.

전달 메커니즘의 선택

각각의 인수에 대해 전달 메커니즘을 주의해서 선택해야 합니다.

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

  • 성능. 전달 메커니즘이 코드 성능에 영향을 미칠 수 있으나 큰 차이는 없습니다. 여기에서 한 가지 예외는 ByVal로 전달되는 값 형식입니다. 이 경우 Visual Basic에서 인수의 전체 데이터 내용을 복사하므로 구조체처럼 큰 값 형식의 경우는 ByRef로 전달하는 것이 더 효율적입니다.

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

전달 메커니즘의 결정

프로시저를 선언할 때 각 매개 변수의 전달 메커니즘을 지정합니다. 호출 코드는 ByVal 메커니즘을 재정의할 수 없습니다. 그러나 매개 변수를 ByRef로 선언하면 호출 코드가 호출에서 인수 이름을 괄호로 묶어 ByVal 메커니즘으로 전달되도록 할 수 있습니다.

Visual Basic에서는 기본적으로 인수를 값으로 전달합니다. ByVal 키워드를 사용하면 코드를 읽기 쉽게 만들 수 있습니다. 선언된 모든 매개 변수에 ByVal 또는 ByRef 키워드를 사용하는 것이 바람직한 프로그래밍 습관입니다.

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

  • 내부 인수로 사용하는 호출 코드 요소가 수정할 수 없는 요소이면 해당 매개 변수를 ByVal(Visual Basic)로 선언합니다. 수정할 수 없는 요소의 값은 어떤 코드에서도 변경할 수 없습니다.

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

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

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

  • 호출 코드에서 해당 요소를 변경해야만 프로시저 코드가 올바르게 실행되는 경우 매개 변수를 ByRef로 선언합니다. 인수를 값으로 전달하는 경우 또는 호출 코드에서 인수를 괄호로 묶어 ByRef 전달 메커니즘을 재정의하는 경우에는 프로시저 호출에서 예기치 않은 결과가 발생할 수 있습니다.

예제

설명

다음 예제에서는 인수를 값으로 전달해야 하는 경우와 참조로 전달해야 하는 경우를 보여 줍니다. Calculate 프로시저에는 ByVal 매개 변수와 ByRef 매개 변수가 모두 있습니다. 이율인 rate와 금액 합계인 debt가 지정되면 프로시저는 debt의 원래 값에 이율을 적용한 결과인 debt의 새 값을 계산합니다. debt가 ByRef 매개 변수이므로 새 합계는 debt에 해당하는 호출 코드의 인수 값에 반영됩니다. rate 매개 변수는 Calculate에서 해당 값을 변경하지 않아야 하므로 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

참고 항목

작업

방법: 프로시저에 인수 전달(Visual Basic)

방법: 프로시저 인수의 값 변경(Visual Basic)

방법: 값 변경에 대해 프로시저 인수 보호(Visual Basic)

방법: 인수가 값으로 전달되도록 설정(Visual Basic)

개념

Visual Basic의 프로시저

프로시저 매개 변수 및 인수(Visual Basic)

위치 및 이름으로 인수 전달(Visual Basic)

기타 리소스

데이터 형식 구현(Visual Basic)