다음을 통해 공유


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

프로시저에서 매개 변수를 ByRef(Visual Basic)로 선언하면 Visual Basic에서 호출 코드의 내부 인수로 사용하는 프로그래밍 요소에 대한 직접적인 참조를 프로시저 코드에 제공합니다. 이 경우 프로시저에서 호출 코드의 내부 인수로 사용하는 값을 변경할 수 있습니다. 때로는 호출 코드에서 그러한 변경을 금지해야 하는 경우도 있습니다.

프로시저에서 해당 매개 변수를 ByVal(Visual Basic)로 선언하면 인수가 변경되는 것을 항상 방지할 수 있습니다. 지정된 인수를 일부 경우에만 변경할 수 있도록 하려면 인수를 ByRef로 선언하고 호출 코드에서 각각의 호출에 사용되는 전달 메커니즘을 결정하도록 하면 됩니다. 이때는 참조로 전달할 인수를 괄호로 묶는 것이 아니라 값으로 전달할 해당 인수를 괄호로 묶습니다. 자세한 내용은 방법: 인수가 값으로 전달되도록 설정(Visual Basic)을 참조하십시오.

예제

다음 예제에서는 배열 변수를 받아 그 요소로 작업하는 두 개의 프로시저를 보여 줍니다. increase 프로시저는 각 요소에 1만 더합니다. replace 프로시저는 a() 매개 변수에 새 배열을 할당한 다음 각 요소에 1씩 더합니다. 그러나 다시 할당해도 호출 코드의 내부 배열 변수는 영향을 받지 않습니다.

Public Sub increase(ByVal a() As Long)
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Public Sub replace(ByVal a() As Long)
    Dim k() As Long = {100, 200, 300}
    a = k
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))

첫 번째 MsgBox 호출에서는 "After increase(n): 11, 21, 31, 41"이 표시됩니다. n 배열이 참조 형식이기 때문에 전달 메커니즘이 ByVal인 경우에도 replace에서 해당 멤버를 변경할 수 있습니다.

두 번째 MsgBox 호출에서는 "After replace(n): 11, 21, 31, 41"이 표시됩니다. n은 ByVal로 전달되므로, replace는 새 배열을 지정하여 호출 코드에서 n 변수를 수정할 수 없습니다. replace가 새 배열 인스턴스 k를 만들어 지역 변수 a에 지정하면 호출 코드에서 전달된 n에 대한 참조가 손실됩니다. a의 멤버를 변경할 경우 지역 배열 k만 영향을 받습니다. 따라서 replace는 호출 코드에서 n 배열 값을 늘리지 않습니다.

코드 컴파일

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

참고 항목

작업

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

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

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

개념

Visual Basic의 프로시저

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

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

수정할 수 있는 인수와 수정할 수 없는 인수 사이의 차이점(Visual Basic)

인수를 값으로 전달할 때와 참조로 전달할 때의 차이점(Visual Basic)

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

기타 리소스

데이터 형식 구현(Visual Basic)