반응형
참고
- 포인터와 참조자
어떤 함수를 호출해서 이름, 나이, 몸무게를 알고 싶다고 하자.
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;
}
반응형
'개발 > C, C++' 카테고리의 다른 글
C, C++ - 비트 연산 기본 매크로 함수 (bit macro : get, set, clear, toggle, check) (0) | 2023.07.29 |
---|---|
C, C++ - 비트 단위로 출력하기 (Print Bit) (0) | 2023.06.03 |
scanf를 이용해 정수 1칸 입력 받기 (0) | 2023.03.26 |
비트 on / off (0) | 2023.01.24 |
N x N 2차원 배열 뒤집기, 회전하기 (Rotate, Flip 2D Array) (0) | 2022.11.27 |
댓글