CodeGym /행동 /C# SELF /Value Tuple(값 튜플) 소개

Value Tuple(값 튜플) 소개

C# SELF
레벨 11 , 레슨 1
사용 가능

1. 소개

프로그래밍은 마치 캐리어 싸는 거랑 비슷해: 보통 한 가지가 아니라 여러 가지를 한 번에 넣어야 하잖아. 예를 들어, 양말이랑 핸드폰 충전기. 근데 두세 개 잠깐 넣으려고 새 캐리어(클래스는 나중에 배울 거야)를 굳이 만들고 싶진 않지. 가끔 함수에서 두세 개 값을 한 번에 반환해야 할 때도 있어. 그럴 땐 어떻게 해야 할까?

옛날 방식도 몇 가지 있어. 예를 들면 배열을 반환하기(int[] arr = {a, b};)나, 함수 하나만 쓰려고 클래스 필드를 만드는 거지. 그리고 더 복잡한 방법들도 있는데, 그건 다음 강의에서 다룰 거야(out 파라미터나 전역 변수로 넘기기 등). 근데 지금 당장, 더 쉽고, 간단하고, 요즘 스타일로 하고 싶잖아!

그래서 C# 7부터 값 튜플(Value Tuple)이 나왔어: 여러 타입의 값을 임시로 한 그룹으로 묶을 수 있는 엄청 편하고 간결한 문법이야. 별도의 데이터 타입 신경 안 써도 되고, 코드도 훨씬 깔끔해져.

2. 튜플(Value Tuples) 맛보기

튜플은 여러 가지 값을 한 "가방"에 쑤셔넣고 같이 들고 다닐 수 있게 해주는 프로그래머의 마법 같은 거야. 그냥 포스트잇에 메모하듯이 빠르게 묶는 거지 — 별도의 폴더(클래스) 만들 필요도 없어!

Value Tuple(System.ValueTuple)은 두 개에서 여덟 개까지 완전 다른 타입의 값을 담을 수 있는 카멜레온 구조체야. 숫자, 문자열, 불리언을 한 번에 넣고 싶어? 문제없어! 튜플은 까다롭지 않아.

여러 타입으로 튜플 만들기 예시


// tuple — 이건 (int, string, bool) - 레벨, 닉네임, 온라인 여부
var tuple = (42, "멋진_플레이어_2024", true);

봤지? 클래스도 필요 없고, 복잡한 절차도 없어! 그냥 괄호로 감싸고 콤마로 구분하면 끝. 이건 프로그래밍계의 패스트푸드야: 빠르고, 편하고, 딱 그 순간 필요한 것만.
그리고 제일 좋은 건 — 튜플은 "즉석"에서 바로 만들 수 있다는 거야. 함수에서 뭔가를 빠르게 반환하거나 데이터를 임시로 묶고 싶을 때 완전 딱이야. 굳이 클래스 만들 필요 없이, 간단하게 해결할 수 있지!

3. 튜플 문법과 기본 선언

가장 기본적인 버전부터 시작해보자: 요소에 이름 없이.

var point = (10, 20);
Console.WriteLine(point.Item1); // 10
Console.WriteLine(point.Item2); // 20
이름 없는 튜플: Item1, Item2로 접근

여기서 point는 두 개 요소(int, int)로 이루어진 튜플이야. 각 요소는 Item1, Item2 등(최대 Item7까지) 필드로 접근해. 만약 요소가 더 많으면, 여덟 번째부터는 Rest라는 특별한 필드에 들어가(이건 좀 이따 설명할게). 여기서 point.Item1point.Item2ValueTuple<int, int> 구조체의 필드 이름이고, 컴파일러가 자동으로 만들어줘.

var를 쓸까?


(int, int) point = (10, 20);
타입을 명시적으로 써도 돼

팁: var를 쓰면 C#이 타입을 알아서 잘 추론해줘서 편해. 근데 튜플임을 강조하고 싶으면 타입을 직접 써도 돼.

4. 튜플 요소에 이름 붙이기

솔직히 Item1이나 Item2는 무슨 의미인지 잘 모르겠지. 더 좋은 방법이 있어! 바로 요소에 이름을 붙이는 거야:

var person = (Name: "앨리스", Age: 20);
Console.WriteLine(person.Name); // 앨리스
Console.WriteLine(person.Age);  // 20
이름 붙인 튜플

이제 각 요소에 의미 있는 이름이 생겼지! 코드 읽기도 쉽고, IDE에서 자동완성도 잘 돼서 완전 편해.

이름 있는 거랑 없는 거 섞어도 돼?

응, C#에서는 섞을 수 있어. 근데 요소가 두 개 이상이거나, 각 값의 의미가 다르면 항상 이름 붙이는 게 좋아:

var data = (42, Name: "밥", true);
Console.WriteLine(data.Item1); // 42
Console.WriteLine(data.Name);  // 밥
Console.WriteLine(data.Item3); // true

