본문 바로가기
책/Effective C#

Effective C# - Item 29 컬렉션을 반환하기보다 이터레이터를 반환하는 것이 낫다

by 코딩하는 돼징 2024. 2. 2.
반응형

메서드를 작성하다 보면 단일의 객체를 반환하기보다 일련의 시퀀스를 반환해야 하는 경우가 종종 있다. 시퀀스를 반환하는 메서드를 작성해야 한다면 컬렉션을 반환하기보다는 이터레이터를 반환하는 것이 좋다.

 

01 컬렉션을 반환하는 메서드

public static List<int> GetEvenNumbers(int n)
{
    List<int> evenNumbers = new List<int>();
    for (int i = 1; i <= n; i++)
    {
        if (i % 2 == 0)
        {
            evenNumbers.Add(i);
        }
    }
    return evenNumbers;
}

02 이터레이터를 반환하는 메서드

이터레이터 메서드란 호출차가 요청한 시퀀스를 생성하기 위해서 yield return문을 사용하는 메서드를 말한다.

public static IEnumerable<int> GenerateEvenNumbers(int n)
{
    for (int i = 1; i <= n; i++)
    {
        if (i % 2 == 0)
        {
            yield return i;
        }
    }
}

Enmerable.Range()

숫자 시퀀스를 만들어내는 객체를 생성한다. 그러나 실제로 모든 정수를 생성하는 것이 아니라 필요한 정수가 요청될 때마다 그때그때 값을 생성하여 반환한다. 그러므로 방대한 결과를 저장하기 위한 공간이 필요하지 않다.

var allNumbers = Enumerable.Range(0,int.MaxValue);

이러한 방식은 메모리를 효율적으로 활용할 수 있다.


어떠한 경우에 이터레이터 메서드를 이용하여 시퀀스를 생성하는게 좋을까?

이러한 결정은 사용자가 결정하도록 남겨두는 것이 좋다.

하지만 시퀀스를 반환하는 메서드를 작성할 때 컬렉션 자체를 반환하기보다는 그 컬렉션에 접근할 수 있는 반복자를 반환하는 것이 좋다. 그렇게 생성된 객체는 실제 시퀀스에 대한 접근이 이루어지는 경우에만 사용되므로 오용을 방지하는데 도움이 된다. IEnumerable<T>와 같은 인터페이스를 반환하면 사용자는 필요에 따라 필요한 싲머에 값을 가져오거나 전체 시퀀스를 가져올 수 있다. 사용자는 ToList(), ToArray()등의 메서드를 사용하여 필요에 따라 컬렉션을 사용할 수 있다.

 

 

 

 

 

본 게시글은 Effective C#을 읽고 정리하였습니다.

 

 

 

 

반응형

댓글