이 포스팅은 Object Oriented Programming 시리즈 23 편 중 5 번째 글 입니다.
목차
Recursion Function
Factorial 같은 함수를 구현하기 위해서는, 자기자신의 출력값을 다시 불러야 되는 필요성이 있다. 이것을 재귀함수라 한다.
Example
#include <iostream>
using namespace std;
int factorial(int n);
int main(){
cout << factorial(0) << endl;
cout << factorial(1) << endl;
cout << factorial(6) << endl;
cout << factorial(10) << endl;
return 0;
}
int factorial(int n){
if (n == 0) // 제약조건
return 1;
else
return n * factorial(n-1);
}
이 과정을 알아보면,
factorial
6일 때, n-1 factorial
을 불러야 하므로 5 factorial
로 간다. 같은 방법으로 제약조건인 n==1
일 때까지 갔다가, 도착하면 순차적으로 값을 얻어와 최종 값을 반환한다.
factorial 연산 과정
Aliasing (Reference Variable)
기본적으로, 우리가 선언된 변수를 다른 변수에 할당하게 되면 이 값을 복사해서 사용하는 셈이 된다. 작은 값의 경우 복사를 해서 프로그램을 짜는 것이 문제가 없을 수 있지만, 구조체나 객체같은 경우 복사를 해서 쓴다면 메모리 낭비가 될 수 있다.
또한, 함수의 인자로 값을 그냥 넘겨준다면, 그 함수 내에서만 선언되는 지역변수들만 가지고 장난을 치게되어, 내가 원하는 결과, 원래 값 자체를 가지고 반환하는 것이 도출되지 않을 수 있다.
그렇기 때문에 우리는 내가 저장한 값 자체를 가리킬 필요성이 생기는데, C에서는 이걸 Pointer
로 가능하게 했었다. 하지만 포인터의 문제점 때문에, C++ 은 참조변수라는 새로운 개념을 도입한다. 포인터와 참조변수의 차이점과 장단점은 밑에서 다뤄보도록 하고 지금은 참조변수에 대해서 알아보자.
int x = 3;
int &r = x;
밑의 &r
이 참조 변수이다. 저렇게 할 경우 r은 x가 저장된 메모리공간을 동시에 가르키는 변수이다. 즉, x가 가리키는 3의 별명 이 생겼다고 생각하면 된다.
Example
#include <iostream>
int main(){
int x = 5;
int y = x;
int &r = x;
std::cout << "x = " << x << '\n';
std::cout << "y = " << y << '\n';
std::cout << "r = " << r << '\n';
x = 7;
std::cout << "---------------" << endl;
std::cout << "x = " << x << '\n';
std::cout << "y = " << y << '\n';
std::cout << "r = " << r << '\n';
return 0;
}
출력
// x = 5
// y = 5
// r = 5
// ---------------
// x = 7
// y = 5
// r = 7
x 값을 바꿨더니, r에는 바뀐 값이 들어간 것을 볼 수 있다. 반대로 y는 5라는 값이 그대로 들어가 있다. y는 x값을 복사해서 메모리에 넣은 것이고, r은 x의 메모리공간을 함께 뜻하고 있음을 알 수 있다.
여기서 여러 혼란이 올 수 있다. C에서는 &
는 저장된 값의 주소를 불러오는 방법이었다. 그런데 여기서는 참조변수라는 다른 이름을 가져다가 쓰고 있다. 같은 값을 가리킨다는 점에서 C언어에서 Pointer 가 생각났다.그런데 애매하게 다른 점이 있는 것 같다. 구체적으로 어떤점이 다를까?