함수에서 여러 값을 반환하는 방법
C나 C++에서는 기본적으로 함수가 한 번에 하나의 값만 반환할 수 있습니다. 여러 값을 반환해야 할 때 예전에는 포인터나 참조를 이용한 출력 매개변수(output parameter)를 함께 넘겨야 했지만, C++에서는 STL이 제공하는 튜플(tuple)과 페어(pair)를 활용하면 훨씬 깔끔하게 해결할 수 있습니다.
튜플(Tuple)과 페어(Pair)란?
튜플(tuple)은 여러 개의 요소를 하나로 묶어 담을 수 있는 객체입니다. 각 요소는 서로 다른 타입이어도 되며, 담을 수 있는 값의 개수에도 사실상 제한이 없습니다.
페어(pair)는 두 개의 값을 하나의 세트로 묶는 객체입니다. 두 값의 타입이 달라도 상관없으며, 정확히 두 개의 값만 가질 수 있다는 점에서 '요소가 두 개뿐인 특수한 형태의 튜플'이라고 볼 수 있습니다.
그럼 실제 예제를 통해 튜플과 페어가 어떻게 동작하는지 살펴보겠습니다.
예제 코드
#include<iostream>
#include<tuple>
#include<utility>
using namespace std;
// 값들을 묶어 튜플로 만든 뒤 반환하는 함수
tuple<int, string, char> my_function_tuple(int x, string y) {
return make_tuple(x, y, 'A');
}
// 값들을 묶어 페어로 만든 뒤 반환하는 함수
std::pair<int, string> my_function_pair(int x, string y) {
return std::make_pair(x, y);
}
main() {
int a;
string b;
char c;
// tie()로 튜플의 요소들을 각 변수에 언패킹
tie(a, b, c) = my_function_tuple(48, "Hello");
// 함수가 반환한 페어를 받아옴
pair<int, string> my_pair = my_function_pair(89, "World");
cout << "Values in tuple: ";
cout << "(" << a << ", " << b << ", " << c << ")" << endl;
cout << "Values in Pair: ";
cout << "(" << my_pair.first << ", " << my_pair.second << ")" << endl;
}
실행 결과
Values in tuple: (48, Hello, A) Values in Pair: (89, World)
코드 핵심 정리
- make_tuple() : 인자로 전달한 값들을 묶어 튜플을 생성합니다.
- make_pair() : 인자로 전달한 두 값을 묶어 페어를 생성합니다.
- tie(a, b, c) : 함수가 반환한 튜플을 받아 각 요소를 변수 a, b, c에 풀어 넣습니다(언패킹).
- 페어의 값은
.first(첫 번째),.second(두 번째) 멤버로 접근합니다.
더 알아두기 : C++17 구조적 바인딩
C++17부터는 tie() 대신 구조적 바인딩(structured bindings) 문법을 사용해 더욱 간결하게 표현할 수 있습니다.
auto [a, b, c] = my_function_tuple(48, "Hello"); // 튜플 언패킹
또한 std::get<인덱스>(튜플)을 사용하면 특정 위치의 요소에 직접 접근할 수 있습니다. 예를 들어 std::get<0>(t)는 튜플 t의 첫 번째 요소를 반환합니다. 이처럼 튜플과 페어를 활용하면 출력 매개변수 없이도 함수의 결과를 명확하고 안전하게 여러 개 전달할 수 있습니다.