일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 다트 언어
- docker
- vim
- Houdini
- git
- c#
- 포인터
- Data Structure
- jupyter
- Unity
- HTML
- Python
- c# 윈폼
- 플러터
- c# 추상 클래스
- C++
- Algorithm
- 구조체
- Flutter
- 깃
- C# delegate
- c언어
- github
- c# winform
- C언어 포인터
- jupyter lab
- 도커
- gitlab
- 유니티
- dart 언어
- Today
- Total
nomad-programmer
[Programming/C#] 튜플 (Tuple) 본문
* Python의 튜플(Tuple)과 똑같다고 생각하면 된다.
튜플도 여러 필드를 담을 수 있는 구조체이다. 하지만 구조체와는 달리 튜플은 형식의 이름을 가지지 않는다. 그래서 튜플은 응용 프로그램 전체에서 사용할 형식을 선언할 때가 아닌, 임시적으로 사용할 복합 데이터 형식을 선언할 때 적합하다. 튜플은 구조체이므로 값 형식이다. 값 형식은 생성된 지역을 벗어나면 스택에서 소멸되기 대문에 프로그램에 장기적인 부담을 주지 않는다는 장점이 있다.
// 컴파일러가 튜플의 모양을 보고 직접 형식을 결정하도록 var를 이용해 선언.
// 튜플은 괄호 사이에 두 개 이상의 필드를 지정함으로써 만들어진다.
var tuple = (123, 789):
위와 같이 이름을 지정하지 않은 튜플을 일컬어 "명명되지 않은 튜플(Unnamed Tuple)"이라고 부른다.
이 경우, C# 컴파일러는 자동적으로 123을 Item1이라는 필드에 담고, 789를 Item2라는 필드에 담는다. 이러한 이유는 튜플이 System.ValueTuple 구조체를 기반으로 만들어지기 때문이다.
튜플 필드의 이름을 지정할 수 있는데 그것을 "명명된 튜플(Named Tuple)"이라고 부른다.
명명된 튜플은 다음과 같이 "필드명:"의 꼴로 필드의 이름을 지정하여 선언한다.
var tuple = (Name: "test", Age: 17);
튜플을 분해할 수도 있다.
var tuple = (Name: "test", Age: 17);
var (name, age) = tuple;
(var name, var age) = tuple;
(string name, int age) = tuple;
// 튜플을 분해할 때 특정 필드를 무시하고 싶다면 _ 를 이용하면 된다.
var (name, _) = tuple;
튜플 사용을 위한 선행 작업
튜플을 사용하기 위해서는 System.ValueTuple 이라는 추가 패키지가 필요하다. 이 패키지를 NuGet 패키지 관리자를 이용해서 설치하자.
Visual Studio에서 [도구] -> [NuGet 패키지 관리자] -> [패키지 관리자 콘솔] 을 클릭하여 실행한다.
패키지 관리자 콘솔이 나타나면 Install-Package "System.ValueTuple" 명령을 실행한다. 그러면 NuGet 패키지 관리자가 튜플에 필요한 패키지를 설치할 것이다.
튜플의 사용 예
using System;
namespace CSharpExample
{
class MainApp
{
static int Main(string[] args)
{
// 명명되지 않은 튜플 (unnamed tuple)
var a = ("Tuple", 5555);
Console.WriteLine($"{a.Item1}, {a.Item2}");
// 명명된 튜플 (named tuple)
var b = (Name: "테스트", Age: 17);
Console.WriteLine($"{b.Name}, {b.Age}");
// 튜플 분해
var (name, age) = b; // (var name, var age) = b;
Console.WriteLine($"{name}, {age}");
// 명명된 튜플 = 명명되지 않은 튜플
b = a;
Console.WriteLine($"{b.Name}, {b.Age}");
(string name2, int age2) = b;
Console.WriteLine($"{name2}, {age2}");
return 0;
}
}
}
/* 결과
Tuple, 5555
테스트, 17
테스트, 17
Tuple, 5555
Tuple, 5555
*/
'Programming > C#' 카테고리의 다른 글
[Programming/C#] 인터페이스를 상속하는 인터페이스 (0) | 2020.09.10 |
---|---|
[Programming/C#] 인터페이스 (interface) (0) | 2020.09.10 |
[Programming/C#] 구조체 (Structure) (0) | 2020.09.09 |
[Programming/C#] 확장 메소드 (0) | 2020.09.09 |
[Programming/C#] 분할 클래스 (0) | 2020.09.09 |