C# Tuple 의 극한 활용

소개

C# Tuple(튜플)은 많이 사용하는 기능은 아닙니다. 그러나 최신 C# 릴리스에서 튜플은 주목할 만한 업그레이드를 받았으며 개발자들에게 더많이 사용 될 수 있습니다.

튜플이란?

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/value-tuples

MSDN 설명에 따르면 튜플은 특정 수와 요소 시퀀스가 있는 데이터 구조입니다. 변수를 모아놓은 클래스와 뭐가 다르냐? 하시겠죠? 맞습니다. 좀더 쉽게 설명드리면

“프로퍼티가 없는 클래스나 어떤 종류의 동작을 구현하기 위해 클래스를 만드는 것이 귀찮다면 이 튜플을 사용 하시면 됩니다. “

예를 들어, 도시/주 조합을 저장하는 클래스를 만들고 싶다고 가정해 봅시다.

코드 예시

public class Location
{
    // 도시와 주 정보를 저장하기 위한 프로퍼티
    public string City { get; set; }
    public string State { get; set; }
    // 도시와 주를 초기화하기 위한 생성자
    public Location(string city, state)
    {
        City = city;
        State = state;
    }
}
// 예제 사용법
var location = new Location("수원", "LA");
// Location 클래스의 프로퍼티를 사용하여 주소 출력
var address = $"{location.City}, {location.State}";
// 또 다른 방법으로 Tuple을 사용하여 간결한 표현 가능
var locationTuple = new Tuple<string, string>("수원", "LA");
// Tuple의 Item1 및 Item2 프로퍼티를 사용하여 주소 출력
var addressTuple = $"{locationTuple.Item1}, {locationTuple.Item2}";

그래서 Tuple 객체는 간편하고 빠르게 의미를 전달하는데 굉장히 유용할 수 있습니다.
위 보기처럼 Class 를 만들고 인자를 전달하고 복잡하지 않습니까?. 소스도 복잡해 지고요.
그럴때 Tuple 을 사용 하면 아주 빠르고 쉽게 개발 할 수 있습니다.

C# 7.0에서 튜플이 어떻게 변했나요?

C# 7.0은 여러 개의 반환 값에 대한 요청을 길게 풀어서 알기 쉽게 리턴합니다.
그렇습니다. 이제 클래스를 작성하거나 Tuple을 사용하거나 ref 또는 out 매개변수의 일련의 코드를 작성하지 않고도 다음과 같은 코드를 작성할 수 있습니다.

코드 예시

public (string city, string state) GetCityAndState()
{
    // 도시와 주 정보를 나타내는 튜플 반환
    return ("수원", "경기도");
}

이를 통해 하나의 메서드를 호출하고 아래에서 정의한 이름으로 각 반환 값을 액세스할 수 있게 됩니다.

코드 예시

public (string city, string state) GetCityAndState()
{
    // 도시와 주 정보를 나타내는 튜플 반환
    return ("수원", "경기도");
}

이러한 여러 개의 반환 값 메서드의 결과는 필요에 따라 다양한 방식으로 분해할 수 있습니다.

코드 예시

// 함수에서 값을 가져오기 위해 튜플 분해 사용
(string city, string state) = GetCityAndState();
// 튜플 분해에서 형식 추론을 위해 var 사용
(var city, var state) = GetCityAndState();
// 튜플 분해에서 여러 변수에 대한 단일 var 선언 사용
var (city, state) = GetCityAndState();
// 튜플 분해에서 기존 변수 사용
(city, state) = GetCityAndState();

초기화도 대체로 유사한 문법적 접근을 취합니다.

코드 예시

// 위치 정보 (도시, 주)를 나타내는 튜플 생성
var location = ("수원", "경기도");

이 기능은 Python, Scala, Ruby, Go 등 몇몇 인기 있는 프로그래밍 언어에서 이미 오랫동안 사용되고 있는 기능이므로 C#에서도 그 기능을 통합하였습니다

멋진데요. 그 외에 무엇이 있을까요?

제공된 간단한 예제 외에도 이러한 새로운 ValueTuple 객체는 반환 형식의 서명과 일치하도록 형식 추론과 같은 요소를 사용할 수 있습니다. 다음 예제와 같이 기본값으로 초기화된 도시와 인구 정보를 저장하기 위한 튜플을 만들어, 특정 주에서 가장 큰 도시를 검색하는 방법을 보여줍니다.

코드 예시

public (string city, int population) FindBiggestCityWithPopulation(string state)
{
    // 기본값으로 초기화된 도시와 인구 정보를 저장하기 위한 튜플 생성
    var result = (city: "", population: 0);
    // _someService를 사용하여 지정된 주에서 가장 큰 도시 검색
    result.city = _someService.GetBiggestCity(state);
    // 검색된 도시의 인구 얻기
    result.population = _someService.GetPopulation(result.city);
    // 도시와 인구 정보를 포함하는 튜플 반환
    return result;
}

또한 이러한 새로운 튜플은 기본적으로 async/await 패턴을 지원합니다.

코드 예시

public async Task<(string bird, string flower)> GetStateBirdAndFlowerAsync(string state)
{
    // _someService를 사용하여 상태 새와 꽃을 비동기로 검색
    var bird = await _someService.GetStateBirdAsync(state);
    var flower = await _someService.GetStateFlower(state);
    // 상태 새와 꽃 정보를 포함하는 튜플 반환
    return (bird, flower);
}

이것이 어떻게 가능해졌나요?

“새로운” Microsoft 개발 생태계의 멋진 점 중 하나는 중요한 개발 결정이 MS 독단 선택이 아니라 GitHub의 투명한 이슈에서 이루어진다는 것입니다.

이렇듯 C# 튜플은 다양한 상황에서 유용하게 활용될 수 있으며, 다른 언어에서 오랫동안 사용되던 기능을 효과적으로 통합하였습니다. 이를 통해 코드 작성이 간편해지고 가독성이 향상되며, 더 나은 프로그래밍 경험을 제공합니다.

Leave a Comment