튜플 Tuple

  • 형식 이름이 없는 여러 필드를 담을 수 있는 구조체
  • 값 형식 이기 때문에 프로그램에 장기적인 부담을 주지 않는 장점이 있음
// 명명되지 않은 튜플 (Unnamed Tuple)
var tuple = (123,789);

// tuple.Item1 : 123;
// tuple.Item2 : 789
// 명명된 튜플 (Named Tuple)
var tuple = (Name: "Daniel", Age : 17);

// tuple.Name : "Daniel"
// tuple.Age : 17

var (name, age) = tuple; // 구조분해 할당
// name : "Daniel"
// age : 17

튜플 분해

  • 분해 가능한 이유는 분해자 (Deconstructor)를 구현하기 때문
  • 객체를 분해한 결과를 switch 문이나 switch 식의 분기 조건에 활용 가능
  • 위치 패턴 매칭 (Positional Pattern Matching)이라고 함
  • 식별자나 데이터 형식이 아닌 분해된 요소의 위치에 따라 값이 일치하는지를 판단
var alice = (job: "학생", age : 17);

var discountRate = alice switch
	{
		("학생", int n) when n < 18 => 0.2,  // 학생 & 18세 미만
		("학생", _)                => 0.1,  // 학생 & 18세 이상
		("일반", int n) when n < 18 => 0.1,  // 일반 & 18세 미만
		("일반", _)                => 0.05, // 일반 & 18세 이상
		_ => 0,
	}
namespace ThisIsCsharp.Chapter07;  
  
public static class Tuple  
{  
	private static double GetDiscountRate(object client)  
	{  
		return client switch  
	{  
		("학생", int n) when n < 18 => 0.2, // 학생 & 18세 미만  
		("학생", _) => 0.1, // 학생 * 18세 이상  
		("일반", int n) when n < 18 => 0.1, // 일반 & 18세 미만  
		("일반", _) => 0.05, // 일반 & 18세 이상  
		_ => 0,  
	};  
}  
  
	static void Main()  
	{  
		var alice = (job: "학생", age: 17);  
		var bob = (job: "학생", age: 23);  
		var charlie = (job: "일반", age: 15);  
		var dave = (job: "일반", age: 21);  
		  
		Console.WriteLine($"Alice : {GetDiscountRate(alice)}");  
		Console.WriteLine($"Bob : {GetDiscountRate(bob)}");  
		Console.WriteLine($"Charlie : {GetDiscountRate(charlie)}");  
		Console.WriteLine($"Dave : {GetDiscountRate(dave)}");  
	}  
}