Tuple (튜플) 은 C# 7.0 에서 추가된 Type 입니다. Tuple (튜플) Type 을 통해서 두 개 이상의 값을 반환하는 메서드를 보다 깔끔하고 효율적으로 구현할 수 있게 되었습니다. 기존의 경우 Method (메소드) 에서 두 가지 이상의 값을 반환하려면 아래와 같은 방법들을 이용했었습니다.
1. Out 매개 변수 한정자를 통해서 여러가지의 값을 넘겨주는 방법. (Async, Await 을 이용한 Asynchronous Method (비동기 메소드) 에서는 사용이 불가능합니다.)
2. System.Tuple <…> 형식을 통한 Tuple (튜플) 개체 할당. (Tuple 객체를 따로 할당하여야 하는 것도 비효율적인데… 코드 자체도 길어지게 됩니다.)
3. 두 가지 이상의 값을 반환이 필요한 Method (메소드) 마다 전달을 위한 클래스 / 구조체를 따로 생성하기 (필요 이상으로 코드 Overhead (오버헤드) 가 생성되므로 비효율적이었습니다.)
4. Dynamic 반환형을 통해 Anonymous Types (익명 타입) 의 객체를 반환하는 방법 (정적 자료형 검사를 하지 않기 때문에 Overhead (오버헤드) 생성량이 상당합니다.)
[ Tuple Type (튜플 타입) 사용법 및 사용 예시 ]
아래와 같이 소괄호로 묶고, 각각의 요소들을 쉼표로 구분하여 사용합니다. 각 요소의 값들은 fruits.Item1, fruits.Item2, fruits.Item3 필드를 통해 접근이 가능합니다.
var fruits = ("apple", "orange", "banana");
각 요소에 자동으로 할당되는 명칭 (Item1, Item2, …) 를 사용하고 싶지 않다면 아래와 같이 사용자가 이름을 직접 할당해 주는 것 역시 가능합니다. 이러한 경우 namedFruits.First, namedFruits.Second, namedFruits.Third 와 같이 각 요소들에 접근하실 수 있습니다.
(string First, string Second, string Third) namedFruits = ("apple", "orange", "banana")
다음처럼 할당 연산자의 오른쪽에서 명칭을 지정해줄 수도 있습니다.
var namedFruits = (First: "apple", Second: "orange", third: "banana");
할당 연산자의 좌측, 우측에서 모두 이름을 지정해 주는 방법도 존재하지만, 명칭 One, Two 와 충돌하므로 이름 First 와 Second 는 무시되게 됩니다. 따라서 아래와 같은 경우에는 namedFruits.One, namedFruits.Two 로만 접근이 가능합니다.
이번에는 Method Definition (메서드 정의) 부분에서 튜플이 어떻게 활용되는지 알아보도록 하겠습니다.
private static (int Max, int Min) Range(IEnumerable numbers)
{
int min = int.MaxValue;
int max = int.MinValue;
foreach (var n in numbers)
{
min = (n < min) ? n : min;
max = (n > max) ? n : max;
}
return (max, min);
}
소괄호 안에 (int, int) 와 같이 여러 개의 반환형을 그대로 나열해놓기만 하면 됩니다. 위의 예시에서는 필드에 각각 Max 와 Min 이라는 이름을 지정해줬는데, 별도로 지정해주지 않은 경우에는 필드 range.Item1, range.Item2 와 같이 접근할 수 있습니다.
var range = Range(numbers);
Console.WriteLine($"Max: {range.Max}, Min: {range.Min}");
그리고 튜플의 각 요소들을 다음과 같이 개별값으로 분해하는 것도 가능합니다.
(int max, int min) = Range(numbers);
Console.WriteLine($"Max: {max}, Min: {min}");
‘컴파일러에서 요구하는 ‘System.Runtime.CompilerServices.TupleElementNamesAttribute’ 형식을 찾지 못했기 때문에 튜플을 사용하는 클래스 또는 멤버를 정의할 수 없습니다. 참조가 있는지 확인하세요.’와 같은 오류가 발생합니다. 어떻게 해야 하나요?
.NET Framework가 C# 컴파일러와 동일한 주기로 제공되지 않을 수도 있습니다, Visual Studio 2017 버전을 사용하시고 계시는 경우 시스템에 설치된 .NET Framework 의 버전이 4.6.1 버전일 수 있습니다. 새로 추가된 Tuple (튜플) Type 을 이용하시려면 ValueTuple 형식이 필요한데요, 이 형식은 NuGet 패키지로 System.ValueTuple 을 추가하시거나 .NET Framework를 4.7 이상의 버전을 설치하셔야 사용이 가능한 형식입니다.
해당 NuGet 패키지를 시스템에 설치하는 방법
상단의 메뉴에서 [Tools (도구)] – [NuGet Package Manager (Nuget 패키지 관리자)] – [Manage NuGet Packages for Solution… (솔루션용 Nuget 패키지 관리)] 를 차례로 클릭합니다.

[Manage NuGet Packages for Solution… (솔루션용 Nuget 패키지 관리)] 화면에서 “ValueTuple “을 검색하신 후 [Install (설치)] 버튼을 클릭하여 [System.ValueTuple] 패키지를 설치합니다.

최신 버전의 .NET Framework 를 시스템에 설치하는 방법
여기를 클릭하셔서 최신 버전의 Development Pack 을 다운로드 받으시면 됩니다.

그 후, Visual Studio 에서 [새 프로젝트] 를 만드는 과정에서 [최신 버전의 .NET Framework (닷넷 프레임워크)] 를 선택하시거나 [Solution Explorer (솔루션 탐색기)] 에서 [Properties (프로젝트의 속성)] 으로 진입하여 대상 프레임워크를 수정하여 주시기 바랍니다.


고맙습니다!
