튜플
여러 필드를 담을 수 있는 구조체 : 형식의 이름을 갖지 않음, 임시적으로 사용할 복합 데이터 형식 선언에 적합
튜플 선언 : 명명되지 않은 선언
기본적으로는 구조체, 즉 값 형식
형식 이름 없이 선언하여 사용
프로그램 전역에서 사용할 형식에는 부적합
튜플 : 명명되지 않은 튜플 (Unnamed Tuple)
- 필드를 담을 수 있는 형식 이름이 없는 구조체
- 프로그램 전체에 사용할 형식 선언이 아닌 즉석에서 사용할 복합 데이터 형식
- 값 형식으로 생성된 지역을 벗어나면 스택에서 소멸되므로 메모리 사용 부담이 적음
- 명명되지 않은 튜플 (Unnamed Tuple)
- 튜플 사용할 때 필드의 이름을 지정하지 않음
명명되지 않은 선언 : Item1, Item2, ...ItemN
튜플 : 명명된 튜플 (Named Tuple)
- 명명된 튜플 (Named Tuple)
- “필드명:” 의 형태로 필드의 이름을 지정하여 선언
- 튜플 정의와 반대 형태로 분해 가능
- 특정 필드를 무시하기 위해 “_” 를 이용
- 튜플 분해를 이용해 여러 변수를 단번에 생성하고 초기화 가능
var tuple2 = (Name: "홍길동", Age: 17);
Console.WriteLine($"{tuple2.Name}, {tuple2.Age}"); // 출력결과: 홍길동, 17
// 튜플 분해
var (name, _) = tuple2; // Age 필드는 무시
Console.WriteLine($"{name}"); // 출력결과: 홍길동
var (name2, age2) = ("이순신", 34); // 여러 변수 생성 및 초기화
Console.WriteLine($"{name2}, {age2}"); // 출력결과: 이순신, 34
명명된 선언 = 필드 명 : 값
튜플 : 두 튜플 사이의 할당
- 명명되지 않은 튜플과 명명된 튜플 사이의 할당
- 필드의 수와 형식이 같으면 할당이 가능
var unnamed = ("슈퍼맨", 9999); // (string, int)
var named = (Name: "홍길동", Age: 17); // (string, int)
// 명명된 튜플 = 명명되지 않은 튜플
named = unnamed;
Console.WriteLine($"{named.Name}, {named.Age}"); // 출력결과: 슈퍼맨, 9999
named = ("원더우먼", 10000);
// 명명되지 않은 튜플 = 명명된 튜플
unnamed = named;
Console.WriteLine($"{unnamed.Item1}, {unnamed.Item2}"); // 출력결과: 원더우먼, 10000
using System;
namespace Tuple
{
class MainApp
{
static void Main(string[] args)
{
// 명명되지 않은 튜플
var a = ("슈퍼맨", 9999);
Console.WriteLine($"{a.Item1}, {a.Item2}");
// 명명된 튜플
var b = (Name: "박상현", Age: 17);
Console.WriteLine($"{b.Name}, {b.Age}");
// 분해
var (name, age) = b; // (var name, var age) = b;
Console.WriteLine($"{name}, {age}");
// 분해2
var (name2, age2) = ("박문수", 34);
Console.WriteLine($"{name2}, {age2}");
// 명명된 튜플 = 명명되지 않은 튜플
b = a;
Console.WriteLine($"{b.Name}, {b.Age}");
}
}
}
튜플 : 위치 패턴 매칭 (Positional Pattern Matching)
- 튜플은 switch 문 또는 switch 식의 분기조건에 활용 가능
- 튜플이 분해된 요소의 위치에 따라 값이 일치하는지 판단
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,
};
Console.WriteLine(discountRate); // 출력 0.2
using System;
namespace PosisionalPattern
{
class MainApp
{
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(string[] args)
{
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)}");
}
}
}
'전공 > C# 프로그래밍' 카테고리의 다른 글
8강. 배열 (2) (0) | 2023.04.19 |
---|---|
8강. 배열 (1) (0) | 2023.04.19 |
7강. 객체지향 프로그래밍과 클래스 (5)중첩 클래스, 분할 클래스, 확장 메소드, 구조체 (0) | 2023.04.18 |
7강. 객체지향 프로그래밍과 클래스 (4)다형성 (0) | 2023.04.18 |
7강. 객체지향 프로그래밍과 클래스 (3)상속성 (0) | 2023.04.17 |
댓글