0Pricing
C# Academy · 강의

정적 지역 함수

명확성과 성능을 위해 캡처를 방지합니다.

정적 지역 함수은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 지역 함수 선언
  2. 클로저와 캡처된 변수
  3. 정적 지역 함수
  4. 지역 함수와 람다 비교
← C# Academy(으)로 돌아가기