이 포스팅은 Object Oriented Programming 시리즈 23 편 중 5 번째 글 입니다.

  • Part 1 - 01: Introduction
  • Part 2 - 02: Identifier, Variable, constant, Std IO, Operator
  • Part 3 - 03: Functions #1 - Calling (호출)
  • Part 4 - 04: Functions #2 - Local, Global Variable
  • Part 5 - This Post
  • Part 6 - 06: Functions #4 - Reference Variable vs. Pointer
  • Part 7 - 07: Functions #5 - CallbyValue, CallbyReference
  • Part 8 - 08: Selection and Repetition
  • Part 9 - 09: File Input & Output (파일입출력)
  • Part 10 - 10: String library, rand(), srand()
  • Part 11 - 11: Pointer, Function Pointer
  • Part 12 - 12: Array, Vector (정적배열, 동적배열)
  • Part 13 - 13: class, object
  • Part 14 - 14: this, operator overloading
  • Part 15 - 15: friend, static, destructor
  • Part 16 - 16: Inherence (상속)
  • Part 17 - 17: Static Binding, Dynamic Binding, Header File
  • Part 18 - 18: Generic Programming, Template
  • Part 19 - 19: List Container
  • Part 20 - 20: Iterator (반복자)
  • Part 21 - 21: algorithm Library
  • Part 22 - 21: functional, lambda function
  • Part 23 - 22: Exception handling
▼ 목록 보기

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 20factorial

6일 때, n-1 factorial 을 불러야 하므로 5 factorial 로 간다. 같은 방법으로 제약조건인 n==1 일 때까지 갔다가, 도착하면 순차적으로 값을 얻어와 최종 값을 반환한다.

스크린샷 2019-03-18 오후 11 53 57factorial 연산 과정

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 가 생각났다.그런데 애매하게 다른 점이 있는 것 같다. 구체적으로 어떤점이 다를까?