C# 5-튜플(Tuple<T1, T2, T3, T4, T5>)이란?
C#의 Tuple<T1, T2, T3, T4, T5> 클래스는 다섯 개의 요소를 가지는 5-튜플(quintuple, 퀸터플)을 나타냅니다. 튜플(tuple)은 여러 요소를 하나의 시퀀스로 묶어 다루는 데이터 구조로, 서로 다른 자료형의 값들을 하나의 객체로 그룹화해야 할 때 특히 유용합니다.
이 클래스는 다음과 같은 다섯 개의 속성을 제공합니다.
- Item1 – 현재 Tuple<T1, T2, T3, T4, T5> 객체의 첫 번째 구성 요소 값을 가져옵니다.
- Item2 – 현재 객체의 두 번째 구성 요소 값을 가져옵니다.
- Item3 – 현재 객체의 세 번째 구성 요소 값을 가져옵니다.
- Item4 – 현재 객체의 네 번째 구성 요소 값을 가져옵니다.
- Item5 – 현재 객체의 다섯 번째 구성 요소 값을 가져옵니다.
예제 1: 정수형 5-튜플 만들기
다음은 C#에서 5-튜플을 생성하고, 각 요소(Item1~Item5)에 접근해 값을 출력한 뒤 조건문으로 특정 값을 비교하는 예제입니다.
using System;
public class Demo {
public static void Main(string[] args) {
Tuple<int, int, int, int, int> tuple = new Tuple<int, int, int, int, int>(100, 150, 300, 450, 600);
Console.WriteLine("Value (Item1)= " + tuple.Item1);
Console.WriteLine("Value (Item2)= " + tuple.Item2);
Console.WriteLine("Value (Item3)= " + tuple.Item3);
Console.WriteLine("Value (Item4)= " + tuple.Item4);
Console.WriteLine("Value (Item5)= " + tuple.Item5);
if (tuple.Item1 == 100) {
Console.WriteLine("Exists: Tuple Item 1 = " + tuple.Item1);
}
if (tuple.Item2 == 250) {
Console.WriteLine("Exists: Tuple Item 2 = " + tuple.Item2);
}
if (tuple.Item3 == 270) {
Console.WriteLine("Exists: Tuple Item 3 = " + tuple.Item3);
}
if (tuple.Item4 == 300) {
Console.WriteLine("Exists: Tuple Item 4 = " + tuple.Item4);
}
if (tuple.Item5 == 400) {
Console.WriteLine("Exists: Tuple Item 5 = " + tuple.Item5);
}
}
}
실행 결과
Value (Item1)= 100
Value (Item2)= 150
Value (Item3)= 300
Value (Item4)= 450
Value (Item5)= 600
Exists: Tuple Item 1 = 100
실행 결과에서 확인할 수 있듯이, 다섯 개의 조건식 중 Item1이 100과 일치하는 경우만 참이므로 해당 메시지만 출력됩니다.
예제 2: 문자열과 정수가 섞인 5-튜플
튜플은 서로 다른 자료형을 함께 담을 수도 있습니다. 아래 예제는 string과 int를 혼합한 5-튜플을 생성하는 방법을 보여줍니다.
using System;
public class Demo {
public static void Main(string[] args) {
Tuple<string, int, string, int, int> tuple = new Tuple<string, int, string, int, int>("jack", 150, "pete", 300, 600);
Console.WriteLine("Value (Item1)= " + tuple.Item1);
Console.WriteLine("Value (Item2)= " + tuple.Item2);
Console.WriteLine("Value (Item3)= " + tuple.Item3);
Console.WriteLine("Value (Item4)= " + tuple.Item4);
Console.WriteLine("Value (Item5)= " + tuple.Item5);
if (tuple.Item1 == "kevin") {
Console.WriteLine("Exists: Tuple Item 1 = " + tuple.Item1);
}
if (tuple.Item2 == 250) {
Console.WriteLine("Exists: Tuple Item 2 = " + tuple.Item2);
}
if (tuple.Item3 == "pete") {
Console.WriteLine("Exists: Tuple Item 3 = " + tuple.Item3);
}
if (tuple.Item4 == 300) {
Console.WriteLine("Exists: Tuple Item 4 = " + tuple.Item4);
}
if (tuple.Item5 == 400) {
Console.WriteLine("Exists: Tuple Item 5 = " + tuple.Item5);
}
}
}
실행 결과
Value (Item1)= jack
Value (Item2)= 150
Value (Item3)= pete
Value (Item4)= 300
Value (Item5)= 600
Exists: Tuple Item 3 = pete
Exists: Tuple Item 4 = 300
조건식 중 Item3이 "pete"와 일치하고 Item4가 300과 일치하므로, 두 개의 메시지가 출력되는 것을 확인할 수 있습니다.
참고: C# 7.0 이상에서는 ValueTuple 사용 권장
.NET Framework 4.7 또는 C# 7.0 이상 환경이라면 문법이 훨씬 간결한 ValueTuple을 사용하는 것이 좋습니다. 값 형식(value type)으로 구현되어 불필요한 힙 할당이 줄어들어 성능 면에서도 유리합니다.
(int, int, int, int, int) myTuple = (100, 150, 300, 450, 600);
Console.WriteLine(myTuple.Item1); // 출력: 100
또한 기존 Tuple 클래스의 요소는 읽기 전용(read-only)인 반면, ValueTuple은 생성 후에도 요소 값을 변경할 수 있다는 점이 큰 차이입니다. 상황에 맞게 두 방식을 선택해 사용하시기 바랍니다.