[C#] yield 키워드(foreach 조건 구현하기)

[원본 링크]

어떤 데이터모음을 전부 확인하거나 변경할때 foreach만큼 이쁜것이 없다.

근데 foreach의 기준 객체로 들어가는 조건은 무엇일까

바로 인터페이스다.

foreach는 뭐 대단한게 아니라 그냥 문법적 설탕일 뿐이다.

foreach에 들어가는 타입은 IEnumerable 인터페이스의 구현을 요구한다.
그럼 foreach에서는 IEnumerable에 의해 구현되는 메서드인 GetEnumerator라는 메서드를 호출해서 쓴다.
근데 GetEnumerator는 무엇을 반환할까? 실질적으로 반복을 수행하는 IEnumerator를 또 직접 구현해서 내놔야 한다. 이 IEnumerator는 또 3개의 메서드를 구현하라고 윽박지르는데 그냥 레퍼런스 보세요
https://msdn.microsoft.com/ko-kr/library/system.collections.ienumerable(v=vs.110).aspx
IEnumerable 인터페이스 (System.Collections)이 문서는 기계 번역을 이용하여 번역되었습니다. 문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다. 번역 영문 IEnumerable 인터페이스 .NET Framework (current version) 다른 버전 Visual Studio 2010 .NET Framework 4 Silverlight .NET Framework 3.5 Visual Studio 2008 .NET Framework 2.0 게시 날짜: 2016년 11월 제네릭이 아닌 컬렉션...msdn.microsoft.com https://msdn.microsoft.com/ko-kr/library/system.collections.ienumerator(v=vs.110).aspxIEnumerator 인터페이스 (System.Collections)이 문서는 기계 번역을 이용하여 번역되었습니다. 문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다. 번역 영문 IEnumerator 인터페이스 .NET Framework (current version) 다른 버전 Visual Studio 2010 .NET Framework 4 Silverlight .NET Framework 3.5 Visual Studio 2008 .NET Framework 2.0 게시 날짜: 2016년 11월 제네릭이 아닌 컬렉션...msdn.microsoft.com

여튼 저 요구사항대로 커스텀 배열타입을 만들고 거기에 저 조건들을 맞춰보면 이렇게 된다. 친절하게 주석을 달아놨으니 천천히 뜯어보면 보일 것이다. 아마도.

그럼 이제 yiled를 써보자허벌나게 짧아졌다. 무엇보다 내부클래스 정의가 사라졌다.
yield return 은 값을 반환하는데 return처럼 구역을 빠져나가는게 아니고 다시 돌아온다. 그리고 반복을 계속한다.그리고 yield break가 진짜 return의 역할을 한다. 진짜 끝내는 거다.
yield 저 두놈으로 짠 코드는 컴파일러가 알아서 IEnumerator이나 IEnumerable 객체의 로직으로 탈바꿈시켜준다. 물론 소속 메서드의 리턴타입도 저 둘중 하나여야 한다.
대강만 썼는데 더 깊이있고 신뢰도 있는 지식을 원한다면 https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/keywords/yield image yield(C# 참조)yield(C# 참조) 읽는 데 6분 참가자 문에 yield 키워드를 사용하는 경우 해당 메서드, 연산자, 또는 이 키워드가 나타나는 get 접근자가 반복기임을 나타냅니다. yield 를 사용하여 반복기를 정의할 경우 사용자 지정 컬렉션 형식에 IEnumerator 및 IEnumerable 패턴을 구현하면 명시적 추가 클래스(열거형의 상태를 보관하는 클래스, 예제는 IEnumerator 참조)를 사용하지 않아도 됩니다. 다음 예제에서는 두 가지 형태의 yield 문을 보여줍니다. yield return ;...docs.microsoft.com

image yield(C# 참조)yield(C# 참조) 읽는 데 6분 참가자 문에 yield 키워드를 사용하는 경우 해당 메서드, 연산자, 또는 이 키워드가 나타나는 get 접근자가 반복기임을 나타냅니다. yield 를 사용하여 반복기를 정의할 경우 사용자 지정 컬렉션 형식에 IEnumerator 및 IEnumerable 패턴을 구현하면 명시적 추가 클래스(열거형의 상태를 보관하는 클래스, 예제는 IEnumerator 참조)를 사용하지 않아도 됩니다. 다음 예제에서는 두 가지 형태의 yield 문을 보여줍니다. yield return ;...docs.microsoft.com