Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C#] 튜플 (Tuple) 본문

Programming/C#

[Programming/C#] 튜플 (Tuple)

scii 2020. 9. 9. 23:40

* Python의 튜플(Tuple)과 똑같다고 생각하면 된다.

튜플도 여러 필드를 담을 수 있는 구조체이다. 하지만 구조체와는 달리 튜플은 형식의 이름을 가지지 않는다. 그래서 튜플은 응용 프로그램 전체에서 사용할 형식을 선언할 때가 아닌, 임시적으로 사용할 복합 데이터 형식을 선언할 때 적합하다. 튜플은 구조체이므로 값 형식이다. 값 형식은 생성된 지역을 벗어나면 스택에서 소멸되기 대문에 프로그램에 장기적인 부담을 주지 않는다는 장점이 있다.

// 컴파일러가 튜플의 모양을 보고 직접 형식을 결정하도록 var를 이용해 선언.
// 튜플은 괄호 사이에 두 개 이상의 필드를 지정함으로써 만들어진다.
var tuple = (123, 789):

위와 같이 이름을 지정하지 않은 튜플을 일컬어 "명명되지 않은 튜플(Unnamed Tuple)"이라고 부른다.
이 경우, C# 컴파일러는 자동적으로 123을 Item1이라는 필드에 담고, 789를 Item2라는 필드에 담는다. 이러한 이유는 튜플이 System.ValueTuple 구조체를 기반으로 만들어지기 때문이다.

튜플 필드의 이름을 지정할 수 있는데 그것을 "명명된 튜플(Named Tuple)"이라고 부른다.
명명된 튜플은 다음과 같이 "필드명:"의 꼴로 필드의 이름을 지정하여 선언한다.

var tuple = (Name: "test", Age: 17);

튜플을 분해할 수도 있다.

var tuple = (Name: "test", Age: 17);

var (name, age) = tuple;
(var name, var age) = tuple;
(string name, int age) = tuple;

// 튜플을 분해할 때 특정 필드를 무시하고 싶다면 _ 를 이용하면 된다.
var (name, _) = tuple;

튜플 사용을 위한 선행 작업

튜플을 사용하기 위해서는 System.ValueTuple 이라는 추가 패키지가 필요하다. 이 패키지를 NuGet 패키지 관리자를 이용해서 설치하자.

Visual Studio에서 [도구] -> [NuGet 패키지 관리자] -> [패키지 관리자 콘솔] 을 클릭하여 실행한다.
패키지 관리자 콘솔이 나타나면 Install-Package "System.ValueTuple" 명령을 실행한다. 그러면 NuGet 패키지 관리자가 튜플에 필요한 패키지를 설치할 것이다.

튜플의 사용 예

using System;

namespace CSharpExample
{
    class MainApp
    {
        static int Main(string[] args)
        {
            // 명명되지 않은 튜플 (unnamed tuple)
            var a = ("Tuple", 5555);
            Console.WriteLine($"{a.Item1}, {a.Item2}");

            // 명명된 튜플 (named tuple)
            var b = (Name: "테스트", Age: 17);
            Console.WriteLine($"{b.Name}, {b.Age}");

            // 튜플 분해
            var (name, age) = b;    // (var name, var age) = b;
            Console.WriteLine($"{name}, {age}");

            // 명명된 튜플 = 명명되지 않은 튜플
            b = a;
            Console.WriteLine($"{b.Name}, {b.Age}");

            (string name2, int age2) = b;
            Console.WriteLine($"{name2}, {age2}");

            return 0;
        }
    }
}


/* 결과

Tuple, 5555
테스트, 17
테스트, 17
Tuple, 5555
Tuple, 5555

*/
Comments