Workspace/C#

[C# 7] Tuple

Bombus 2023. 4. 6. 10:27

C# 7버젼대 부터 Tuple 형식으로 메서드 결과를 반환할 수 있다.

(int min, int max) FindMinMax(int[] input)
{
    if (input is null || input.Length == 0)
    {
        throw new ArgumentException("Cannot find minimum and maximum of a null or empty array.");
    }

    var min = int.MaxValue;
    var max = int.MinValue;
    foreach (var i in input)
    {
        if (i < min)
            min = i;        
        if (i > max)
            max = i;        
    }
    return (min, max);
}
 

 

메서드 반환뿐만 아니라 Linq, 쿼리, 제너릭에서도 모두 사용 가능하다.

특별히 이름을 지정해주지 않으면 필드는 Item1, Item2... 와 같이 네이밍된다.

이때 Tuple은 값형식이다.

| 필드 이름 지정

 

아래와 같이 튜플 초기화나 정의 부분에서 필드의 이름을 명시적으로 지정할 수 있다.

var t = (Sum: 4.5, Count: 3);
Console.WriteLine($"Sum of {t.Count} elements is {t.Sum}.");

(double Sum, int Count) d = (4.5, 3);
Console.WriteLine($"Sum of {d.Count} elements is {d.Sum}.");
 

| Tuple 참조형식과의 비교

 
 
구분
형식
변경가능 여부
데이터 멤버
System.ValueTuple
가능
필드
System.Tuple
참조
불가능
속성 (get)

 

| 무명형식과의 비교

 
 
이름
액세스 한정자
형식
커스텀 멤버 이름
분해 지원
식 트리 지원
무명 형식
internal
class
O
X
O
Tuple
public
class
X
X
O
Value Tuple
public
struct
O
O
X

Tuple 문서를 읽다가 무명 형식에 대해서도 보게 되었는데, 위 표를 보고 비교해서 알맞은 상황에 사용하면 될 것 같다.

 
// 간단한 사용법
var foo = new { Formatted = $"{date:MMM dd, yyyy hh:mm zzz}", date.Ticks };

// 컴파일러에서 아래와 같이 생성된다.
internal sealed class f__AnonymousType0
{
    public string Formatted { get; }
    public long Ticks { get; }

    public f__AnonymousType0(string formatted, long ticks)
    {
        Formatted = formatted;
        Ticks = ticks;
    }
}
 

 

| 마치며

 

Tuple로 인해 데이터 요소를 간결하게 구문화하는 것이 가능해졌다. Tuple은 단순히 그룹화 하는데 그치지 않고 할당 및 분해, 비교 연산자 등 다양한 기능을 제공하는데, 암시적으로 형변환되거나 컴파일러가 유추하는 부분이 많아서 유의해서 사용할 필요가 있다.

 

| 참고

 
반응형