다음과 같은 함수가 있다 가정해보자.
int function(int n){
cout<<"출력문\n";
return 상수값;
}
함수 호출 시, 해당 함수 내부의 cout문과 return 값은 뭔 차이가 있을까?
확실히 기억이 안 나지만, 경험 기반 예측을 해보고 실제 코드로 확인해보자.
내 경험 기반 예측은
cout은 함수 호출을 그냥 해도 나오는 애들
return은 변수=함수 호출; 형식으로 지정해주고, 변수를 출력해야 return 값이 나온다. 물론 변수=함수 호출;할 때, 함수 내부의 cout 문도 출력 된다.
이게 맞는지 확인해보자.
또한 재귀함수로써 return 값이 recur(n-1); 이런 식이면, return 값은 recur(n-1)값만 출력하는지, recur(n-1)을 실행하면서 recur(n-1)의 return 값인 recur(n-2)부터 recur(1)까지 역으로 연쇄적으로 출력하는지 보자. 아무래도 전자일 것이라고 예상한다.
#include <iostream>
using namespace std;
void func1(int n) {
if (n == 0) return;
cout << n << ' ';
func1(n - 1);
}
int func2(int n)
{
if (n == 0)return 0;
return n + func2(n - 1);
}
int main(void) {
int temp;
cout << "함수만 부름\n";
cout << "func1 출력해보면";
func1(4);
cout << "\n";
cout << "func2 함수만 호출해보면 ";
func2(4);
cout << "이 나오고\n int에다가 따로 저장해서 출력해보자.\n";
temp = func2(4);
cout << "따로 int형 변수에다 저장 시, "<<temp<<"이 나온다.\n";
/*즉 func2(n - 1), func2(n - 1), ... func2(1)의 return 값을 주지 않고
func2(n)의 return 값만 출력해준다. */
return 0;
}
출력결과는 다음과 같다.
함수만 부름
func1 출력해보면 4 3 2 1
func2 함수만 호출해보면이 나오고
int에다가 따로 저장해서 출력해보자.
따로 int형 변수에다 저장 시, 10이 나온다.
func1(4);부터 먼저 출력을 했다.
void func1(int n) {
if (n == 0) return;
cout << n << ' ';
func1(n - 1);
}
func1(4) {cout이 4를 출력하고 func1(n-1)을 부른다. }
func1(n-1);인 func(3)을 실행하면 cout에 따라 3을 출력하고...
이런 식으로 연쇄적으로 함수 인자를 -1 씩 줄여가며 cout 문을 수행한다.
이거는 함수 반환 인자를 추가해서 테스트도 필요하다.
다음에는 func2를 호출할 것 인데,
func2는 반환인자가 있다. 대신에 cout 출력문이 없다.
다음과 같이
func2(4);
로만 쓰면 아무것도 출력이 안된다. return 값도 출력이 되지 않는다.
그러고 int temp라는 변수에 func2(4)를 따로 저장하여, int temp를 출력해보자.
그러면 10이 반환되는데 이는 n=4일 때 return 값이다.
n이 4일 때, return 값은 n+func2(n-1)이므로 4+func2(3) 해서 10이 되는 거다.
여기서 알 수 있는 점은, func2(4)를 불러서 return 값으로 4+func2(3)을 돌려준다 할 때, 4+func2(3)의 값만 돌려주지, func2(3)의 return 값부터 func2(2), func2(1)의 return 값을 돌려주지는 않다는 것이다.
cout문을 추가한 코드는
int func2(int n)
{
if (n == 0)return 0;
cout << "지금 인자는 " << n << "입니다. \n";
return n + func2(n - 1);
}
테스트를 위한 main 코드는
int main(void) {
int temp;
cout << "\n";
cout << "func2 함수만 호출해보면";
func2(4);
cout << "이 나오고\n int에다가 따로 저장해서 출력해보자.\n";
temp = func2(4);
cout << "따로 int형 변수에다 저장 시, "<<temp<<"이 나온다.\n";
/*즉 func2(n - 1), func2(n - 1), ... func2(1)의 return 값을 주지 않고
func2(n)의 return 값만 출력해준다. */
return 0;
}
출력 결과는
func2 함수만 호출해보면지금 인자는 4입니다.
지금 인자는 3입니다.
지금 인자는 2입니다.
지금 인자는 1입니다.
이 나오고
int에다가 따로 저장해서 출력해보자.
지금 인자는 4입니다.
지금 인자는 3입니다.
지금 인자는 2입니다.
지금 인자는 1입니다.
따로 int형 변수에다 저장 시, 10이 나온다.
func2(4);와 temp=func2(4);를 하면
4부터 1까지의 인자에 대한 return 값인 피보나치 수 10, 6, 3, 2는 안 나온다.
하지만 인자가 n일 때, return 값은 n+func2(n-1);이므로 func2(n-1)을 실행하면서 cout문인 지금 인자는 3입니다 를 출력한다.
func2(3)의 return 값이 3+func2(2)이므로 func2(2)를 실행하면서 cout문인 지금 인자는 2입니다 를 출력한다.
출력문을 통해서 temp=func2(4);를 할 때도 func2(4) 내부의 cout문과 func2(3), func2(2), func2(1) 내부의 cout문 모두 출력됨을 알 수 있다.
temp=func2(4);를 하고 나면, temp에다가 int 값을 저장하게 된다.
temp를 main 함수 내에서 cout문으로 출력하면 return 값이 출력이 된다. 즉, 앞서 말한 것처럼 temp 같은 변수에다가 저장하면 return 값이 출력이 되는데, 이번 테스트를 통해 cout문은 안 나옴을 알 수 있다. 그리고 return 값에 재귀함수가 있다 하더라도 n이 인자일 때의 return 값 10만 출력함을 알 수 있다.
뭔가 부족하여 테스트를 더했다.
코드는
int func2(int n)
{
cout << "출력문 확인";
if (n == 0)return 0;
return n + func2(n - 1);
}
int main(void) {
func2(4);
cout << "이번에는 cout으로 뽑겠다.";
cout << func2(4);
}
출력 결과는
출력문 확인출력문 확인출력문 확인출력문 확인출력문 확인이번에는 cout으로 뽑겠다.출력문 확인출력문 확인출력문 확인출력문 확인출력문 확인10
분석해보자면, 그냥 func2(4)면 return 값은 안 준다. 함수 내부의 cout문(출력문)만 나온다.
main 함수에서 cout으로 형식자를 지정해서 출력을 하면
함수 내부 출력문(printf, cout 등으로 지정)과 해당 인자에 대한 return 값이 화면에 뜨게 된다.