방프리

21.04.03 Chapter4. LINQ 활용 (Item 30) 본문

C#/Effective C#

21.04.03 Chapter4. LINQ 활용 (Item 30)

방프리 2021. 4. 3. 15:41

Item 30 : 루프보다 쿼리 구문이 낫다

 

 C# 3.0 버전부터 추가된 LinQ는 굉장히 활용범위가 넓다. 특히 예외처리나 조건처리에 관련된 코드들을 쿼리문 형태로

개발자가 사용하거나 추후 유지보수를 진행할 때 가독성을 올려주는 긍정적인 효과를 보여주었다.

반복문에서도 굉장히 가독성을 올려주는 효과가 있는데 중첩 반복문이나 조건처리에 있어서 효과가 굉장히 크다.

private static IEnumerable<Tuple<int, int>> ProduceIndices()
{
   var storage = new List<Tuple<int, int>>();

    for (int x = 0; x < 100; x++)
    {
    	for(int y = 0; y < 100; y++)
        {
        	if (x + y < 100)
            	storage.Add(Tuple.Create(x, y));
        }
    }

    storage.Sort((point1, point2) =>
    	(point2.Item1 * point2.Item1 + point2.Item2 * point2.Item2).CompareTo(
         point1.Item1 * point1.Item1 + point1.Item2 * point1.Item2));
    return storage;
}

명령어 형태의 조건문 코드를 작성한다면 잠깐 봐서는 이게 정확히 어떤 코드이고, 어떻게 동작하는지 분석할 수 없다.

private static IEnumerable<Tuple<int, int>> QueryIndices()
{
	return result = from x in Enumerable.Range(0, 100)
                  	from y in Enumerable.Range(0, 100)
                  	where x + y < 100
                  	orderby (x * x + y * y) descending
                  	select Tuple.Create(x, y);
}

LinQ를 사용하여 쿼리문 형태로 작성한다면 가독성이 훨씬 올라가게 된다.

하지만 최적화를 중시하는 곳에서는 쿼리문 사용을 지양한다고 한다. 이유인 즉슨 일반 반복문 코드에 비해 속도가 

떨어진다고 한다. 게임 회사에서도 LinQ를 이용한 에셋 (대표적으로 UniRX)이 있긴 하지만 최적화가 극도로 올라가는 

게임에서는 그다지 사용되는 것 같진 않다. 

문득 호기심이 생겨 위의 코드들의 실행타임을 체크해보았는데

반복문 코드가 더 오래걸렸다.......

그냥 상황에 맞추어 사용하면 될 것 같다. (적용 전에 Unit 테스트 돌려보자)

Comments