Learning
When: 1학년 8월 24일
How:
파이썬을 학교에서 공부하게 되었는데, 유용해 보여서 C#에는 튜플이 없나 궁금해져 검색을 해보고 튜플이 있다는 것을 알았습니다. 생각보다 어렵지도 않고 쓰일 것 같아서 공부하게 되었습니다.
Understanding:
- 설명 : 튜플은 작은 구조체 같은 형식입니다. 튜플도 구조체와 같이 여러 타입을 담을 수 있는 변수이기 때문인데,
튜플은 따로 클래스 선언 같은 것을 해주지 않아도 그냥 변수를 넣을 수 있기 때문에 간단하고 편합니다.
하지만 선언이 없다는 것은 간단하다는 장점이 있지만 동시에 아무런 제한을 걸 수도 없다는 뜻이기 때문에
간단한 구조체라고는 부르기 힘들 것 같습니다. 말로 하면 좀 어려워 보일 수 있지만
그냥 변수에 여러 타입의 값을 넣을 수 있다는 것만 알아 두시면 됩니다. - 사용 : 아래의 코드에 튜플을 사용할 때 알아야 할 것들을 간단히 정리해 보았습니다.
- 선언과 사용 : 튜플은 선언하는 방법이 정말 다양한데, 튜플 변수에만 이름이 있을 수도 있고,
튜플의 필드(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) - var 키워드 사용 : 튜플도 var 키워드를 사용해 컴파일러가 추론하게 할 수 있습니다.
t1 튜플은 (int a, string b)로 구성된 튜플이기에 알아서 자동으로 필드의 타입은 물론 이름까지
복사하여 타입을 추론해줍니다. 참고로 튜플은 값 형식이기 때문에 t2 = t1을 한다고 해도
t2가 t1의 인스턴스를 참조하는 것은 아닙니다. - 메서드를 사용 : 메서드의 반환 형식이 튜플일 수도 있습니다. 3번 코드의 GetTuple() 메서드를 보시면
반환 형식이 (int c, int d) 라는 것을 알 수 있습니다. 이것도 그냥 int, int로 쓸 수 있지만
그렇게 하면 var t2 = GetTuple(); 같은 코드를 쓸 때 필드에 이름이 따로 없게 됩니다.
그렇기에 메서드에서 이름을 먼저 짓고 그것을 반환하면 튜플에 이름을 지어줄 수 있습니다.
하지만 3번 코드처럼 이미 튜플에 이름이 있다면 원래 있던 이름을 사용하게 됩니다.
4번에 나올 2가지 변수에 동시 대입과 메서드 사용을 섞어서 메서드를 이용해 한번에 2가지 값을 반환해
할당시키는 코드도 가능합니다. - 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 |