프로그래밍 언어 공부/C#

튜플 (Tuple)

CalebHong 2022. 7. 30. 22:09

튜플(Tuple)

- C# 7.0 이상에서 사용 가능한 간단한 데이터 구조

- 여러 데이터 요소를 그룹화하는 간결한 구문

 

초기화 방법

(다수의 자료) 변수명 = (자료형의 값);

// 매개변수 이름 지정하지 않고 초기화
(double, int) t1 = (4.5, 3);
Console.WriteLine(t1.Item1 + ", " + t1.Item2);

// 매개변수 이름을 지정하여 초기화
(double Sum, int Count) t2 = (4.5, 3);
Console.WriteLine(t2.Sum + ", " + t2.Count);

// var 키워드를 사용하여 자료형 선언 생략
var fullHd = (1920, 1080);
Console.WriteLine(fullHd.Item1 + ", " + fullHd.Item2);

// var 키워드를 사용하지만 변수 이름을 지정하여 초기화
var vector3 = (x: 0f, y: 0f, z: 0f);
Console.WriteLine(vector3.x + ", " + vector3.y + ", " + vector3.z);

// 기존 변수를 사용하여 초기화
var name = "Caleb Hong";
var height = 177.2f;
var info = (name, height);
Console.WriteLine("이름: " + info.name + "키: " + info.height);

 

튜플 사용

- 일반적으로 사용하는 사례  중 하나는 메서드 반환 형식이다.

int[] arr = { 1, 8, 30, 24, 90 };
var minMax = FindMinMax(arr);
Console.WriteLine($"[{string.Join(", ", xs)}]의 값 중 최소값: {limits.min}, 최대값: {limits.max}");

// 배열을 받아 최소값과 최대값을 튜플로 반환하는 함수
(int min, int max) FindMinMax(int[] input)
{
    if (input is null || input.Length == 0)
    {
        throw new ArgumentException("배열이 비어있거나, 초기화되어 있지 않습니다.");
    }

    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);
}

 

튜플 할당 및 분해

- 튜플은 아래 두 조건을 모두 충족한다면 튜플 간 할당이 가능

 * 두 튜플 형식의 요소 수가 동일함

 * 각 튜플 위치에서 오른쪽 튜플 요소의 형식이 해당하는 왼쪽 튜플 요소의 형식과 동일하거나 해당 형식으로 암시적으로 변환 가능함

(int, double) t1 = (17, 3.14);
(double First, double Second) t2 = (0.0, 1.0);
t2 = t1;

(double A, double B) t3 = (2.0, 3.0);
t3 = t2;

- '=' 대입 연산자를 사용하여 튜플 인스턴스를 개별 변수로 '분해' 가능

// 괄호 안에 각 변수의 형식을 명시적으로 선언
var t8 = ("post office", 3.6);
(string destination1, double distance1) = t8;
Console.WriteLine($"Distance to {destination1} is {distance1} kilometers.");

// 괄호 밖에서 var 키워드를 사용하여 형식화된 변수를 암시적으로 선언하며 컴파일러가 해당 형식을 유추
var t = ("post office", 3.6);
var (destination2, distance2) = t;
Console.WriteLine($"Distance to {destination2} is {distance2} kilometers.");

// 기존 변수를 사용
var destination3 = string.Empty;
var distance3 = 0.0;

var t9 = ("post office", 3.6);
(destination3, distance3) = t9;
Console.WriteLine($"Distance to {destination3} is {distance3} kilometers.");

 

튜플과 System.Tuple 비교

System.ValueTuple 형식으로 지원되는 C# 튜플은 System.Tuple 형식으로 표현되는 튜플과 다름

차이점

- ValueTuple 의 형식은 값 형식인 반면, Tuple 은 참조 형식이다.

- ValueTuple 의 형식은 변경할 수 있지만, Tuple 의 형식은 변경할 수 없다.

- ValueTuple 의 형식의 데이터 멤버는 필드인 반면, Tuple 형식의 데이터 멤버는 속성이다.

 

참조

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