본문 바로가기
개발/C, C++

C++ - 튜플로 여러 값 반환하기 (Returning Multiple Values Using Tuple)

by 피로물든딸기 2023. 4. 15.
반응형

C, C++ 전체 링크

 

참고

- 포인터와 참조자

- C# 튜플로 여러 값 반환하기

 

어떤 함수를 호출해서 이름, 나이, 몸무게를 알고 싶다고 하자.

 

C에서는 포인터를 이용하여 여러 값을 얻을 수 있다. (당연히 string은 사용하지 못한다.)

void getInfo(string* name, int* age, int* weight)
{
	*name = "blood";
	*age = 20;
	*weight = 70;
}

 

그리고 getInfo에 변수의 주소를 넘겨주면 된다.

getInfo(&name, &age, &weight);

 

C++이라면 참조자를 이용할 수 있다.

void getInfo(string& name, int& age, int& weight)
{
	name = "blood";
	age = 20;
	weight = 70;
}

 

이때 getInfo는 아래와 같이 수정하면 된다.

getInfo(name, age, weight);

 

예시 코드는 다음과 같다.

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

void getInfo(string* name, int* age, int* weight)
{
	*name = "blood";
	*age = 20;
	*weight = 70;
}

void getInfo(string& name, int& age, int& weight)
{
	name = "blood";
	age = 20;
	weight = 70;
}

int main(void)
{
	string name;
	int age;
	int weight;

	//getInfo(&name, &age, &weight);
	getInfo(name, age, weight);
	
	cout << "name   : " << name << endl;
	cout << "age    : " << age << endl;
	cout << "weight : " << weight << endl;

	return 0;
}


구조체

 

여러 값을 반환받는 경우는 구조체를 사용할 수 있다.

변수가 많을수록  구조체를 사용하는 것이 관리하기 편하다.

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

struct INFO
{
	string name;
	int age;
	int weight;
};

INFO getInfo()
{
	INFO ret;

	ret.name = "blood";
	ret.age = 20;
	ret.weight = 70;

	return ret;
}

int main(void)
{
	INFO info = getInfo();

	cout << "name   : " << info.name << endl;
	cout << "age    : " << info.age << endl;
	cout << "weight : " << info.weight << endl;

	return 0;
}

 

또는 간결하게 아래와 같이 getInfo를 수정할 수 있다.

INFO getInfo()
{
	return { "blood", 20, 70 };
}

 

하지만 구조체를 사용하려면 구조체를 선언해야하는 단점이 있다.


튜플

 

C#에서 튜플로 여러 값을 반환한 방법으로 C++도 튜플을 사용할 수 있다.

 

튜플을 생성하는 방법은 아래와 같다.

tuple<string, int, int> info = make_tuple("blood", 20, 70);

 

그리고 get 메서드를 이용해 get<번호>(튜플)로 해당하는 값을 얻을 수 있다.

cout << "name   : " << get<0>(info) << endl;
cout << "age    : " << get<1>(info) << endl;
cout << "weight : " << get<2>(info) << endl;

 

get을 이용해서 번호가 아닌 각각 변수(name, age, weight)로 풀어쓰고 싶다면 tie를 사용하면 된다.

	tuple<string, int, int> info2 = getInfo();

	string name; int age; int weight;

	tie(name, age, weight) = info2;

	cout << "name   : " << name << endl;
	cout << "age    : " << age << endl;
	cout << "weight : " << weight << endl;

 

만약 튜플에서 특정 변수를 받고 싶지 않다면 ignore 키워드를 추가하면 된다.

	string name; int age; int weight;

	age = 0;
	tie(name, ignore, weight) = info2;

	cout << "name   : " << name << endl;
	cout << "age    : " << age << endl;
	cout << "weight : " << weight << endl;

 

전체 코드는 다음과 같다.

#include <stdio.h>
#include <iostream>
#include <string>
#include <tuple>

using namespace std;

tuple<string, int, int> getInfo()
{
	return make_tuple("straw", 30, 80);
}

int main(void)
{
	tuple<string, int, int> info1 = make_tuple("blood", 20, 70);

	cout << "name   : " << get<0>(info1) << endl;
	cout << "age    : " << get<1>(info1) << endl;
	cout << "weight : " << get<2>(info1) << endl;

	/* --------------------------------------------- */
	putchar('\n');

	tuple<string, int, int> info2 = getInfo();

	string name; int age; int weight;

	tie(name, age, weight) = info2;

	//age = 0;
	//tie(name, ignore, weight) = info2;

	cout << "name   : " << name << endl;
	cout << "age    : " << age << endl;
	cout << "weight : " << weight << endl;

	return 0;
}

반응형

댓글