C#
최신 C# 기능
C# 11
C# 11 새기능
C# 11: Raw String Literal
C# 11: 문자열 내삽 복수라인
C# 11: u8 접미어
C# 11: Generic Math 지원
C# 11: Generic Attribute
C# 11: 리스트 패턴
C# 11: 파일 로컬 타입
C# 11: required modifier
C# 11: Auto-default struct
C# 11: ReadOnlySpan 패턴 매칭
C# 11: 확장된 nameof 범위
C# 11: nint, nuint
C# 11: ref 필드
C# 11: 소문자 타입명 경고
C# 11: 향상된 method group 변환
C# 10
VS 2022 설치
C# 10 global using
C# 10 File-scoped Namespace
C# 10 향상된 문자열 내삽
C# 10 향상된 람다식 유추
C# 10 struct 기능 향상
C# 10 record struct
C# 10 확장된 속성패턴
C# 10 향상된 명료한 할당
C# 10 Destructor 기능 개선
C# 9.0
C# 9 레코드 타입
C# 9 init accessor
C# 9 최상위 프로그램
C# 9 향상된 패턴 매칭
C# 9 향상된 Target Typing
C# 9 공변 리턴 타입
C# 9 Native Int 타입
C# 8.0
C# 8 디폴트 인터페이스 멤버
C# 8 패턴 매칭
C# 8 Nullable Reference Type
C# 8 인덱싱과 슬라이싱
C# 8 비동기 스트림
C# 8 using 선언
C# 8 널 병합 할당자
C# 8 구조체 읽기 전용 멤버
C# 8 기타 기능들
C# 7.0
C# 7.0 새기능
C# 7.0 패턴 매칭
C# 7.0 튜플
C# 7.0 로컬 함수
C# 7.0 out 파라미터
C# 7.0 리터럴 표현
C# 7.0 Deconstructor
C# 7.0 ref return
C# 7.0 async 리턴타입
C# 7.0 Expression-bodied
C# 7.0 throw expression
C# 6.0
C# 6.0 새기능
C# 6.0 널 조건 연산자
C# 6.0 문자열 내삽
C# 6.0 Dictionary초기자
C# 6.0 nameof 연산자
C# 6.0 using static문
C# 6.0 catch블럭 await
C# 6.0 Exception 필터
C# 6.0 자동 속성 초기자
C# 6.0 읽기전용 자동 속성
C# 6.0 Expression-bodied

C#으로 이해하는 자료구조
C# 프로그래밍 기초 실습 전자책
C# 7 로컬 함수 (Local Function)

C# 7에서는 메서드 안에 그 메서드에서만 사용하는 로컬 함수를 작성할 수 있다. 로컬함수는 자신의 메서드 이외에서 호출할 수 없으며, 하나의 메서드 안에는 여러 개의 로컬 함수들을 만들 수 있다.

로컬 함수는 - 클로져(Closure) 기능을 사용할 수 있어서 - 자신을 정의한 메서드의 변수들을 로컬 함수에서 사용할 수 있다. 예를 들어, 아래 예제에서 factor 라는 메서드 로컬변수를 MyFormula() 라는 로컬함수 안에서 사용하였다.


예제

private int MyCalc(int a, int b, int c)
{
    int factor = 10;
    int ab = MyFormula(a, b);
    int ac = MyFormula(a, c);
    return Math.Max(ab, ac);

    // 로컬 함수
    int MyFormula(int x, int y)
    {
        int res = 2 * x + 7 * y - 5;
        return res % factor; // factor 변수를 사용
    }
}



로컬 함수의 특성

로컬함수는 컴파일러가 다른 메서드와 동일하게 "메서드" 형태로 취급하는데, 이는 컴파일러가 람다식처럼 컴파일시 익명 타입을 자동으로 생성하는 등의 일을 하지 않는다는 것을 의미한다.

로컬함수는 특히 메서드 내에서만 사용해야 하는 함수가 필요할 때 유용하다. 예를 들어, 아래 예제에서 로컬함수 NumberIterator()는 GetNumbers()라는 메서드 내에서만 사용하도록 설계되었다. GetNumbers()는 입력파라미터가 타당한 지 검사한 후 NumberIterator()를 호출하게 되어 있으며, 로컬함수 안에서는 filter 라는 델리게이트가 이미 있음을 가정하고 있다. 만약 이런 종류의 함수를 로컬함수로 쓰지 않고 일반 메서드로 작성한다면, 클래스의 다른 메서드들이 잘못 호출할 가능성도 있을 것이다.


예제

private IEnumerable<int> GetNumbers(int count, Func<int, bool> filter)
{
    if (count < 1) throw new ArgumentException();
    if (filter == null) throw new ArgumentException();

    return NumberIterator();

    // 로컬함수
    IEnumerable<int> NumberIterator()
    {
        for (int i = 0; i < count; i++)
        {
            if (filter(i))  // 메서드의 filter 파라미터 사용
            {
               yield return i;
            }
        }
    }
}

// 사용
private void Run()
{
    foreach (var item in GetNumbers(100, n => n % 2 == 0))
    {
        WriteLine(item);
    }
}



본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.