C# 7.0에서 새롭게 도입된 로컬 함수(Local Function)는 다른 멤버 내부에 중첩되어 선언되는 private 메서드입니다. 로컬 함수는 자신을 둘러싼 포함 멤버(containing member) 내부에서만 호출할 수 있으며, 외부에서는 접근할 수 없습니다.
로컬 함수를 선언하고 호출할 수 있는 위치
로컬 함수는 아래와 같은 다양한 멤버 안에서 선언하고 호출할 수 있습니다.
- 메서드 — 특히 반복기(iterator) 메서드와 비동기(async) 메서드에서 유용하게 활용됩니다
- 생성자(Constructor)
- 속성 접근자(Property Accessor)
- 이벤트 접근자(Event Accessor)
- 익명 메서드(Anonymous Method)
- 람다 식(Lambda Expression)
- 종료자(Finalizer)
- 다른 로컬 함수 내부
로컬 함수를 사용하면 특정 멤버에서만 사용하는 보조 로직을 해당 멤버 바로 안에 캡슐화할 수 있어 코드의 가독성과 유지보수성이 크게 향상됩니다.
예제 1: 기본적인 로컬 함수
class Program{
public static void Main(){
void addTwoNumbers(int a, int b){
System.Console.WriteLine(a + b);
}
addTwoNumbers(1, 2);
Console.ReadLine();
}
}출력 결과
3
위 예제에서 addTwoNumbers는 Main 메서드 내부에 선언된 로컬 함수입니다. 이 함수는 오직 Main 안에서만 호출할 수 있습니다.
예제 2: out 매개변수를 사용하는 로컬 함수
class Program{
public static void Main(){
void addTwoNumbers(int a, int b, out int c){
c = a + b;
}
addTwoNumbers(1, 2, out int c);
System.Console.WriteLine(c);
Console.ReadLine();
}
}출력 결과
3
두 번째 예제처럼 로컬 함수도 일반 메서드와 마찬가지로 out, ref 같은 매개변수 한정자를 사용할 수 있습니다. 호출 시에는 C# 7.0의 인라인 변수 선언 기능을 활용해 out int c 형태로 간결하게 작성했습니다.
마무리
로컬 함수는 별도의 private 메서드를 클래스 수준에 만들 필요 없이, 필요한 곳 바로 옆에 보조 로직을 정의할 수 있게 해주는 강력한 기능입니다. 특히 유효성 검사나 반복되는 계산 로직을 반복기·비동기 메서드 내부에 배치할 때 코드 구조를 훨씬 깔끔하게 유지할 수 있습니다.