본문 바로가기

C#

C# 튜플 (Tuple)과 분해

1. 개념 설명

튜플은 여러 값을 간단히 묶는 값 형식입니다. C# 7부터 도입된 ValueTuple과 요소 이름 지정으로 읽기 쉬운 코드를 작성합니다. 메서드에서 여러 값을 반환하거나, 반환값을 곧바로 분해해 지역 변수로 받을 수 있습니다. 또한 _ 버리기(discard)와 foreach 분해도 지원합니다.

2. 코드 예제

아래 예제는 생성, 메서드 반환, 분해, discard, foreach 분해를 모두 보여줍니다. 콘솔 출력으로 결과를 확인할 수 있습니다.

using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {        
        var point = (x: 3, y: 5);
        var (x, y) = point;
        Console.WriteLine($"point=({x},{y})");
        
        int[] nums = {1,2,3,4};
        var (sum, avg) = Stats(nums);
        Console.WriteLine($"sum={sum}, avg={avg:F1}");
        
        var (_, last) = SplitName("Ada Lovelace");
        Console.WriteLine($"last={last}");
        
        var people = new List<(int id, string name)>{ (1,"Neo"), (2,"Trinity") };
        foreach (var (id, name) in people)
            Console.WriteLine($"{id}:{name}");
    }
    
    static (int sum, double avg) Stats(int[] arr)
    {
        int s = 0;
        foreach (var n in arr) s += n;
        double a = arr.Length > 0 ? (double)s / arr.Length : 0;
        return (s, a);
    }
    
    static (string first, string last) SplitName(string full)
    {
        var parts = full.Split(' ', StringSplitOptions.RemoveEmptyEntries);
        if (parts.Length == 0) return ("", "");
        if (parts.Length == 1) return (full, "");
        return (parts[0], parts[parts.Length - 1]);    
    }
}

3. 주의사항/팁

튜플은 값 형식이라 복사가 발생할 수 있으니 큰 튜플을 반복 전달하는 것은 피하는 것이 좋습니다. 공개 API에 남발하기보다 의미가 중요한 경우 record/전용 struct를 고려합니다. C# 7+가 필요하며, 구버전 .NET Framework에서는 System.ValueTuple 패키지를 설치해야 합니다. 직렬화나 로깅에서 요소 이름이 보존되지 않을 수 있어 계약에는 주의합니다.

'C#' 카테고리의 다른 글

C# 람다 식 (Lambda Expression)  (1) 2026.04.09
C# using 문과 IDisposable  (0) 2026.04.08
C# IEnumerable vs IQueryable  (0) 2026.04.07
C# Span<T>과 Memory<T>  (0) 2026.04.07
C# Switch 표현식 (Switch Expression)  (0) 2026.04.07