11.6.2 지역 변수
튜플은 메서드가 out 매개변수나 반환 타입을 따로 작성하여 사용하지 않고도 여러 개의 값을 단번에 반환하도록 하는 것이 주요 목적이었다. 하지만 그렇다고 해서 반드시 이 용도로만 튜플을 사용할 필요는 없다.
단일 메서드 내에서 여러 변수를 튜플로 묶어 사용하는 경우도 드물지 않다. 특히, 여러 변수가 동일한 접두사를 공유한다면 튜플을 사용하는 것을 고려해 볼 수 있다. 예를 들어 예제 11-11에는 게임을 개발할 때 사용했을 법한 메서드가 있는데, 이 메서드는 특정 날짜에 최고 점수를 획득한 플레이어를 출력하는 메서드다. LINQ to Object에는 이미 Max 메서드가 있기 때문에 프로젝션 시 손쉽게 최고 점수를 얻을 수 있지만, 시퀀스 내에서 해당 점수를 가진 요소 자체를 가져올 방법은 없다.
Note ≡
다른 방법으로 OrderByDescending(...).FirstOrDefault()를 호출하는 방법도 있다. 하지만 값 하나를 얻기 위해 전체를 정렬해야 한다. MoreLinq 패키지를 사용하면 MaxBy 메서드를 이용해서 부족한 부분을 해소할 수 있다. 다른 대안으로 highestGame 변수와 비교 시 사용한 Score 속성을 각기 다른 변수에 담는 방법도 있다. 다만 좀 더 복잡하면 적합하지 않을 수 있다.
예제 11-11 날짜별 최고 점수를 출력 ▶ HighScoreDisplayWithoutTuples.cs
public void DisplayHighScoreForDate(LocalDate date)
{
var filteredGames = allGames.Where(game => game.Date == date);
string highestPlayer = null;
int highestScore = -1;
foreach (var game in filteredGames)
{
if (game.Score > highestScore)
{
highestPlayer = game.PlayerName;
highestScore = game.Score;
}
}
Console.WriteLine(highestPlayer == null
? "No games played"
: $"Highest score was {highestScore} by {highestPlayer}");
}