본문 바로가기

C# 프로그래밍/문법 개념

[C#] 튜플과 딕셔너리 (Tuple & Dictionary)

반응형

튜플이란 무엇인가?

공식문서의 설명은 다음과 같다.

 

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