5. 함수에서 튜플 반환하고 받기

가장 자주 쓰는 경우: 함수에서 값을 하나만 반환하는 게 아니라 여러 개를 한 번에 반환하고 싶을 때. 예를 들어, 문자열을 파싱하면서 숫자랑 성공 여부를 동시에 받고 싶을 때.

예시: 두 수의 합과 곱 계산하기

두 숫자를 받아서, 합과 곱을 동시에 반환하는 함수를 만들어야 한다고 해보자. 튜플 없이 하려면 out 파라미터(이건 나중에 배울 거야)를 쓰거나, 이 목적만을 위한 클래스를 만들어야 해(근데 Value Tuple의 취지랑 안 맞지).

함수에서 여러 값 튜플로 반환하기:


// 두 값(합, 곱)을 튜플로 반환하는 함수
(int sum, int product) CalculateSumAndProduct(int a, int b)
{
    return (a + b, a * b);
}

// 함수 호출
var calculationResult = CalculateSumAndProduct(10, 5);

// 결과 출력
Console.WriteLine($"합: {calculationResult.sum}");
Console.WriteLine($"곱: {calculationResult.product}");

6. 튜플의 제한사항과 특징

완벽해 보이는 것도 다 사소한 단점이 있지. 같이 알아보자.

요소 개수

C# 튜플은 7개까지 직접 지원해. 그 이상이면 여덟 번째부터는 중첩 튜플(Rest)로 들어가. 근데 이렇게까지 해야 한다면, 그냥 구조체나 클래스를 만드는 게 나을 수도 있어.

var bigTuple = (1, 2, 3, 4, 5, 6, 7, 8);

// .NET이 여덟 번째 요소부터 자동으로 중첩 튜플로 만들어줘
Console.WriteLine(bigTuple.Item8); // 8

변경 가능성

ValueTuple은 변경 가능한 구조체야! 만들고 나서도 필드 값을 바꿀 수 있어(근데 너무 남발하면 코드가 꼬일 수 있으니 조심).

var t = (a: 1, b: 2);
t.a = 5; // 이렇게 바꿔도 돼!

7. 실제 프로젝트와 면접에서 튜플이 왜 필요할까?

튜플은 함수에서 여러 값을 한 번에 반환할 때, 추가 클래스나 구조체 없이 빠르고 쉽게 쓸 수 있어. 특히, 데이터를 즉석에서 묶어야 할 때 — 예를 들어 컬렉션에서 뭔가 뽑거나 필터링할 때, 테스트 코드, 임시 계산 등에서 완전 유용해.

그리고 튜플은 결과를 여러 변수로 바로 분해(deconstruct)할 때도 좋아(LINQ 쿼리 결과 등). 코드가 훨씬 읽기 쉽고 간결해지거든.

주니어 개발자 면접에서 자주 나오는 질문: "함수에서 여러 값을 한 번에 반환하려면 어떻게 해?" — 이때 ValueTuple을 쓰면 정답이야. 그리고 이게 이름 붙이기랑 분해도 지원하는 구조체라는 점, 예전의 참조형 Tuple<T1, T2>랑 다르다는 것도 알아두면 좋아.

근데 만약 오래 저장해야 하거나, 비즈니스 로직에 중요한 데이터거나, 반환 필드가 너무 많으면(7개 초과) 그냥 의미 있는 속성으로 구성된 클래스나 구조체를 만드는 게 더 좋아.

8. 흔한 실수와 주의할 점

실수 1: 튜플 요소 이름 오타.
Item1, Item2 같은 필드와 이름 붙인 요소들은 ValueTuple 타입에 저장돼. 만약 이름을 잘못 쓰면, 코드는 컴파일되지만 실행 중에 에러가 나거나 IDE에서 해당 속성을 못 찾을 수 있어. 항상 이름을 정확히 맞춰 써!

실수 2: 분해할 때 원래 이름이 안 남음.
이름 없는 튜플을 var (first, second) = tuple;로 분해하면, firstsecond는 지역 변수로 새로 만들어지고, 원래 Item1/Item2는 이름이 없어. 헷갈리지 않으려면 처음부터 의미 있는 이름으로 튜플을 선언하는 게 좋아:

var tuple = (X: 5, Y: 10);
var (x, y) = tuple;  // x == 5, y == 10

실수 3: struct 의미를 과소평가함.
ValueTuple은 구조체라서, 함수에 넘기거나 대입하면 복사돼. 함수 안에서 바꿔도 원본 튜플엔 영향이 없어. "원본이 바뀌길" 기대한다면, 반환값을 쓰거나 참조형 타입을 써야 해.

2
과제
C# SELF, 레벨 11, 레슨 1
잠금
간단한 튜플 생성 및 사용하기
간단한 튜플 생성 및 사용하기
2
과제
C# SELF, 레벨 11, 레슨 1
잠금
메서드에서 튜플 반환하기
메서드에서 튜플 반환하기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION