`let` 절
let 절 (C# 참조)
쿼리 식을 쓰다 보면 중간 계산 결과를 잠시 저장해 두고 다음 절에서 다시 쓰고 싶은 순간이 있어요. let 키워드가 바로 그 역할을 합니다. let을 쓰면 새로운 범위 변수(range variable)를 하나 만들고, 그 변수를 어떤 식(expression)의 결과로 초기화할 수 있어요. 여기서 주의할 점 하나, 범위 변수는 값을 한 번 초기화하면 다른 값으로 바꿔 넣을 수 없어요. 다만 그 변수가 쿼리 가능한 타입(쿼리 가능한 형식)을 담고 있다면, 그 변수에 대해 다시 쿼리를 수행할 수 있다는 점도 기억해 주세요.
let 절은 C# 3.0에서 처음 소개되었어요. 아래 예시에서 let이 두 가지 방식으로 쓰이는 걸 볼 수 있어요.
본문
let은 두 가지 일을 해 줍니다.
- 쿼리를 수행할 수 있는 열거 가능한(enumerable) 타입을 만듭니다.
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이 없었다면 이런 중간 값을 따로 저장할 곳이 없어서, 조건을 확인할 때마다 매번 다시 계산해야 했을 거예요.