문제의 역사:
Visual Basic에서 중첩 프로시저(로컬 함수)는 VB 15.0(Visual Studio 2017)부터 도입되어 클래식 VB6와 차별화됩니다. 이 기능은 프로시저 내부에 다른 프로시저를 선언할 수 있게 하여, 언어의 표현력을 확장하고 보조 로직을 동일한 범위 내에서 조직하는 데 도움이 됩니다.
문제
보조 로직이 특정 메서드 내부에서만 필요하고 다른 곳에서는 필요하지 않은 빈번한 상황이 존재합니다. 과거에는 클래스 내에 개인 메서드를 만들어 네임스페이스의 혼잡을 증가시키고 코드 내비게이션을 어렵게 했습니다. 그러나 로컬 함수 또한 접근 범위 문제, 변수 접근 오류, 디버깅의 어려움에 직면할 수 있습니다.
해결책
중첩 프로시저는 "부모" 프로시저 안에 보조 로직을 캡슐화하여 코드를 더 읽기 쉽게 만들고 보조 메서드의 가시성을 제한합니다. VB.NET에서 중첩 함수를 선언하는 형식은 다음과 같습니다:
Sub MainProc() Dim x As Integer = 5 Dim y As Integer = 10 Console.WriteLine($"합계 — {Add(x, y)}") Function Add(a As Integer, b As Integer) As Integer Return a + b End Function End Sub
주요 특징:
중첩 프로시저에 Public, Friend 또는 Protected 접근 수정자를 사용할 수 있습니까?
아니요, 중첩 프로시저는 "부모" 프로시저 내부에서만 접근 수준이 허용됩니다. Public/Friend/Protected로 선언할 수 없으며 로컬로만 접근 가능합니다.
For 또는 If 문 안에 중첩 프로시저를 선언할 수 있습니까?
아니요, 로컬 함수는 메서드(프로시저) 내부의 첫 번째 레벨에서만 선언할 수 있으며 중첩 블록(예: For, If, While) 내부에서는 선언할 수 없습니다.
중첩 프로시저를 비동기(Async Sub/Function)로 만들 수 있습니까?
네, async 로컬 함수를 선언할 수 있으며, 이를 통해 메서드 내에서 비동기 실행 로직을 캡슐화할 수 있습니다:
Async Sub DoOperationsAsync() Await LocalAsync() Async Function LocalAsync() As Task Await Task.Delay(1000) Console.WriteLine("비동기 작업 완료.") End Function End Sub
프로젝트에서 private 메서드를 과도하게 사용하여 로컬 함수 대신 사용되었고, 그로 인해 수십 개의 보조 프로시저가 클래스 인터페이스를 혼잡하게 했습니다. 내비게이션이 심각하게 복잡해졌습니다.
장점:
단점:
내부 로직에 로컬 함수를 사용하는 접근 방식을 사용하여 모든 보조 처리가 주요 메서드 내에 위치하게 하였고, 코드가 자기 문서화되어 유지보수가 용이합니다.
장점:
단점: