23.09.22 Call by reference
Call by reference
함수 호출 방식 중 하나로, 함수에 변수를 전달할 때 메모리 상의 해당 변수의 주소를 전달하는 방법을 의미합니다. 이로 인해 함수 내에서 해당 변수의 값을 변경하면, 이 변경은 원래의 변수에도 반영됩니다. 즉, 원본 변수와 함수 내의 매개변수는 동일한 메모리 주소를 참조하게 됩니다.
Call by reference의 특징:
- 변수의 주소 전달: 함수를 호출할 때 변수의 실제 메모리 주소가 전달됩니다.
- 원본 데이터 수정: 함수 내에서 매개변수를 변경하면, 이 변경은 원본 변수에도 반영됩니다.
- 메모리 효율: 데이터의 복사본을 만들지 않기 때문에 큰 데이터 구조를 전달할 때 메모리 사용이 효율적입니다.
- 주의 사항: 함수 내에서 매개변수의 값을 변경하면 원본 데이터도 변경되므로 실수로 원본 데이터를 손상시킬 위험이 있습니다.
예제:
C++에서는 참조를 사용하여 call by reference 방식을 구현할 수 있습니다.
cppCopy code
#include <iostream>using namespace std;
void modifyValue(int &ref) { // ref는 원래 변수의 참조입니다.
ref += 50; // 원래 변수의 값을 수정합니다.
}
int main() {
int num = 100;
modifyValue(num);
cout << num; // 출력: 150
return 0;
}
위의 예제에서, modifyValue 함수는 정수의 참조를 매개변수로 받습니다. 따라서, 함수 내에서 ref를 수정하면 main 함수의 num 변수도 수정됩니다.
Call by reference와 Call by value:
두 호출 방식의 주요 차이는 전달되는 데이터의 복사본을 만드는지, 아니면 원본의 참조나 주소를 전달하는지에 있습니다.
- Call by value: 함수에 변수의 값을 전달할 때 값의 복사본을 생성하여 전달합니다. 따라서, 함수 내에서 매개변수의 값을 변경해도 원본 변수에는 영향을 미치지 않습니다.
- Call by reference: 함수에 변수를 전달할 때 변수의 주소 또는 참조를 전달합니다. 따라서, 함수 내에서 매개변수의 값을 변경하면 원본 변수에도 변경이 반영됩니다.
즉, 매개변수로 전달될 때 원본을 그래도 전달하냐 혹은 복사본을 만들어서 복사본을 전달하냐의 차이인 것 같다.
C++은 잘 몰라서 JS로 찾아봤다.
JavaScript는 순수한 형태의 "call by reference"를 지원하지 않습니다. 하지만 객체와 배열과 같은 참조 타입을 함수에 전달할 때, 이 참조 타입의 참조(즉, 메모리 주소)가 전달됩니다. 따라서 함수 내에서 객체나 배열의 속성이나 요소를 수정하면, 원본 객체나 배열에도 그 변경이 반영됩니다.
아래는 JavaScript를 사용한 예제입니다:
javascriptCopy code
function modifyObject(obj) {
obj.value += 50;
}
let myObj = {
value: 100
};
modifyObject(myObj);
console.log(myObj.value); // 출력: 150
이 예제에서 modifyObject 함수는 객체의 참조를 매개변수로 받습니다. 따라서, 함수 내에서 obj의 value 속성을 수정하면 myObj의 value 속성도 동일하게 수정됩니다.
하지만 객체의 참조 자체를 바꾸려고 하면 원본 객체에는 영향을 미치지 않습니다:
javascriptCopy code
function replaceObject(obj) {
obj = { value: 500 }; // 새로운 객체를 생성합니다.
}
let myObj = {
value: 100
};
replaceObject(myObj);
console.log(myObj.value); // 출력: 100 (변경되지 않음)
위의 예제에서 replaceObject 함수 내에서 obj의 참조는 새로운 객체로 변경되지만, 이 변경은 myObj에 영향을 미치지 않습니다.
매개변수로 주어진 객체의 속성을 변경하면 원본 객체에도 영향을 준다. 하지만 매개변수로 주어진 객체 자체를 다른 객체로 바꾸려고 하면 원본 객체에는 영향이 가지 않는다.