NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# 튜플을 사용하여 성능을 업그레이드 하기. (Tuple)

    페이지 정보

    본문

    튜플은 이론상 무한개의 요소를 가지는 클래스를 나타냅니다. C나 Python에서 사용되는 튜플과는 개념적으로 차이가 있습니다. C#의 튜플은 몇가지 특징을 가지는데, 요소의 배열을 나타내는 싱글턴 객체를 쉽게 만들 수 있고, 한번 생성되면 요소의 길이를 변경할 수 없습니다. 또한, 클래스가 생성되면 필드의 값을 변경할 수 없으므로 약간의 주의가 필요합니다.

     

    튜플은 .NET Framework 4.0에 새롭게 추가된 클래스로 아직까지 그렇게 많이 사용되고 있지는 않습니다만, 2개 이상 값을 반환해야 할 때 사용하기 좋을듯합니다. 불필요하게 out, ref키워드를 사용하는 것보다는 편리한건 사실입니다. 그렇다고 해서 매번 클래스나 구조체를 만들어서 속성을 채운 후 넘겨주는 것은 현재 MS에서 지향하는 방향과 맞지 않기도 하죠.

     

    아래 예제를 통해 어떻게 사용되는지 알아보겠습니다.

    using System;
    using System.Diagnostics;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Tuple<int, string, bool> tuple = new Tuple<int, string, bool>(0, "Animal", true); 
                
                if (tuple.Item1 == 1)
                {
                    Console.WriteLine(tuple.Item1);
                }
    
                if (tuple.Item2 == "Machine")
                {
                    Console.WriteLine(tuple.Item2);
                }
    
                if (tuple.Item3)
                {
                    Console.WriteLine(tuple.Item3);
                }
                
                Console.ReadKey();
            }
        }
    }

     

     

    결과는 여러분이 예상한데로 나오게 됩니다. 한가지 중요한 점은, 자동으로 속성이 만들어지고 순서대로 채워진다는 점입니다. 속성명은 Item1~n까지 자동으로 증가하죠.

    fikXsow.png

     

     

    튜플은 아래와 같이 어떤 타입이 오더라도 요소에 할당할 수 있습니다.

    using System;
    using System.Diagnostics;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var tuple = new Tuple<string, string[], int, int[]>("Python", new string[] { "Java", "C#" }, 1, new int[] { 1, 2, 3 }); 
                M(tuple); 
                
                Console.ReadKey();
            }
    
            static void M(Tuple<string, string[], int, int[]> tuple)
            {
                Console.WriteLine(tuple.Item1); 
                
                foreach (string value in tuple.Item2)
                {
                    Console.WriteLine(value);
                }
    
                Console.WriteLine(tuple.Item3); 
                
                foreach (int value in tuple.Item4)
                {
                    Console.WriteLine(value);
                }
            }
        }
    }

     

     

    아래 결과와 같이 배열도 추가할 수 있습니다. 한번 생성된 튜플은 수정할 수 없기 때문에 생성자 안에서 처리되어야 합니다.

    BF5ZKFa.png

     

     

    생성자를 통해서 만들어도 되고, Create 메서드를 통해서 만들어도 됩니다. 이 둘은 차이가 없습니다. Syntax가 단순하므로 Create 메서드를 자주 사용하게 되지만, 내부적으로는 동일하게 동작합니다.

    using System;
    using System.Diagnostics;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var tupleConstructor = new Tuple<int, int, int, int, int, int>(1, 2, 3, 4, 5, 6); 
                Console.WriteLine(tupleConstructor);
                
                var tupleSingleton = Tuple.Create<int, int, int, int, int, int, int, int>(1, 2, 3, 4, 5, 6, 7, 8); 
                Console.WriteLine(tupleSingleton); 
    
                Console.ReadKey();
            }
        }
    }

     

     

    튜플을 Console에 찍어보면 아래와 같은 결과를 확인할 수 있습니다. 기본적으로 제공하는 요소의 길이는 8개가 Maximum입니다. 하지만, 마지막 Rest속성은 중첩된 Tuple을 반환하기 위해 정의된 속성입니다.

    apExgUy.png

     

     

    아래 예제는 8번째 위치하고 있는 Rest속성에 대한 예제입니다. 중첩된 튜플의 사용 방법에 대해 설명하고 있습니다.

    using System;
    using System.Diagnostics;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var tuple = new Tuple<string, string[], int, int[]>("Python", new string[] { "Java", "C#" }, 1, new int[] { 1, 2, 3 }); 
                M(tuple); 
                
                Console.ReadKey();
            }
    
            static void M(Tuple<string, string[], int, int[]> tuple)
            {
                Console.WriteLine(tuple.Item1);
    
                foreach (string value in tuple.Item2)
                {
                    Console.WriteLine(value);
                }
                
                Console.WriteLine(tuple.Item3); 
                
                foreach (int value in tuple.Item4)
                {
                    Console.WriteLine(value);
                }
            }
        }
    }

     

     

    위 프로그램을 실행하면 아래와 같은 결과를 확인할 수 있습니다.

    kIzko9o.png

     

     

    KeyValueCollection보다 Tuple이 속도면에서 좋습니다. 또한, Tuple의 경우에는 4byte를 사용하여 인수를 전달하는 반면, KeyValuePair나 구조체는 이보다 많은 양을 사용하기에 성능면에서도 튜플의 사용이 좋을 수 있습니다. 하지만, 프로그래밍에 있어서 꼭 성능이 최우선으로 되어야 하는 것은 아닙니다. 튜플도 단점이 존재하죠. 단순 데이타 집합을 반환하기 위한 용도로 사용하기에 좋지만, 코드의 가독성면에서는 그리 추천할만한 방법은 아닙니다.

     

    우리는 아직도 Name, Age, Address, Sex와 같은 네이밍 룰을 선호합니다. Item1, Item2, Item3... 과 같은 이름은 코드를 분석할 때 개발자를 힘들게 하는 요소중에 하나이기 때문입니다.

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.