다음을 통해 공유


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

프로시저를 호출할 때 사용자가 제공하는 각 인수는 프로시저에 정의된 매개 변수 중 하나에 해당합니다. 경우에 따라서는 호출 코드에서 인수를 원본으로 사용하는 값을 프로시저 코드에서 변경할 수 있습니다. 그 외의 경우에는 프로시저에서 인수의 로컬 복사본만 변경할 수 있습니다.

프로시저를 호출할 경우 Visual Basic에서는 ByVal(Visual Basic)로 전달되는 모든 인수의 로컬 복사본을 만듭니다. ByRef(Visual Basic)가 전달된 각 인수에 대해 Visual Basic에서는 호출 코드에서 인수를 원본으로 사용하는 프로그래밍 요소에 대한 직접 참조를 프로시저 코드에 제공합니다.

호출 코드에 있는 내부 요소를 수정할 수 있고 인수에 ByRef를 전달하면 프로시저 코드는 직접 참조를 사용하여 호출 코드에 있는 요소의 값을 변경할 수 있습니다.

내부 값 변경

호출 코드에 있는 프로시저 인수의 내부 값을 변경하려면

  1. 프로시저 선언에서 인수에 해당하는 매개 변수에 대해 ByRef(Visual Basic)를 지정합니다.

  2. 호출 코드에서 수정할 수 있는 프로그래밍 요소를 인수로 전달합니다.

  3. 호출 코드에서 인수 목록의 인수를 괄호로 묶지 않습니다.

  4. 프로시저 코드에서 매개 변수 이름을 사용하여 호출 코드에 있는 내부 요소에 값을 할당합니다.

실례는 아래 쪽에 나와 있는 예제를 참조하십시오.

로컬 복사본 변경

호출 코드에 있는 내부 요소를 수정할 수 없거나 인수에 ByVal을 전달한 경우 프로시저는 호출 코드에서 해당 값을 변경할 수 없습니다. 그러나 프로시저는 이러한 인수의 로컬 복사본을 변경할 수 있습니다.

프로시저 코드에 있는 프로시저 인수의 복사본을 변경하려면

  1. 프로시저 선언에서 인수에 해당하는 매개 변수에 대해 ByVal(Visual Basic)을 지정합니다.

    또는

    호출 코드에서 인수 목록의 인수를 괄호로 묶습니다. 이렇게 하면 해당 매개 변수에서 ByRef를 지정하더라도 Visual Basic에서는 인수를 값으로 전달합니다.

  2. 프로시저 코드에서 매개 변수 이름을 사용하여 인수의 로컬 복사본에 값을 할당합니다. 호출 코드에 있는 내부 값은 변경되지 않습니다.

예제

다음 예제에서는 두 개의 프로시저가 배열 변수를 값으로 받아 그 요소를 변경합니다. 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(ByRef 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): 101, 201, 301"을 표시합니다. n에는 ByRef가 전달되므로 replace 가 호출 코드에서 n 변수를 수정하고 이 변수에 새 배열을 할당할 수 있습니다. n 이 참조 형식이므로 replace 는 해당 멤버 또한 변경할 수 있습니다.

호출 코드에서 프로시저가 변수 자체를 수정하지 못하도록 방지할 수 있습니다. 방법: 값 변경에 대해 프로시저 인수 보호(Visual Basic)를 참조하십시오.

코드 컴파일

변수를 참조로 전달할 경우 ByRef 키워드를 사용하여 이 메커니즘을 지정해야 합니다.

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)