값 또는 참조로 인수 전달

업데이트: 2007년 11월

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

차이점

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

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

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

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

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

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

전달 메커니즘의 선택

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

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

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

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

전달 메커니즘의 결정

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

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

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

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

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

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

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

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

참고 항목

작업

방법: 프로시저에 인수 전달

방법: 프로시저 인수의 값 변경

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

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

개념

Visual Basic의 프로시저

프로시저 매개 변수 및 인수

위치 및 이름으로 인수 전달

값 형식과 참조 형식