튜플이란 무엇인가?
공식문서의 설명은 다음과 같다.
C# 7.0 이상에서 사용할 수 있는 ‘튜플’ 기능은 간단한 데이터 구조로 여러 데이터 요소를 그룹화하는 간결한 구문을 제공합니다. 다음 예제에서는 튜플 변수를 선언하고 초기화하며 관련 데이터 멤버에 액세스하는 방법을 보여 줍니다.
튜플은 간단히 데이터 그룹이라고 생각하면 될 것 같다.
어떻게 사용할 수 있는가?
튜블은 다양한 선언 방법이 있고, 모두 상대적으로 간단하게 사용할 수 있다.
선언 및 초기화 방법은 아래와 같다.
//데이터 타입과 변수명 지정
(int, string) exam1 = (0, "zero");
//변수명만 지정
var exam2 = (1, "one");
//명시적 선언
ValueTuple<int, string> exam3 = new ValueTuple<int, string>(2, "two");
딕셔너리의 키 - 밸류처럼 튜플에서 각 아이템은 Item1, Item 2...로 필드 이름이 기본으로 정해져 있다.
하지만 생성시에 명시적으로 필드 이름을 할당할 수 있다.
다음 예제를 살펴보자.
//기본값
var exam4 = (4, "four");
Debug.Log(exam1.Item1);
Debug.Log(exam1.Item2);
//명시적 지정
var exam5 = (arabic: 5, eng: "five");
Debug.Log(exam5.arabic);
Debug.Log(exam5.eng);
튜블은 왜 사용하는 것인가?
생김새가 딕셔너리와 비슷하고 리스트처럼 데이터를 담을 수 있기 때문에 필요성을 못 느낄 수 있다.
하지만 한 번에 여러 개의 정보를 갖고 있는 것은 분명한 강점이다.
예를 들어, 기존의 경우 함수에서 하나가 아닌 복수개의 데이터를 반환하고자 할 때 return값을 통한 반환뿐만 아니라 out 키워드를 사용하여 전달해왔다. 하지만 튜플을 사용하면 out 키워드를 사용하지 않고 동일한 결과를 return 값으로만 전달할 수 있다.
아래는 튜플을 사용하지 않고 out 키워드를 사용한 방법의 예시이다.
public class Fruit
{
public string name;
public int sugarContent;
public int volume;
public bool TryPutInToBlender<T>(out T someFruit) where T : Fruit
{
someFruit = default;
if (this is Juice juice)
{
juice.AddSomeWater();
juice.AddSomeSugar();
someFruit = juice as T;
return true;
}
return false;
}
}
public class Juice : Fruit
{
public void AddSomeSugar()
{
sugarContent += 10;
Debug.Log("Sugar Added!");
}
public void AddSomeWater()
{
volume += 10;
Debug.Log("Water Added!");
}
}
위 스크립트는 Fruit 클래스와 Fruit을 상속받는 Juice 클래스이다.
만약 bool 값을 반환 값으로 가지면서 Juice 클래스 타입을 함께 리턴 받고 싶다면 out 키워드를 사용하여 다음과 같이 사용해야 한다.
void Start()
{
Fruit apple = new Juice();
apple.name = "apple juice";
apple.sugarContent = 20;
if (apple.TryPutInToBlender<Juice>(out Juice appleJuice))
{
appleJuice.sugarContent += 5;
Debug.Log(appleJuice.sugarContent);
}
}
out 키워드를 사용한 실행 결과는 다음과 같다.
반면 튜플을 사용하면 다음과 같이 나타낼 수 있다.
void Start()
{
Fruit banana = new Juice();
banana.name = "banana juice";
banana.sugarContent = 10;
var bananaJuice = banana.TryFruitAsJuice();
if (bananaJuice.canItBeJuice)
{
bananaJuice.kind.sugarContent += 10;
Debug.Log(bananaJuice.kind.sugarContent);
}
}
튜플을 사용한 실행 결과는 다음과 같다.
두 개의 차이점이 눈에 띄는가?
비록 예제에서는 bool과 Fruit, 2개의 요소만을 튜플이 갖도록 했으나 그 이상도 충분히 가능하다.
만약 여러 개의 요소를 갖는 튜플을 리턴하도록 했다면 더 많은 값을 반환하게 된다.
'C# 프로그래밍 > 문법 개념' 카테고리의 다른 글
[C#] 오브젝트 (Object) (0) | 2022.05.27 |
---|---|
[C#] 박싱과 언박싱 (Boxing & Unboxing) (0) | 2022.05.27 |
[C#] 패턴 일치 (Pattern matching) (0) | 2022.05.26 |
[C#] 추상화 (Abstraction) (0) | 2022.05.26 |
[C#] 이벤트 (Event) (0) | 2022.05.20 |