코딩 테스트를 풀다가 알게 된 튜플 자료형.
프로그래머스 방문 길이를 풀면서 어떻게 좌표를 저장할지 고민하던 찰나에 리스트에 좌표값 x, y를 저장하고 싶어 구글링 하다가 stackoverflow에서 나와 같은 궁금증을 가진 사람의 질문을 발견했다.
답변을 통해 List<(int, int)> 로 좌표를 저장해 두고 풀었다가 테스트 케이스만 통과되고 틀렸기에 접근 방법을 다시 바꿨다. 간선을 지나왔는지를 체크하는 bool 2차원 배열을 가로, 세로로 나누어서 해결했다.
그래도 이 문제를 통해 새로운 튜플 형식을 찾게 됐기에 기억해 두기 위해 정리해 둔다.
튜플 형식
튜플 기능 | 간단한 데이터 구조에서 여러 데이터 요소를 그룹화하는 갈결한 구문 제공. 소괄호로 데이터를 묶음 |
튜플 형식 | 값 형식이며 튜플요소는 공용 필드 >> "변경 가능한" 값 형식. |
튜플 구조 | (자료형, 자료형) 변수이름 = (자료형 값, 자료형 값); |
튜플의 가장 일반적인 사례 | 메서드 반환형식. out메서드 매개변수를 정의하는 대신 메서드 결과를 튜플 반환형식으로 그룹화 할 수 있음. (예제 참고 : https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/value-tuples#tuple-assignment-and-deconstruction) |
선언 방식
튜플 필드의 기본 이름 | (int, string) player = (4 , "Nam"); // player.Item1 = 4, player.Item2 = "Nam" |
튜플 필드의 이름 지정 | (int level, string name) player = (4 , "Nam"); // player.level = 4, player.name = "Nam" |
튜플 형식의 별칭 지정 | using 사용 global using BandPass = (int Min, int Max); BandPass bracket = (40, 100); // bracket.Min = 40, bracket.Max = 100 |
튜플 할당 및 분해
튜플 형식간에 할당을 위해서는 일단 두 튜플형식의 요소수가 동일해야 되며, 요소의 형식이 동일하거나 암시적 변환 가능해야 됨.
할당 | (int, double) t1 = (17, 3.14); (double First, double Second) t2 = (0.0, 1.0); t2 = t1; Console.WriteLine($"{nameof(t2)}: {t2.First} and {t2.Second}"); // Output: // t2: 17 and 3.14 (double A, double B) t3 = (2.0, 3.0); t3 = t2; Console.WriteLine($"{nameof(t3)}: {t3.A} and {t3.B}"); // Output: // t3: 17 and 3.14 |
튜플 요소값의 튜플 요소의 순서에 따라 할당, 튜플 필드의 이름은 무시되며 할당되지 않는다. | |
분해 | 대입연산자를 사용하여 튜플 인스턴스를 개별 변수로 분해 가능. |
var t = ("post office", 3.6); (string destination, double distance) = t; Console.WriteLine($"{destination}, {distance}"); // Output: // post office, 3.6 |
|
특정 필드가 필요없다면 _를 입력하여 무시하고 분해 가능. | |
var t = (name: "Nam" , level: 100); var (Name , _) = t; // level 무시 Console.WriteLine($"{Name}"}; //Output: //Nam |
연산자 != , == 지원
튜플 요소 순서에 따라 왼쪽 피연산자의 멤버와 오른쪽 피연산자의 해당 멤버를 비교할 수 있다.
이에 따른 bool값을 사용할 수 있다.
단, 두 튜플의 요소 수가 동일해야 된다.
튜플과 System.Tuple 은 다르다!
지금까지 말한 튜플형식 == System.ValueTuple System.Tuple 형식 값 형식(값 변경 가능) 참조 형식(변경 불가능)
(그럼에도 형식 내의 개별 요소들은 모두 변경 가능한 타입이 될 수 있음.
>>
이런 특성은 마치 readonly필드처럼 변경 가능의 여지를 일부 남겨두고 있다 생각하는 것이 좋음.)데이터 멤버 필드 속성 참고링크 위의 예제 참고 링크 https://codingcoding.tistory.com/18
728x90
반응형
'c#' 카테고리의 다른 글
c# 다차원 배열과 가변배열 (0) | 2023.12.15 |
---|---|
Invoke 와 BeginInvoke의 차이점 (1) | 2023.12.14 |
async 와 await 키워드(비동기 함수) (0) | 2023.04.07 |
TCP VS UDP (0) | 2023.03.08 |
객체지향 프로그래밍 (0) | 2023.03.08 |