정적 지역 함수
명확성과 성능을 위해 캡처를 방지합니다.
정적 지역 함수은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
정적 로컬 함수
로컬 함수에 static을 지정하면 이를 포함하는 변수나 this를 캡처할 수 없게 됩니다. 따라서 함수가 독립적이고 명확해지며, 숨겨진 클로저 할당도 발생하지 않습니다.
정적 로컬 함수 선언하기
반환 형식 앞에 static 수정자를 추가하십시오. 함수에서 여전히 매개 변수를 받고 값을 반환할 수 있지만, 외부 로컬에는 접근할 수 없습니다.
using System;
public class Program
{
public static void Main()
{
static int Square(int n) => n * n; // captures nothing
Console.WriteLine(Square(6));
}
}캡처 금지
정적 로컬 함수는 이를 포함하는 로컬을 사용할 수 없습니다. 필요한 모든 것을 매개 변수로 전달해야 하므로 입력이 명시적으로 드러납니다.
using System;
public class Program
{
public static void Main()
{
int factor = 3;
// factor must be passed in, not captured
static int Scale(int n, int f) => n * f;
Console.WriteLine(Scale(5, factor));
}
}숨겨진 할당 피하기
변수를 캡처하는 비정적 로컬 함수는 숨겨진 클로저 개체를 할당할 수 있습니다. 정적 로컬 함수는 절대 캡처하지 않으므로 이러한 할당을 완전히 피합니다.
using System;
public class Program
{
public static void Main()
{
// Pure helper, no closure object created
static bool IsEven(int n) => n % 2 == 0;
for (int i = 0; i < 5; i++)
Console.WriteLine(i + ": " + IsEven(i));
}
}의도를 스스로 설명하기
static 키워드는 도우미가 인수에만 의존한다는 것을 독자에게 알립니다. 이러한 보장 덕분에 함수를 더 쉽게 추론하고 테스트할 수 있습니다.
using System;
public class Program
{
public static void Main()
{
static int Clamp(int value, int lo, int hi)
=> value < lo ? lo : value > hi ? hi : value;
Console.WriteLine(Clamp(15, 0, 10));
Console.WriteLine(Clamp(-3, 0, 10));
}
}컴파일러가 캡처 금지를 적용합니다
정적 로컬 함수 안에서 이를 포함하는 로컬을 실수로 참조하면 컴파일러가 오류를 보고합니다. 따라서 의도하지 않은 종속성을 일찍 발견할 수 있습니다.
using System;
public class Program
{
public static void Main()
{
int seed = 7;
// Correct: seed is passed explicitly, not captured
static int Mix(int x, int s) => x * 31 + s;
Console.WriteLine(Mix(2, seed));
}
}정적 로컬 함수에서 재귀 사용하기
정적 로컬 함수에서도 재귀를 사용할 수 있습니다. 자기 자신을 호출하는 것은 변수를 캡처하는 것과 다르기 때문입니다.
using System;
public class Program
{
public static void Main()
{
static int Power(int baseN, int exp)
=> exp == 0 ? 1 : baseN * Power(baseN, exp - 1);
Console.WriteLine(Power(2, 10));
}
}out 매개 변수와 함께 사용하기
다른 메서드와 마찬가지로 정적 로컬 함수에서도 out 매개 변수를 사용할 수 있습니다. 캡처하지 않는 순수한 특성과 잘 어울리므로 TryParse 방식의 도우미를 만들 때 유용합니다.
using System;
public class Program
{
public static void Main()
{
static bool TryParsePositive(string s, out int value)
{
value = 0;
return int.TryParse(s, out value) && value > 0;
}
if (TryParsePositive("42", out int n))
Console.WriteLine("got " + n);
Console.WriteLine(TryParsePositive("-1", out _));
}
}정적 로컬 함수를 대리자로 전달하기
정적 로컬 함수는 아무것도 캡처하지 않으므로 클로저를 할당하지 않고 대리자로 변환할 수 있습니다. 이는 실행 빈도가 높은 경로에서 중요할 수 있습니다.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
static bool IsBig(int n) => n > 100;
var nums = new List<int> { 50, 150, 200, 10 };
Console.WriteLine(nums.Count(IsBig));
}
}static을 선호할 때
도우미에 이를 포함하는 상태가 필요하지 않다면 정적 로컬 함수를 우선 사용하십시오. 순수성을 문서화하고 실수로 캡처하는 것을 방지하며 더 효율적일 수 있습니다. 로컬을 실제로 클로저에 포함해야 할 때만 static을 제거하십시오.
using System;
public class Program
{
public static void Main()
{
static string Describe(int score)
{
if (score >= 90) return "A";
if (score >= 80) return "B";
return "C";
}
Console.WriteLine(Describe(95));
Console.WriteLine(Describe(82));
}
}직접 해 보기
순수한 정적 로컬 함수를 작성하고 LINQ의 조건자로 전달해 보십시오. 아무것도 캡처하지 않으므로 클로저 없이 대리자로 변환됩니다.
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
static bool IsLeapYear(int year)
=> (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
var years = new List<int> { 1900, 2000, 2004, 2021, 2024 };
Console.WriteLine(string.Join(", ", years.Where(IsLeapYear)));
}
}빠른 확인
static이 로컬 함수에 추가하는 기능을 떠올려 보십시오.
복습
static 로컬 함수는 아무것도 캡처하지 않습니다.
- 이를 포함하는 로컬이나
this를 사용할 수 없으므로 매개 변수를 통해 데이터를 전달해야 합니다. - 숨겨진 클로저 할당을 피합니다.
- 컴파일러가 캡처 금지 규칙을 적용하여 실수로 생긴 종속성을 발견합니다.
- 도우미에 이를 포함하는 상태가 필요하지 않을 때 우선 사용하십시오.
자주 묻는 질문
“정적 지역 함수” 강의는 무료인가요?
네 — “정적 지역 함수” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“정적 지역 함수”에서 뭘 배우나요?
명확성과 성능을 위해 캡처를 방지합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C# Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“정적 지역 함수” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 지역 함수 선언
- 클로저와 캡처된 변수
- 정적 지역 함수
- 지역 함수와 람다 비교