Call by [ ]
이 항목은 평가 전략(Evaluation Strategy ) 중의 하나로, '함수 인자에 무엇을 던지고, 어떻게 실행되는지' 에 대한 방법론입니다.
Actual Parameter | Formal Parameter
함수를 호출할 때 함수에게 전달되는 매개변수는 실제 매개변수actual parameter라고 불리고, argument라고도 쓰입니다.반면 함수가 선언될 때 사용되고, 호출시 actual parameter로부터 값을 받을 때 사용되는 매개변수는 형식 매개변수formal parameter라고 불리며, (function) parameter라고도 쓰입니다.
Formal Parameter = Parameter
Actual Parameter = Argument
Call by Reference | Call by Value
함수는 전달되는 매개변수의 타입에 따라 '참조에 의한 호출'과 '값에 의한 호출' 두 가지 방법으로 호출됩니다.
call by value : 값에 의한 호출
함수에 값에 의한 호출(call by value)이라 할 때, 실제 매개변수 actual parameter 의 값이 함수의 형식 매개변수 formal parameter 로 복사됩니다. 예를 들어 메모리 위치 0x01에 존재하는 actual parameter 의 값 x을 함수 호출 시 다른 주소 0x02에 복사하여 전달합니다. 이럴 경우 함수 내부에서 변경된 사항은 actual parameter(0x01에 존재하는 x)에 어떤 영향도 끼치지 않습니다.
함수가 호출될 때 stack frame이 생성되고, 이 내부에서 복사되어 전달받은 formal parameter은 local variable로서 사용됩니다. 함수가 종료될 때 해당 공간은 사라집니다.
call by referece: 참조에 의한 호출
참조에 의한 호출은 actaul parameter의 메모리 주소(참조, reference) 0x01이 foraml parameter로 전달됩니다. 함수 내부에서의 변경된 사항은 actual parameter 에 반영됩니다.
[ C ] call by reference? No, call by value
void swap(int* a, int* b) {
int temp = *a; // temp에 a가 가리키는 값을 저장
*a = *b; // a가 가리키는 위치에 b가 가리키는 값을 저장
*b = temp; //b가 가리키는 위치에 temp에 저장된 값을 저장
}
int main (void) {
int a = 10;
int b = 20;
printf("a: %d | b: %d", a, b); // a: 10 | b: 20
swap(&a, &b);
printf("a: %d | b: %d", a, b); // a : 20 | b: 10
return 0
}
위 코드는 call by reference를 설명할 때 자주 보이는 예제 코드로, swap에 a와 b의 메모리 주소를 전달하고, swap 함수에서 주소값을 포인터로 받아 메모리 위치에 있는 값을 복사하거나 저장하여 swap하는 코드입니다. 하지만 이는 실제로는 call by value이고, C는 call by reference를 직접 지원하지 않습니다. 변수의 메모리 주소를 포함하는 포인터를 함수의 매개변수로 전달하여 유사한 효과를 낸 것입니다.
&a와 &b는 actaul parameter로 주소 값을 의미하지만, 주소 참조 그 자체를 전달하는 것이 아닙니다.
int*a 와 int*b는 주소 값(0x01, 0x02)을 복사하여 swap함수에게 전달합니다. swap함수 내부에서, 전달받은 주소값을 사용하여 포인터로 원본 데이터에 영향을 주는 것 입니다. 포인터는 caller, 즉 main의 인수 a와 b를 직접 수정하는 것이 아니라 간접적으로 접근해 사용하는 방법입니다.
Call by Sharing : python, javascript
[ python ] Call by Object Reference
Objects : 파이썬의 모든 데이터는 객체 취급
파이썬은 모든 데이터가 객체로 취급됩니다.
불변 객체 Immutable objects | 가변 객체 Mutable objects
정수, 실수, 문자열, 튜플 등이 불변 객체이고, 이들은 함수의 매개변수로 전달할 때 call by value와 같이 새로운 객체를 만들어 이 객체를 참조합니다. 리스트, 딕셔너리, 집합 등이 가변 객체입니다. 이들을 함수의 매개변수로 전달할 때, 함수 내에서 전달받은 원본 객체의 참조를 공유하기 때문에 call by referecne 와 같이 원본 객체에도 변경 사항이 저장됩니다.
함수의 가변성 여부에 따라 함수 내부에서 객체의 참조를 다룰 수 있습니다.
Actually, call by object reference would be a better description, since if a mutable object is passed, the caller will see any changes the callee makes to it (items inserted into a list). | mutable한 객체가 전달될 때 호출자가 객체에 대한 변경 사항을 볼 수 있으므로 '객체 참조로 호출'이 더 나은 설명이 될 수 있다.
[ javascript ] call by sharing
Javasciprt에서 일부 자료형(string, numbers, booleans)를 제외한 나머지는 객체 취급을 받습니다.
Primitive data type | Object
string, number, boolean, null, undefined, symbol, bright 는 원시 데이터 타입, 나머지는 객체입니다.
파이썬과 유사한 방법으로, 원시 타입 데이터의 경우 call by value처럼 동작하고, 객체 타입의 경우 call by reference의 방식으로 동작합니다.
Reference
evaluation strategy
https://en.wikipedia.org/wiki/Evaluation_strategy#
call by reference, value
https://stackoverflow.com/questions/51054056/is-this-call-by-reference-or-by-value-in-c
https://velog.io/@kwontae1313/JS%EC%9D%98-Call-by-Value-%EC%99%80-Call-by-Reference
parameter, arguement
https://www.javatpoint.com/actual-and-formal-parameters-in-c
https://medium.com/@callmeryan/parameter-vs-argument-60b86961672
js
https://www.w3schools.com/js/js_object_definition.asp
\
'공부기록 > CS' 카테고리의 다른 글
[TIL][CS 기초] jpg, png, gif / 픽셀 | 유니코드 / UTF-8 (0) | 2024.03.27 |
---|---|
[TIL][CS 기초] CPU vs GPU | SSD, HDD (0) | 2024.03.11 |
[TIL][CS 기초] 32 Bit vs 64 Bit | 2's complement, 1's complement | 실수 표현법 (0) | 2024.03.07 |
[TIL][Fri][CSAPP] ch 6. The memory hierachy (0) | 2023.11.10 |
[TIL][CS기초] Compile | Compiler, Interpreter | Type System | Typing :: Static & Dynamic (0) | 2023.11.01 |