C# 7.0은 이미 출시된 지 꽤 되었고, 모두가 새 기능인 ValueTuple에 튜플 최적화가 있다는 것을 알고 있습니다. 다음은 ValueTuple의 장점과 사용법을 더 잘 이해하기 위해 10분 만에 튜플과 밸류튜플을 설명하는 자세한 예시들입니다.
튜플에 대해 충분히 알고 있다면, "튜플 리뷰" 섹션을 건너뛰고 바로 "ValueTuple Explained" 섹션으로 가서 가치 튜플의 놀라운 활용법을 볼 수 있습니다.
Tuple을 다시 보세요
튜플은 C# 4.0과 함께 도입된 새로운 기능으로, .Net Framework 4.0 이상에서 사용할 수 있습니다.
튜플은 특정 수와 요소 순서를 가진 데이터 구조입니다. 예를 들어, 학생 정보를 저장하는 삼중 자료구조를 설계하자면, 총 세 가지 요소로 구성되어 있습니다. 첫 번째는 이름, 두 번째는 나이, 세 번째는 키입니다.
튜플의 구체적인 용도는 다음과 같습니다:
1. 튜플 생성 방법
기본값입니다. 넷 프레임워크튜플은 1개에서 7개 튜플 요소만 지원합니다8개 이상의 요소가 있다면 튜플의 중첩 및 Rest 속성을 사용해 구현해야 합니다. 또한, 튜플 클래스는 튜플 객체를 생성하는 정적 메서드를 제공합니다.
구성자를 사용하여 튜플을 생성합니다:
최대 8개의 요소를 지원하는 튜플 정적 방법을 사용하여 튜플을 구성합니다:
참고: 여기서 구성된 튜플 타입은 실제로 Tuple<int, int, int, int, Tuple<int>>이므로 testTuple8.Rest에서 얻은 데이터 타입은 튜플이므로 <int>정확한 값을 얻으려면 Item1 속성을 가져와야 합니다.
2. 데이터 집합을 나타냅니다 학생에 대한 세 가지 정보인 이름, 나이, 키를 나타내는 튜플을 아래에 생성하되, 별도의 클래스를 만들지 않습니다.
3. 메서드에서 여러 값을 반환하기 함수가 여러 값을 반환해야 할 때는 일반적으로 out 매개변수를 사용할 수 있으며, 여러 값을 반환하기 위해 out 대신 튜플을 사용할 수 있습니다.
4. 단일 매개변수 방법을 위한 다중 값 전송
함수 매개변수가 하나의 객체 유형일 때, 튜플 구현을 통해 여러 매개변수 값을 전달할 수 있습니다.
위에서 언급한 편리한 방법에도 불구하고, 튜플에는 상당한 단점도 있습니다:
- 요소에 접근할 때는 ItemX를 통해서만 접근할 수 있고, 사용하기 전에 요소 순서를 명확히 해야 하며, 속성 이름은 실질적인 의미가 없어 기억하기 불편합니다.
- 최대 8가지 원소가 있으며, 더 원한다면 마지막 원소로 중첩을 만들어야만 확장할 수 있습니다;
- 튜플은 참조 타입이지, 힙에 공간을 할당하고 CPU 집약적일 때 생성 및 할당 작업이 너무 많을 수 있는 다른 단순 타입과 같은 가치 타입이 아닙니다.
따라서 C# 7.0에서 새로운 ValueTuple 타입이 도입되었으며, 자세한 내용은 다음 섹션에서 다룹니다.
ValueTuple이 자세히 설명합니다
ValueTuple은 C# 7.0의 새로운 기능 중 하나로, .Net Framework 4.7 이상에서 사용할 수 있습니다.
ValueTuple은 4.7이 필요하지 않습니다. nuget만 있으면 4.7이 내장되어 있습니다. 또한 ValueTuple은 구조 유형으로, 마이크로소프트는 64바이트 이상의 구조를 사용하지 말 것을 권장하며, 이는 ValueTuple에도 적용됩니다.
값 튜플은 특정 수와 요소 순서를 나타내는 자료구조이기도 하지만, 튜플 클래스와는 다음과 같은 주요 차이점이 있습니다:
값 튜플은 클래스가 아니라 구조체이자 값 유형이며, 튜플은 참조 유형인 클래스입니다; 값 튜플 요소는 읽기 전용이 아니라 가변적이며, 즉 값 튜플 내 요소의 값을 변경할 수 있습니다; 데이터 멤버의 값 튜플은 속성이 아니라 필드입니다. 값 튜플의 구체적인 사용법은 다음과 같습니다:
1. 값 튜플을 만드는 방법 튜플 클래스와 마찬가지로, .Net 프레임워크의 값 튜플도 1개에서 7개의 튜플 요소만 지원하며, 8개 이상의 요소가 있다면 값 튜플의 중첩 속성과 Rest 속성을 사용해 구현해야 합니다. 또한, ValueTuple 클래스는 값 튜플 객체를 생성하는 정적 메서드를 제공할 수 있습니다.
구성자를 사용하여 튜플을 생성합니다:
최대 8개의 요소를 지원하는 튜플 정적 방법을 사용하여 튜플을 구성합니다:
여기서 구성된 튜플 타입은 실제로 Tuple<int, int, <int>>이므로, testTuple8.Rest가 얻는 데이터 타입은 튜플이므로 <int>정확한 값을 얻으려면 Item1 속성을 가져와야 합니다.
최적화 차이점:7개 이상의 요소를 가진 값 튜플이 구성되면, 중첩된 튜플의 값은 다음 ItemX를 사용하여 접근할 수 있으며, 위 예시의 경우 testTuple10.Rest.Item3 또는 testTuple10.Item10을 통해 열 번째 요소에 접근할 수 있습니다.
2. 데이터 집합을 나타냅니다 학생에 대한 세 가지 정보인 이름, 나이, 키를 나타내는 값 튜플을 만들고, 별도의 클래스를 만들지 않습니다.
3. 메서드에서 여러 값을 반환하기 값 튜플은 함수 정의에서 out 매개변수 대신 여러 값을 반환할 수도 있습니다.
최적화 차이점:반환 값은 ValueTuple에서 설명할 수 없을 정도로 새로운 문법(,,)을 사용해 지정할 수 있습니다. 예를 들어 (string, int, uint):
studentInfo 타입을 디버깅하는 것은 ValueType 트리플렛입니다.
최적화 차이점:반환 값은 메모리 할당과 접근 이해를 돕기 위해 요소 이름을 지정할 수 있습니다:
편리한 메모리 할당:
4. 단일 매개변수 방법을 위한 다중 값 전송 함수 매개변수가 하나의 객체 유형일 때, 값 튜플 구현을 통해 여러 값을 전달할 수 있습니다.
5. 값 튜플 해체 국소 변수를 구성하는 튜플 요소를 해석하는 데 var (x, y) 또는 (var x, var y)를 사용할 수 있고, 원하지 않는 요소는 무시하는 기호 "_"를 사용할 수 있습니다.
앞서 언급했듯이, ValueTuple은 C#을 더 간단하고 사용하기 쉽게 만듭니다. 튜플에 비해 가지는 주요 장점은 다음과 같습니다:
- ValueTuple은 함수 반환 값"(,,)"에 대한 새로운 문법을 지원하여 코드를 더 간단하게 만듭니다;
- 여기서 주목할 점은, 이름이 명명되어 있지만 실제로 값 튜플이 해당 이름의 속성이나 필드를 정의하지 않으며, 실제 이름은 여전히 ItemX이며, 모든 요소 이름은 런타임에 사용되지 않고 설계 및 컴파일 중에만 사용된다는 점입니다(따라서 이 유형의 직렬화 및 역직렬화 연산에 주의하세요);
- 일부 또는 모든 원소 튜플은 파괴 방법을 통해 더 편리하게 사용할 수 있습니다;
- 값 튜플은 참조 타입 튜플보다 더 효율적으로 사용할 수 있는 값 유형이며, 값 튜플은 이들이 같은지 비교할 수 있는 비교 방법을 가지고 있습니다. 자세한 내용은 다음과 같습니다:https://msdn.microsoft.com/en-us/library/system.valuetuple
|