Microsoft MVP성태의 닷넷 이야기
yield return의 리턴 타입 질문 드립니다. [링크 복사], [링크+제목 복사],
조회: 15931
글쓴 사람
rysoo
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

안녕하세요 yield 키워드 공부 중에 이해가 잘 안 되는 부분이 있어 질문 드립니다.


yield return을 사용하는 함수의 리턴 타입이 IEnumerable일 때가 있고, IEnumerator일 때가 있던데 두가지 차이가 정확히 이해가 잘 안 됩니다. ㅠㅠ


단순히 foreach 구문의 in 뒤에 나오는 IEnumerable 객체를 클래스의 함수로 부르고 싶을 때, yield return이 사용되는 IEnumerbale 반환 함수를 만들면 되고,


클래스 자체에 IEnumerable을 상속 받아 GetEnumerator 함수를 구현하고자 할 때, IEnumerator를 반환하는 GetEnumerator 함수를 만들면 되는걸까요?


두가지 구현 방식의 차이점이 어떤 건지 궁금합니다.


[연관 글]






[최초 등록일: ]
[최종 수정일: 5/8/2019]


비밀번호

댓글 작성자
 



2019-05-08 12시54분
코드와 함께 질문해 주세요.
정성태
2019-05-08 03시10분
[rysoo] using System;
using System.Collections;
using System.Collections.Generic;

public class NameSet
{
    private List<string> names = new List<string>();

    public NameSet(params string[] values)
    {
        foreach (var e in values)
            this.names.Add(e);
    }

    public IEnumerable NameList()
    {
        int currentIndex = 0;

        while (currentIndex < names.Count)
        {
            yield return names[currentIndex];
            currentIndex++;
        }
    }
}

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var names = new NameSet("abc", "def", "ghi");

            foreach (var e in names.NameList())
                Console.WriteLine(e);
                
        }
    }
}


위 코드를 아래와 같이 바꿔도 동일한 결과가 나오는데 두 가지 차이가 궁금합니다.


public class NameSet : IEnumerable
{
    private List<string> names = new List<string>();

    public NameSet(params string[] values)
    {
        foreach (var e in values)
            this.names.Add(e);
    }

    public IEnumerator GetEnumerator()
    {
        int currentIndex = 0;

        while (currentIndex < names.Count)
        {
            yield return names[currentIndex];
            currentIndex++;
        }
    }
}

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var names = new NameSet("abc", "def", "ghi");

            foreach (var e in names)
                Console.WriteLine(e);
                
        }
    }
}

yield도 결국 간편 표기법이라고 하셨는데, 컴파일러가 위 두 코드를 동일하게 치환해서 처리를 하는 걸까요?
[guest]
2019-05-08 07시35분
다음의 글을 참조하시고,

C# - yield 문을 사용할 수 있는 메서드의 조건
; http://www.sysnet.pe.kr/2/0/11887

혹시 설명이 덜 되었다면 그 부분을 다시 질문해주세요. 그에 따라 부가 설명을 추가하겠습니다.
정성태
2019-05-08 11시45분
[rysoo] 많은 도움 되었습니다~~. 답변 감사합니다.
[guest]

... [91]  92  93  94  95  96  97 
NoWriterDateCnt.TitleFile(s)
183정성태5/9/20059467    답변글 [답변]: // 꼭쫌 답변해 주세요~~~클라이언트 서버 ... 내용, 이점 들...
180최성우5/7/20059912[Q] POST 형식의 데이터 훅킹?
182정성태5/9/200510572    답변글 [답변]: [Q] POST 형식의 데이터 훅킹?
190최성우5/10/20059586        답변글 [답변]: [답변]: [Q] POST 형식의 데이터 훅킹?
177최정희5/4/200510116네트워크 케이블의 연결상태
178정성태5/4/200510223    답변글 [답변]: 네트워크 케이블의 연결상태 [1]
188최정희5/10/20059695        답변글 [답변]: [답변]: 네트워크 케이블의 연결상태
189정성태5/10/20059888            답변글 [답변]: [답변]: [답변]: 네트워크 케이블의 연결상태 [2]
191최정희5/11/20059550                답변글 [답변]: [답변]: [답변]: [답변]: 네트워크 케이블의 연결상태 [1]
175안연준5/3/20059932IE 제어에 대한 궁금 증 ㅡ,.ㅡ;;
179정성태5/4/200510583    답변글 [답변]: IE 제어에 대한 궁금 증 ㅡ,.ㅡ;;
168안연준5/2/20059961[Database] Connection Error파일 다운로드1
169정성태5/2/200510126    답변글 [답변]: [Database] Connection Error
170안연준5/2/20059672        답변글 [답변]: [답변]: 계속 에러가 똑같애요
171정성태5/2/200510399            답변글 [답변]: [답변]: [답변]: 계속 에러가 똑같애요
172안연준5/2/200510165                답변글 [답변]: [답변]: [답변]: [답변]: 계속 에러가 똑같애요파일 다운로드1
173정성태5/2/20059914                    답변글 [답변]: [답변]: [답변]: [답변]: [답변]: 계속 에러가 똑같애요
174안연준5/3/20059879                        답변글 [답변]: [답변]: [답변]: [답변]: [답변]: [답변]: 계속 에러가 똑같애요
165장희석4/22/200510495[질문]ASP에서 ATL 서버 컴퍼넌트로 바이너리 데이타 전달하기
167정성태4/29/200510334    답변글 [답변]: [질문]ASP에서 ATL 서버 컴퍼넌트로 바이너리 데이타 전달하기
160카심4/21/20059922Internet Explorer 에서의 닷넷 Smart Client 개발
163정성태4/22/20059863    답변글 [답변]: Internet Explorer 에서의 닷넷 Smart Client 개발
159신대철4/21/20059640자동 로긴 프로그램
162정성태4/22/20059630    답변글 [답변]: 자동 로긴 프로그램
166신대철4/22/20059328        답변글 [답변]: [답변]: 자동 로긴 프로그램파일 다운로드1
157이용휘4/20/20059325w3ip를 통해서 윈도우 미디어 화을을 올려놓을 서버..
... [91]  92  93  94  95  96  97