ByVal 수정자는 프로시저나 함수에 매개변수를 값으로 전달하는 것을 나타냅니다. 비주얼 베이직에서는 기본적으로 ByVal이 사용되며, 프로시저 내에서 매개변수에 대한 수정 사항이 호출자의 원래 변수에 영향을 미치지 않도록 보장합니다.
고전적인 VB 버전에서는 매개변수를 값을 통해서나 참조를 통해 두 가지 방식으로 전달할 수 있었습니다. 언어의 발전과 복잡한 데이터 타입(구조체, 클래스)의 등장으로 인해 ByVal과 ByRef 사이의 의식적인 선택의 중요성이 커졌습니다.
매개변수 전달 방식의 잘못된 선택은 종종 오류를 초래할 수 있습니다. 호출 코드의 변수를 의도하지 않게 변경하거나 반대로 기대했던 변경이 발생하지 않을 수 있습니다.
프로시저에서 값의 복사본으로 작업해야 할 때 ByVal을 사용합니다. primitive 타입, 구조체 및 경우에 따라 참조 타입을 전달하는 데 사용됩니다. 이는 참조가 보존되는 것이 중요할 때입니다.
코드 예시:
Sub Increment(ByVal number As Integer) number += 1 End Sub Dim myValue As Integer = 10 Increment(myValue) Console.WriteLine(myValue) ' 10이 반환됩니다, 11이 아닙니다
주요 특징:
객체(예: 클래스 인스턴스)를 ByVal 수정자로 전달하면 어떻게 될까요?
답변: 객체의 참조 복사가 전달되고, 실제 객체는 전달되지 않습니다. 프로시저 내에서 객체의 필드를 변경할 수 있으며 — 변경 사항은 외부에서 볼 수 있습니다. 참조는 바꿀 수 없지만, 객체는 프로시저 내부에서 새 것으로 교체할 수 없습니다.
코드 예시:
Class Counters Public Value As Integer End Class Sub ModifyCounter(ByVal c As Counters) c.Value = 999 ' 속성을 변경합니다! c = New Counters() ' 이 변경은 호출하는 코드에서 보이지 않습니다 End Sub Dim example As New Counters() ModifyCounter(example) Console.WriteLine(example.Value) ' 999를 출력합니다
구조체를 ByVal로 전달할 때, 프로시저 내에서 필드를 변경하면 값이 변할까요?
답변: 아닙니다, 구조체의 전체 인스턴스가 복사되고, 변경 사항은 외부로 전달되지 않습니다. 구조체의 각 레코드는 프로시저 내에서 각자 고유합니다.
매개변수에 대해 ByVal를 명시하는 것이 의무인가요?
답변: 아닙니다, ByVal는 기본적으로 사용되며, 명시적인 명시는 가독성을 높이기 위해만 사용합니다.
개발자가 ByVal로 배열을 함수에 전달하는데, 배열의 요소를 수정할 수 있음을 기대하며 새 배열이 호출 스코프에 나타날 것이라고 생각합니다 (사실은 Reference Type이 참조로 전달됩니다).
장점:
단점:
함수에서 변경되지 않아야 하는 배열의 인덱스를 전달할 때 ByVal을 사용합니다. 내부에서 인덱스 값을 변경하더라도 원래 변수는 영향을 받지 않습니다.
장점:
단점: