C++ 복습(4) - 함수와 참조
C++의 메모리 종류
C++에서, 프로그램 실행을 위한 메모리(RAM)의 영역은 다음과 같다.
- Code
- 프로그램 실행코드, 기계어
- Data
- 전역변수, 정적변수(static): 프로그램 시작시 할당, 종료시 소멸
- Heap
- 메모리 동적할당
- Stack
- 지역변수, 매개변수: 함수 호출시 할당, 함수 종료시 소멸
함수의 인자 전달 방식
- 값에 의한 호출(call by value)
- 함수를 호출하는 코드에서 넘어온 값이 매개변수에 복사됨.
- 함수를 호출하는 코드에서 넘어온 값이 매개변수에 복사됨.
- 주소에 의한 호출(call by address)
- 함수를 호출하는 코드에서 넘어온 주소값이 매개변수에 저장됨
- 함수를 호출하는 코드에서 넘어온 주소값이 매개변수에 저장됨
객체 치환 및 객체 리턴
- 객체 치환
- 동일한 클래스 타입의 객체끼리 치환 가능
- 객체의 모든 데이터가 비트 단위로 복사
-
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)
- 참조를 가장 많이 활용하는 사례
- 함수의 매개변수를 참조 타입(&)으로 선언
- 즉, 함수의 매개변수를 참조 타입으로 받는다면, 함수를 호출하는 부분에서 넣어준 매개변수에 직접 접근해 바로 수정할 수 있게 해준다.
- 즉, 함수의 매개변수를 참조 타입으로 받는다면, 함수를 호출하는 부분에서 넣어준 매개변수에 직접 접근해 바로 수정할 수 있게 해준다.
참조 리턴 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;
}