완숙의 블로그

[C++] 5 - Functions #3 - Recursion Function, Reference Variable (재귀함수, 참조변수) 본문

Programing Language/C++

[C++] 5 - Functions #3 - Recursion Function, Reference Variable (재귀함수, 참조변수)

완숙 2019. 3. 20. 02:23

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);
}

 

이 과정을 알아보면,

 

스크린샷 2019-03-18 오후 11 52 20

 

6일 때, n-1 factorial 을 불러야 하므로

5 factorial 로 간다. 같은 방법으로 제약조건인 n==1 일 때까지

갔다가, 도착하면 순차적으로 값을 얻어와 최종 값을 반환한다.

 

스크린샷 2019-03-18 오후 11 53 57

 

이런 방식으로!

 

 

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의 메모리공간을 함께 뜻하고 있음을 알 수 있다.

 

여기서 여러 혼란이 올 수 있다.

  1. C에서는 & 는 저장된 값의 주소를 불러오는 방법이었다.

    그런데 여기서는 참조변수라는 다른 이름을 가져다가 쓰고 있다.

  2. 같은 값을 가리킨다는 점에서 C언어에서 Pointer 가 생각났다.

    그런데 애매하게 다른 점이 있는 것 같다.

    구체적으로 어떤점이 다를까?

 

다음글에서 정리해보도록 하자.

 

 

Comments