[c# 7.0] 튜플(Tuple)

eunjin lee·2023년 1월 14일
0

C# 9.0 프로그래밍

목록 보기
48/50

c#에 도입된 튜플은 메서드의 인자 또는 반환에 대해 다중값을 한번에 전달할 수 있는 약식 구문이다.


여러 값을 인자로 또는 반환값으로 쓰고 싶을 때, 아래의 옵션을 고려할 수 있다.

✍ 별도의 클래스

   class IntResult
    {
        public int number;
        public bool parsed;
    }

    class Program
    {
        static void Main(string[] args)
        {
            dynamic result = ParseInteger("33");
            Console.WriteLine(result.Number);
            Console.WriteLine(result.Parsed);
        }

        static IntResult ParseInteger(string txt)
        {
            IntResult result = new IntResult();

            try
            {
                result.number = Int32.Parse(txt);
                result.parsed = true;
            }
            catch
            {
                result.parsed = false;
            }
            return result;
        }
    }
  • 원하는 값을 멤버변수로 담을 수 있는 별도의 클래스를 일일이 만드는 것은 귀찮다.

✍ dynamic 예약어

class Program
	{
        static void Main(string[] args)
        {
            dynamic result = ParseInteger("33");
            Console.WriteLine(result.Number);
            Console.WriteLine(result.Parsed);
        }

        static dynamic ParseInteger(string txt)
        {
            int number;// = 0;

            try
            {
                number = Int32.Parse(txt);
                return new {Number = number, Parsed = true};
            }
            catch
            {
                return new {Number = 0, Parsed = false};
            }
        }
    }
  • 정적 형식 검사를 할 수 없어 필드 이름이 바뀌어도 컴파일 시 문제를 알아낼 수 없다는 단점이 있다.

✍ System.Tuple Generic Type

        static void Main(string[] args)
        {
            Tuple<bool, int> intResult = ParseInteger("33");
            Console.WriteLine(intResult.Item1);
            Console.WriteLine(intResult.Item2);
        }

        static Tuple<bool, int> ParseInteger(string txt)
        {
            int number = 0;
            bool parsed = false;

            try
            {
                number = Int32.Parse(txt);
                parsed = true;
            }
            catch
            { }

            return Tuple.Create(parsed, number);
        }
  • 변수의 이름을 무조건 Item1, Item2...와 같은 식으로 사용해야 한다는 제약이 있다.

✍ Tuple

        static void Main(string[] args)
        {
            (bool, int) intResult = ParseInteger("33");
            Console.WriteLine(intResult.Item1);
            Console.WriteLine(intResult.Item2);
        }

        static (bool, int) ParseInteger(string txt)
        {
            int number = 0;
            bool parsed = false;

            try
            {
                number = Int32.Parse(txt);
                parsed = true;
            }
            catch
            { }

            return (parsed, number);
        }

✍ Tuple_변수명 지정1 : 호출자에서 지정

        static void Main(string[] args)
        {
            (bool Prsd, int Nmbr) intResult = ParseInteger("33");
            Console.WriteLine(intResult.Prsd);
            Console.WriteLine(intResult.Nmbr);
        }

        static (bool, int) ParseInteger(string txt)
        {
            int number = 0;
            bool parsed = false;

            try
            {
                number = Int32.Parse(txt);
                parsed = true;
            }
            catch
            { }

            return (parsed, number);
        }
    }

✍ Tuple_변수명 지정2 : 메서드에서 지정

        static void Main(string[] args)
        {
            var intResult = ParseInteger("33");
            Console.WriteLine(intResult.Prsd);
            Console.WriteLine(intResult.Nmbr);
        }

        static (bool Prsd, int Nmbr) ParseInteger(string txt)
        {
            int number = 0;
            bool parsed = false;

            try
            {
                number = Int32.Parse(txt);
                parsed = true;
            }
            catch
            { }

            return (parsed, number);
        }
    }

✍ Tuple의 이름 없이 개별 필드로 받기

        static void Main(string[] args)
        {
            (var success, var val) = ParseInteger("33");
            Console.WriteLine(success);
            Console.WriteLine(val);
        }

🧐 System.Tuple vs System.ValueTuple

  • c#7.0의 튜플은 컴파일 시점에 System.ValueTuple 제네릭 타입으로 변경해서 처리한다.
  • System.Tuple은 class로 정의되었지만, System.ValueType은 struct로 정의되어 있다.
  • 다시 말해 System.Tuple은 참조 형식이지만 System.ValueTuple은 값 형식이다.

0개의 댓글