튜플 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)}");
}
}