0Pricing
C# Academy · 강의

지연 평가 의미

반복자의 실행이 지연되는 방식을 이해합니다.

지연 평가 의미은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

지연 실행

반복자와 LINQ query는 지연 실행을 사용합니다. query를 정의하는 것만으로는 거의 아무 작업도 수행되지 않습니다. 실제로 결과를 항목별로 열거할 때만 작업이 실행됩니다.

열거할 때까지 아무것도 실행되지 않음

반복자 메서드를 호출해도 본문은 실행되지 않습니다. foreach(또는 다른 소비자)가 첫 번째 값을 요청할 때만 본문 실행이 시작됩니다.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Numbers()
    {
        Console.WriteLine("-- iterator body started --");
        yield return 1;
        yield return 2;
    }

    public static void Main()
    {
        var seq = Numbers();
        Console.WriteLine("query created, body not run yet");
        foreach (var n in seq) Console.WriteLine(n);
    }
}

값은 한 번에 하나씩 생성됨

각 반복에서는 다음 값을 생성하는 데 필요한 만큼만 반복자가 실행됩니다. 이 가져오기 기반 모델은 매우 큰 시퀀스에서도 메모리 사용량을 낮게 유지합니다.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Trace()
    {
        for (int i = 1; i <= 3; i++)
        {
            Console.WriteLine("producing " + i);
            yield return i;
        }
    }

    public static void Main()
    {
        foreach (var n in Trace())
            Console.WriteLine("consumed " + n);
    }
}

다시 열거하면 다시 실행됨

지연된 시퀀스에는 캐시된 결과가 없습니다. 이를 두 번 열거하면 반복자가 두 번 실행되므로 source가 변경되거나 작업 비용이 큰 경우에 중요합니다.

using System;
using System.Collections.Generic;

public class Program
{
    static int _calls = 0;
    static IEnumerable<int> Counter()
    {
        _calls++;
        yield return _calls;
    }

    public static void Main()
    {
        var seq = Counter();
        foreach (var n in seq) Console.WriteLine(n);
        foreach (var n in seq) Console.WriteLine(n);
        Console.WriteLine("total runs: " + _calls);
    }
}

현재 상태 읽기

실행이 지연되므로 반복자는 정의 시점이 아니라 열거 시점에 source를 읽습니다. query를 정의한 후 변경한 내용도 결과에 반영됩니다.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var list = new List<int> { 1, 2 };
        IEnumerable<int> doubled = Double(list);
        list.Add(3); // added before enumeration
        foreach (var n in doubled) Console.WriteLine(n);
    }

    static IEnumerable<int> Double(IEnumerable<int> nums)
    {
        foreach (var n in nums) yield return n * 2;
    }
}

즉시 실행 강제하기

결과의 스냅샷을 만들려면 ToList() 또는 ToArray()로 시퀀스를 구체화하십시오. 그러면 반복자가 한 번 실행되고 값이 저장되어 이후 source 변경과 분리됩니다.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var list = new List<int> { 1, 2 };
        List<int> snapshot = Double(list).ToList(); // executed now
        list.Add(99);
        Console.WriteLine(string.Join(",", snapshot));
    }

    static IEnumerable<int> Double(IEnumerable<int> nums)
    {
        foreach (var n in nums) yield return n * 2;
    }
}

단락 평가로 작업 줄이기

소비자가 값을 지연 방식으로 가져오므로 첫 번째 일치 항목을 찾는 작업은 일찍 중지할 수 있습니다. 생성자는 요청되지 않은 값을 계산하지 않습니다.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    static IEnumerable<int> Numbers()
    {
        for (int i = 1; ; i++)
        {
            Console.WriteLine("checking " + i);
            yield return i;
        }
    }

    public static void Main()
    {
        int firstBig = Numbers().First(n => n > 3);
        Console.WriteLine("found " + firstBig);
    }
}

지연되는 예외

반복자 내부의 예외는 메서드를 호출할 때 발생하지 않고, 열거가 오류가 발생하는 줄에 도달할 때 발생합니다. 처음부터 검증이 수행될 것으로 예상했다면 당황할 수 있습니다.

using System;
using System.Collections.Generic;

public class Program
{
    static IEnumerable<int> Risky(int divisor)
    {
        yield return 10 / divisor; // throws only during enumeration
    }

    public static void Main()
    {
        var seq = Risky(0);
        Console.WriteLine("no error yet");
        try { foreach (var n in seq) Console.WriteLine(n); }
        catch (DivideByZeroException) { Console.WriteLine("caught during enumeration"); }
    }
}

지연 처리 흐름은 효율적으로 조합됨

지연 연산자를 연결해도 연산자가 반복해서 실행되지는 않습니다. 각 값은 요청될 때 전체 처리 흐름을 한 번 통과하므로 효율적이고 메모리 사용도 적습니다.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var result = Enumerable.Range(1, 1000000)
            .Where(n => n % 2 == 0)
            .Select(n => n * n)
            .Take(3);
        foreach (var n in result) Console.WriteLine(n);
    }
}

구체화할 시점

여러 번 열거할 예정이거나, source가 변경될 수 있거나, 리소스를 해제하기 전에 결과를 캡처해야 할 때 구체화하십시오. 그 외에는 메모리와 작업량을 줄이기 위해 지연 방식을 유지하십시오.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var evens = Enumerable.Range(1, 10).Where(n => n % 2 == 0).ToList();
        // Safe to enumerate many times now
        Console.WriteLine("count: " + evens.Count);
        Console.WriteLine("sum: " + evens.Sum());
    }
}

직접 해 보기

지연 실행을 직접 관찰해 보십시오. query를 정의하고 source를 변경한 다음, 열거할 때가 되어서야 변경 내용이 결과에 나타납니다.

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var source = new List<int> { 1, 2, 3 };
        var query = source.Where(n => n > 1); // not executed yet
        source.Add(10);
        source.Remove(2);
        // Executes now, reflecting all changes
        Console.WriteLine(string.Join(", ", query));
    }
}

빠른 확인

지연 실행에 대해 추론해 보십시오.

정리

지연 평가는 시퀀스를 열거할 때만 실행합니다.

  • query를 정의하는 것만으로는 작업이 수행되지 않으며, 소비할 때 작업이 수행됩니다.
  • 다시 열거하면 반복자가 다시 실행됩니다.
  • source는 열거할 때 읽히므로 이후 변경 내용이 반영됩니다.
  • 예외는 열거 중에 발생합니다.
  • 필요할 때 ToList()/ToArray()를 사용하여 구체화하십시오.

자주 묻는 질문

“지연 평가 의미” 강의는 무료인가요?

네 — “지연 평가 의미” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 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. yield return을 사용하는 반복자 메서드
  2. yield break와 조기 종료
  3. 지연 평가 의미
  4. 사용자 지정 열거 가능 형식
← C# Academy(으)로 돌아가기