[C#] 튜플

Learning 

When: 1학년 8월 24일

 

How:

파이썬을 학교에서 공부하게 되었는데, 유용해 보여서 C#에는 튜플이 없나 궁금해져 검색을 해보고 튜플이 있다는 것을 알았습니다. 생각보다 어렵지도 않고 쓰일 것 같아서 공부하게 되었습니다.

 

Understanding:

  • 설명 : 튜플은 작은 구조체 같은 형식입니다. 튜플도 구조체와 같이 여러 타입을 담을 수 있는 변수이기 때문인데,
    튜플은 따로 클래스 선언 같은 것을 해주지 않아도 그냥 변수를 넣을 수 있기 때문에 간단하고 편합니다.
    하지만 선언이 없다는 것은 간단하다는 장점이 있지만 동시에 아무런 제한을 걸 수도 없다는 뜻이기 때문에
    간단한 구조체라고는 부르기 힘들 것 같습니다. 말로 하면 좀 어려워 보일 수 있지만
    그냥 변수에 여러 타입의 값을 넣을 수 있다는 것만 알아 두시면 됩니다.
  • 사용 : 아래의 코드에 튜플을 사용할 때 알아야 할 것들을 간단히 정리해 보았습니다.
    1. 선언과 사용 : 튜플은 선언하는 방법이 정말 다양한데, 튜플 변수에만 이름이 있을 수도 있고,
      튜플의 필드(1, "10" 같은 값)에도 이름이 있을 수도 있습니다. 그리고 var를 사용하거나 변수를 필드에
      대입하는 등 다양한 방식으로 튜플 변수를 선언할 수 있기 때문에 상황에 맞춰 생성해야 합니다.
      아래의 코드에는 필드에 a,b라는 이름이 있지만, (int a, string b) 이것을 (int, string) 으로도 할 수 있고
      2번처럼 var를 사용하여 필드에 이름을 지어주지 않을 수 있습니다.
      하지만 이름을 짓지 않는다면 배열처럼 t1[0] 이렇게 접근하는 방법 밖에는 없다는 생각이 드실 수 있는데,
      모든 튜플의 필드는 자동으로 Item(필드 번호)라는 이름이 붙습니다.
      1번 코드를 보시면 a는 t1.a로 접근하고 b는 t1.Item2라는 이름으로 t1.b에 접근했는데,
      이름이 있던 없던 Item이라는 이름이 붙기 때문에 가능한 코드입니다. (t1.b == t1.Item2)
    2. var 키워드 사용 : 튜플도 var 키워드를 사용해 컴파일러가 추론하게 할 수 있습니다.
      t1 튜플은 (int a, string b)로 구성된 튜플이기에 알아서 자동으로 필드의 타입은 물론 이름까지
      복사하여 타입을 추론해줍니다. 참고로 튜플은 값 형식이기 때문에 t2 = t1을 한다고 해도
      t2가 t1의 인스턴스를 참조하는 것은 아닙니다.
    3. 메서드를 사용 : 메서드의 반환 형식이 튜플일 수도 있습니다. 3번 코드의 GetTuple() 메서드를 보시면
      반환 형식이 (int c, int d) 라는 것을 알 수 있습니다. 이것도 그냥 int, int로 쓸 수 있지만
      그렇게 하면 var t2 = GetTuple(); 같은 코드를 쓸 때 필드에 이름이 따로 없게 됩니다.
      그렇기에 메서드에서 이름을 먼저 짓고 그것을 반환하면 튜플에 이름을 지어줄 수 있습니다.
      하지만
      3번 코드처럼 이미 튜플에 이름이 있다면 원래 있던 이름을 사용하게 됩니다.
      4번에 나올 2가지 변수에 동시 대입과 메서드 사용을 섞어서 메서드를 이용해 한번에 2가지 값을 반환해 
      할당시키는 코드도 가능합니다.
    4. 2가지 변수에 동시 대입 : 튜플을 사용해서 한번에 2개의 변수에 값을 대입할 수도 있습니다.
      4번 코드를 보면 (a, b) = (1, "10"); 라는 코드를 볼 수 있는데, 이 코드는 언뜻 보면
      튜플을 만드는 것 같이 보이지 않을 수 있는데, 순서를 설명하자면 (a, b)로 이루어진
      임시 튜플을 하나 만듭니다. 그리고 그 임시 튜플에 튜플로 이루어진 1과 "10"이라는 값을 할당합니다.
      그 후, 임시 튜플은 분해되어 a와 b라는 변수만 남습니다.
      이게 좀 어렵기는 하지만 튜플에 이름이 없기 때문에 임시 튜플이 만들어지고,
      할당만 시킨 후에 자동으로 분해된다는 순서만 알고 있다면 될 것 같습니다.
// 1. 선언과 사용
(int a, string b) t1 = (1, "10");
Console.WriteLine(t1.a + int.Parse(t1.Item2)); // 11이 출력됩니다.

// 2. var 키워드 사용
var t2 = t1;
//var t2 = (a: 10, b: "10"); 이것도 가능
Console.WriteLine(t2.a + int.Parse(t2.b)); // 11이 출력됩니다.

// 3. 메서드를 사용
(int a, int b) t3 = GetTuple();
Console.WriteLine(t3.a + t3.Item2); // 150이 출력됩니다.

(int c, int d) GetTuple()
{
    return (100, 50);
}

// 4. 2가지 변수에 동시 대입
int a = 10;
string b = "1";

(a, b) = (1, "10"); // (1, "10") 이라는 튜플이 분해되어 a와 b로 각각 대입됩니다.
Console.WriteLine(a + int.Parse(b)); // 11이 출력됩니다.

 

Result: 이런 형식이 있는 지도 몰랐기 때문에 바로는 자주 쓰일지 의외로 안 쓰일지 잘 모르겠지만 특히 2개의 값을 반환하는 메서드와 그것을 활용하는 변수에 동시 대입을 제대로 쓴다면 가끔 코드의 수를 확 줄여줄 것 같아 까먹으면 안될 것 같습니다.

'C#' 카테고리의 다른 글

[C#] 얕은 복사(Shallow copy)와 MemberwiseClone() 메서드  (1) 2025.08.26
[C#] object 타입  (0) 2025.08.25
[C#] 식 본문 멤버  (0) 2025.08.23
[C#] 인덱서(Indexer)  (0) 2025.08.22
[C#] where 키워드 (Generic 제한)  (0) 2025.08.20