C++ 복습(4) - 함수와 참조

C++의 메모리 종류

C++에서, 프로그램 실행을 위한 메모리(RAM)의 영역은 다음과 같다.

  • Code
    • 프로그램 실행코드, 기계어
  • Data
    • 전역변수, 정적변수(static): 프로그램 시작시 할당, 종료시 소멸
  • Heap
    • 메모리 동적할당
  • Stack
    • 지역변수, 매개변수: 함수 호출시 할당, 함수 종료시 소멸

함수의 인자 전달 방식

  • 값에 의한 호출(call by value)
    • 함수를 호출하는 코드에서 넘어온 이 매개변수에 복사됨.
      call_by_val
  • 주소에 의한 호출(call by address)
    • 함수를 호출하는 코드에서 넘어온 주소값이 매개변수에 저장call_by_add

객체 치환 및 객체 리턴

  • 객체 치환
    • 동일한 클래스 타입의 객체끼리 치환 가능
    • 객체의 모든 데이터가 비트 단위로 복사
    • Circle c1(5);
      Circle c2(30);
      c1 = c2; // c2 객체를 c1 객체에 비트 단위 복사, c1의 반지름이 30이 됨
      // 치환된 두 객체는 내용물은 같지만 공간은 독립적임
      
  • 객체 리턴
    • Circle getCircle(){
          Circle tmp(30);
          return tmp; //객체 tmp 리턴
      }
      
      Circle c; // c의 반지름 1
      c = getCircle(); // tmp 객체의 복사본이 c에 치환, c의 반지름은 30이 됨
      

참조

참조 변수 선언

  • 참조자: &
  • 이미 존재하는 변수에 대해 다른 이름(별칭)을 선언
    • 이름만 다르게 부르며, 같은 메모리 공간을 가리킴

참조에 의한 호출(call by reference)

  • 참조를 가장 많이 활용하는 사례
  • 함수의 매개변수를 참조 타입(&)으로 선언
    • 즉, 함수의 매개변수를 참조 타입으로 받는다면, 함수를 호출하는 부분에서 넣어준 매개변수에 직접 접근해 바로 수정할 수 있게 해준다. call_by_ref

참조 리턴 C언어와 다르게 C++의 함수 리턴은

  • 값 외에 참조 리턴이 가능하다
  • 참조 리턴: 변수 등과 같이 현존하는 공간에 대해 참조 리턴

즉 , 참조 리턴은 함수에서 현존하는 공간의 별칭을 리턴한다고 볼 수 있다.
참조 리턴 함수의 예시는 아래와 같다.

char c = 'a';

char& find(){ // char 타입의 참조 리턴
    return c; // 변수 c에 대한 참조 리턴
}

char a = find(); // a = 'a'가 됨, a는 c변수의 복사본

char &ref = find(); // find()가 리턴한 공간에 'a' 문자 저장, ref는 c 변수를 참조하게 됨
ref = 'M' // c = 'M', ref를 통해 c 변수에 접근하여 그 값을 'M' 문자로 변경

find() = 'b'; // find() 함수 호출을 통해 반환된 참조를 통해 c = 'b'가 됨

사실 참조에 의한 호출 부분은 별로 안헷갈리는데, 참조 리턴 부분이 충분히 헷갈릴 수 있을 것 같다. 이에 주의하면서 복습해야겠다.

또 다른 간단한 참조 리턴 함수 예시

char& find(char s[], index) {
    return s[index];  
    // 배열 s의 index번째 공간에 대한 참조 리턴
}
int main() {
    char name[] = "Mike";
    cout << name << endl;

    find(name, 0) = 'S'; // name[0] = 'S'로 변경
    // name = "Sike
    cout << name << endl;

    char& ref = find(name, 2);  // 배열 name의 2번째 idx 공간을 ref라 별칭 붙임
    ref = 't' // name = "Site"
    cout << name << endl;
}