제로의영역

7.17 튜플 본문

C#

7.17 튜플

아이큐제로 2019. 6. 18. 17:54

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

 (1) 정의: 복합데이터 형식을 선언할 때 여러 필드를 담을 수 있는 구조체 >> 해석: 메소드로부터 복수 개의 값들을 리턴할 수 있는 구조체

 

 (2) 용도: 응용 프로그램 전체에서 사용할 형식을 선언할 때가 아닌, 임시적으로 사용할 복합 데이터 형식을 선언할 때 사용.

 

 (3) 특징

  1) 형식의 이름을 가지지 않음.

  2) 구조체로 값형식: 스택에 저장됨

  3) 생성된 지역을 벗어나면 소멸됨.

 

 (3) 사용법

  1) 명명되지 않은 튜플

    A. 변수를 var로 수식

    B. ( ) 안에 필드(클래스 안에 선언된 변수들)를 지정

       예) var 변수=(123, 789);

           >> C# 컴파일러는 자동으로 123을 Item1이라는 필드에 담고, 789를 Item2라는 필드에 담음.

    C. 출력시에는 {변수.Item1}, {변수.Item2}로 호출: Item1, Item2라는 필드를 사용하는 것은 튜플이 System.ValueTuple 구조체를 기반으로 만들어지기 때문

        예) var tuple=(123, 789);

             Console.WriteLine($"{tuple.Item1}, {tuple.Item2}"); // 출력

             출력결과: 123, 789

 

   2) 명명된 튜플

    A. 변수를 var로 수식

    B. ( ) 안에 '필드명: 필드'를 지정

       예) var 변수=(Name: "Zero", Age:17); //Name과 Age가 필드명, Zero와17이 필드 입니다.

    C. 출력시에는 {변수.필드명}으로 호출 

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

            Console.WriteLine($"{tuple.Name}, {tuple.Age}"); //출력

            출력 결과: Zero, 17

  

   3) 튜플의 분해(용도는 나와있지 않아서 모르겠음)

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

           var (name, age)=tuple; //분해

           Console.WriteLine($"{name}, {age}");

           출력결과: Zero, 17

    

       A. 분해시 특정 필드를 무시하고 싶을 때는 다음과 같이 _를 이용

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

              var (name, _)=tuple; //분해, Age 필드는 무시

              Console.WriteLine($"{name}");

              출력결과: Zero

 

   4) 명명되지 않은 튜플과 명명된 튜플끼리는 필드의 수와 형식이 같으면 할당이 가능

     예) var unnamed = ("슈퍼맨", 9999);             // (string, int)

          var named = (Name: "Zero", Age: 17);     //(string, int)

 

          named = unnamed;                             // named가 unnamed를 가리킴

          Console.WriteLine($"{named.Name}, {named.Age}");         // 출력결과: 슈퍼맨, 9999

 

          named = ("원더우먼", 10000)                // named의 변수를 변경 (string, int)

 

          unnamed = named;                            // unnamed가 named를 가리킴

          Console.WrteLine($"{unnamed.Name}, {unnamed.Age}");        //출력 결과: 원더우먼, 10000

 

 * 튜플을 사용하기 위해서는 System.Value Type이라는 추가 패키지가 필요

   1)비주얼 스튜디오 실행

   2)상단의 메뉴에서 '도구 >> NuGet패키지 관리자 >> 패키지 관리자 콘솔' 항목 클릭.

   3)하단에 '패키지 관리자 콘솔' 이 나타납니다.

   4) Install-Package "System.ValueTuple" 명령을 타이핑하고 엔터를 누릅니다.

   5) NuGet패키지 관리자가 튜플에 필요한 패키지를 설치합니다.

 

 예제)

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ex7_19
{
    class MainProgram
    {
        static void Main(string[] args)
        {
            //명명되지 않은 튜플
            var a = ("슈퍼맨", 9999);                       //(string, int)형식의 듀플
            Console.WriteLine($"{a.Item1},{a.Item2}");      

            //명명된 튜플
            var b = (Name: "배트맨", Age: 17);             //(string, int)
            Console.WriteLine($"{b.Name},{b.Age}");

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

            //명명된 튜플과 명명되지 않은 튜플사이의 할당
            b = a;                                          //b가 a를 가리킴
            Console.WriteLine($"{b.Name},{b.Age}");
        }
    }
}

    출력결과

슈퍼맨,9999
배트맨,17
배트맨,17
슈퍼맨,9999

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

8.3 인터페이스를 상속하는 인터페이스  (0) 2019.06.25
8.2 인터페이스는 약속이다  (0) 2019.06.25
7.16 구조체  (0) 2019.06.16
7.15 확장 메소드  (0) 2019.06.14
7.14 분할 클래스(Partial Class)  (0) 2019.06.10