`let` 절

let 절 (C# 참조)

쿼리 식을 쓰다 보면 중간 계산 결과를 잠시 저장해 두고 다음 절에서 다시 쓰고 싶은 순간이 있어요. let 키워드가 바로 그 역할을 합니다. let을 쓰면 새로운 범위 변수(range variable)를 하나 만들고, 그 변수를 어떤 식(expression)의 결과로 초기화할 수 있어요. 여기서 주의할 점 하나, 범위 변수는 값을 한 번 초기화하면 다른 값으로 바꿔 넣을 수 없어요. 다만 그 변수가 쿼리 가능한 타입(쿼리 가능한 형식)을 담고 있다면, 그 변수에 대해 다시 쿼리를 수행할 수 있다는 점도 기억해 주세요.

let 절은 C# 3.0에서 처음 소개되었어요. 아래 예시에서 let이 두 가지 방식으로 쓰이는 걸 볼 수 있어요.

출처: let clause - C# Reference

본문

let은 두 가지 일을 해 줍니다.

  1. 쿼리를 수행할 수 있는 열거 가능한(enumerable) 타입을 만듭니다.
  2. word라는 범위 변수에 ToLower를 딱 한 번만 호출할 수 있게 해 줍니다. let 없이 같은 일을 하려면 where 절의 조건마다 ToLower를 일일이 호출해야 해요.
namespace LetClause;

class LetSample1
{
    static void Main()
    {
        string[] strings =
        [
            "A penny saved is a penny earned.",
            "The early bird catches the worm.",
            "The pen is mightier than the sword."
        ];

        // Split the sentence into an array of words
        // and select those whose first letter is a vowel.
        var earlyBirdQuery =
            from sentence in strings
            let words = sentence.Split(' ')
            from word in words
            let w = word.ToLower()
            where w[0] == 'a' || w[0] == 'e'
                || w[0] == 'i' || w[0] == 'o'
                || w[0] == 'u'
            select word;

        // Execute the query.
        foreach (var v in earlyBirdQuery)
        {
            Console.WriteLine($"\"{v}\" starts with a vowel");
        }
    }
}
/* Output:
    "A" starts with a vowel
    "is" starts with a vowel
    "a" starts with a vowel
    "earned." starts with a vowel
    "early" starts with a vowel
    "is" starts with a vowel
*/

쿼리 흐름을 천천히 따라가 볼게요. 먼저 let words = sentence.Split(' ')에서 각 문장을 단어 배열로 쪼개 저장해 두고, 그 뒤의 from word in words에서 그 배열을 다시 순회해요. 그리고 let w = word.ToLower()로 단어를 소문자로 바꾼 값을 w에 저장하죠. 마지막 where 절이 이 w의 첫 글자를 검사해 모음으로 시작하는 단어만 골라냅니다. 덕분에 ToLower는 단어마다 한 번씩만 호출되죠. let이 없었다면 이런 중간 값을 따로 저장할 곳이 없어서, 조건을 확인할 때마다 매번 다시 계산해야 했을 거예요.

더 알아보기